diff --git a/DEPS b/DEPS
index bcd6ca69..97b4f95 100644
--- a/DEPS
+++ b/DEPS
@@ -144,11 +144,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': '829144cc76fe7c4e80cc7d6498ff895a0bddbb62',
+  'skia_revision': '3ae30cc2e6e071b7cd7bf534f8e5cbae23850120',
   # 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': '4035531228d69a8e3ec475ef75b51db302e70473',
+  'v8_revision': '098b545fc1c331d28bec0b370035f13f3794264e',
   # 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.
@@ -207,7 +207,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': '5f7b2c2ad2f211c00516d4a44787c754f3acf52c',
+  'catapult_revision': '9f89d086a26b042b2b658724b11e57a49e873c7e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -279,7 +279,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '68d97adf88de11cd9c5b9e2f9a77d50ab985ede4',
+  'dawn_revision': '8944f0205b04fa5fe396e6f5e4c9298370f96acb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -808,7 +808,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '1a62d1623e3bfe81f9f26030e700e82d34a72d81',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '1fee49ba988e67e262995f7e992d4e131027abbc',
       'condition': 'checkout_linux',
   },
 
@@ -993,7 +993,7 @@
     Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '3874188bd69fe67a825d07584c74451e45063e95',
 
   'src/third_party/icu':
-    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'fd97d4326fac6da84452b2d5fe75ff0949368dab',
+    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '682a230923933a7157a41b88c7804b6b7d2abdfa',
 
   'src/third_party/icu4j': {
       'packages': [
@@ -1206,7 +1206,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '67440068b934743e5e84909f0c29089ab610a5d3',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'fd3e53d52cec40a2ed8b6aa0181df74eb19cb257',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1415,7 +1415,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6d863b5a5eadaacda2ad565d40381c2ab5efc334',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@93c16af35dfb48909e70d6f527b7209c12a47e68',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 9736ebf..fe8fb86 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -523,6 +523,7 @@
       ),
       True,
       (
+        r"^ui[\\/]events[\\/]x[\\/].*\.cc$",
         r"^ui[\\/]gl[\\/].*\.cc$",
         r"^media[\\/]gpu[\\/].*\.cc$",
         r"^gpu[\\/].*\.cc$",
diff --git a/WATCHLISTS b/WATCHLISTS
index f6cad25..498ce1ec 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -999,9 +999,6 @@
     'gn': {
       'filepath': 'tools/gn',
     },
-    'gpu': {
-      'filepath': 'gpu/',
-    },
     'gpu_passthrough_cmd_decoder': {
       'filepath': 'gpu/command_buffer/service/.*passthrough',
     },
@@ -1971,8 +1968,7 @@
              'sadrul@chromium.org'],
     'aura_compositor': ['danakj+watch@chromium.org',
                         'jbauman+watch@chromium.org',
-                        'kalyan.kondapally@intel.com',
-                        'piman+watch@chromium.org'],
+                        'kalyan.kondapally@intel.com'],
     'autoclick': ['katie+watch@chromium.org'],
     'autofill': ['anthonyvd+autofillwatch@chromium.org',
                  'ftirelo+autofillwatch@chromium.org',
@@ -2167,8 +2163,7 @@
                   'mdjones+watch@chromium.org'],
     'breve': ['breve-team-reviews@chromium.org'],
     'browser_components': ['browser-components-watch@chromium.org'],
-    'browser_compositor': ['piman+watch@chromium.org',
-                           'vollick@chromium.org'],
+    'browser_compositor': ['vollick@chromium.org'],
     'browser_resources_md': ['michaelpg+watch-md-ui@chromium.org'],
     'browser_scheduler': ['scheduler-bugs+browser@chromium.org'],
     'browsing_data': ['dullweber+watch@chromium.org',
@@ -2338,7 +2333,6 @@
     'gfx_image': ['rsesek+watch@chromium.org'],
     'gn': ['agrieve+watch@chromium.org',
            'dpranke@chromium.org'],
-    'gpu': ['piman+watch@chromium.org'],
     'gpu_passthrough_cmd_decoder': ['geofflang+watch@chromium.org'],
     'guest_view': ['ekaramad@chromium.org',
                    'mcnee@chromium.org',
@@ -2491,7 +2485,6 @@
     'pepper_api': ['binji+watch@chromium.org',
                    'bradnelson+warch@chromium.org',
                    'ihf+watch@chromium.org',
-                   'piman+watch@chromium.org',
                    'teravest+watch@chromium.org',
                    'yusukes+watch@chromium.org'],
     'permissions': ['dominickn+watch-permissions@chromium.org',
diff --git a/ash/assistant/assistant_interaction_controller.cc b/ash/assistant/assistant_interaction_controller.cc
index 0a8caf4..fb3d12f 100644
--- a/ash/assistant/assistant_interaction_controller.cc
+++ b/ash/assistant/assistant_interaction_controller.cc
@@ -8,6 +8,7 @@
 
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/assistant_prefs_controller.h"
 #include "ash/assistant/assistant_screen_context_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/assistant/model/assistant_interaction_model_observer.h"
@@ -21,8 +22,6 @@
 #include "ash/assistant/util/histogram_util.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/ash_pref_names.h"
-#include "ash/public/cpp/voice_interaction_controller.h"
-#include "ash/public/interfaces/voice_interaction_controller.mojom.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -702,7 +701,8 @@
             assistant_controller_->ui_controller()->model()->visibility());
 
   const bool launch_with_mic_open =
-      VoiceInteractionController::Get()->launch_with_mic_open();
+      assistant_controller_->prefs_controller()->prefs()->GetBoolean(
+          chromeos::assistant::prefs::kAssistantLaunchWithMicOpen);
   const bool prefer_voice = launch_with_mic_open || IsTabletMode();
 
   // We don't explicitly start a new voice interaction if the entry point
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc
index 1e32def2..572d6433 100644
--- a/ash/assistant/assistant_notification_controller.cc
+++ b/ash/assistant/assistant_notification_controller.cc
@@ -9,11 +9,10 @@
 
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_notification_expiry_monitor.h"
+#include "ash/assistant/assistant_prefs_controller.h"
 #include "ash/assistant/util/deep_link_util.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
-#include "ash/public/cpp/voice_interaction_controller.h"
-#include "ash/public/interfaces/voice_interaction_controller.mojom.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/strings/utf_string_conversions.h"
@@ -206,8 +205,10 @@
 void AssistantNotificationController::OnNotificationAdded(
     const AssistantNotification* notification) {
   // Do not show system notifications if the setting is disabled.
-  if (!VoiceInteractionController::Get()->notification_enabled())
+  if (!assistant_controller_->prefs_controller()->prefs()->GetBoolean(
+          chromeos::assistant::prefs::kAssistantNotificationEnabled)) {
     return;
+  }
 
   // We only show system notifications in the Message Center.
   if (!IsSystemNotification(notification))
@@ -220,8 +221,10 @@
 void AssistantNotificationController::OnNotificationUpdated(
     const AssistantNotification* notification) {
   // Do not show system notifications if the setting is disabled.
-  if (!VoiceInteractionController::Get()->notification_enabled())
+  if (!assistant_controller_->prefs_controller()->prefs()->GetBoolean(
+          chromeos::assistant::prefs::kAssistantNotificationEnabled)) {
     return;
+  }
 
   // If the notification that was updated is *not* a system notification, we
   // need to ensure that it is removed from the Message Center (given that it
diff --git a/ash/assistant/assistant_view_delegate_impl.cc b/ash/assistant/assistant_view_delegate_impl.cc
index 79163e2a..3cfdd3b75 100644
--- a/ash/assistant/assistant_view_delegate_impl.cc
+++ b/ash/assistant/assistant_view_delegate_impl.cc
@@ -10,7 +10,6 @@
 #include "ash/assistant/assistant_interaction_controller.h"
 #include "ash/assistant/assistant_notification_controller.h"
 #include "ash/assistant/assistant_prefs_controller.h"
-#include "ash/public/cpp/voice_interaction_controller.h"
 #include "ash/shell.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 
@@ -131,7 +130,8 @@
 }
 
 bool AssistantViewDelegateImpl::IsLaunchWithMicOpen() const {
-  return VoiceInteractionController::Get()->launch_with_mic_open();
+  return assistant_controller_->prefs_controller()->prefs()->GetBoolean(
+      chromeos::assistant::prefs::kAssistantLaunchWithMicOpen);
 }
 
 bool AssistantViewDelegateImpl::IsTabletMode() const {
diff --git a/ash/public/cpp/assistant/assistant_state_base.h b/ash/public/cpp/assistant/assistant_state_base.h
index d53ba422..f9352856 100644
--- a/ash/public/cpp/assistant/assistant_state_base.h
+++ b/ash/public/cpp/assistant/assistant_state_base.h
@@ -39,10 +39,6 @@
     return hotword_enabled_;
   }
 
-  const base::Optional<bool>& hotword_always_on() const {
-    return hotword_always_on_;
-  }
-
   const base::Optional<mojom::AssistantAllowedState>& allowed_state() const {
     return allowed_state_;
   }
@@ -71,10 +67,6 @@
   // Whether hotword listening is enabled.
   base::Optional<bool> hotword_enabled_;
 
-  // Whether hotword listening is always on/only with power source. nullopt
-  // if the data is not available yet.
-  base::Optional<bool> hotword_always_on_;
-
   // Whether voice interaction feature is allowed or disallowed for what reason.
   // nullopt if the data is not available yet.
   base::Optional<mojom::AssistantAllowedState> allowed_state_;
diff --git a/ash/public/cpp/assistant/assistant_state_proxy.cc b/ash/public/cpp/assistant/assistant_state_proxy.cc
index eeaf166..289aff7 100644
--- a/ash/public/cpp/assistant/assistant_state_proxy.cc
+++ b/ash/public/cpp/assistant/assistant_state_proxy.cc
@@ -35,8 +35,6 @@
     observer->OnVoiceInteractionContextEnabled(context_enabled_.value());
   if (hotword_enabled_.has_value())
     observer->OnVoiceInteractionHotwordEnabled(hotword_enabled_.value());
-  if (hotword_always_on_.has_value())
-    observer->OnVoiceInteractionHotwordAlwaysOn(hotword_always_on_.value());
   if (allowed_state_.has_value())
     observer->OnAssistantFeatureAllowedChanged(allowed_state_.value());
   if (locale_.has_value())
@@ -77,12 +75,6 @@
     observer.OnVoiceInteractionHotwordEnabled(hotword_enabled_.value());
 }
 
-void AssistantStateProxy::OnVoiceInteractionHotwordAlwaysOn(bool always_on) {
-  hotword_always_on_ = always_on;
-  for (auto& observer : observers_)
-    observer.OnVoiceInteractionHotwordAlwaysOn(hotword_always_on_.value());
-}
-
 void AssistantStateProxy::OnAssistantFeatureAllowedChanged(
     ash::mojom::AssistantAllowedState state) {
   allowed_state_ = state;
diff --git a/ash/public/cpp/assistant/assistant_state_proxy.h b/ash/public/cpp/assistant/assistant_state_proxy.h
index 4bcda23..fc18b9f 100644
--- a/ash/public/cpp/assistant/assistant_state_proxy.h
+++ b/ash/public/cpp/assistant/assistant_state_proxy.h
@@ -44,7 +44,6 @@
   void OnVoiceInteractionSettingsEnabled(bool enabled) override;
   void OnVoiceInteractionContextEnabled(bool enabled) override;
   void OnVoiceInteractionHotwordEnabled(bool enabled) override;
-  void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override;
   void OnAssistantFeatureAllowedChanged(
       mojom::AssistantAllowedState state) override;
   void OnLocaleChanged(const std::string& locale) override;
diff --git a/ash/public/cpp/assistant/default_voice_interaction_observer.h b/ash/public/cpp/assistant/default_voice_interaction_observer.h
index 83eedb9..f49a5d61 100644
--- a/ash/public/cpp/assistant/default_voice_interaction_observer.h
+++ b/ash/public/cpp/assistant/default_voice_interaction_observer.h
@@ -28,7 +28,6 @@
   void OnVoiceInteractionSettingsEnabled(bool enabled) override {}
   void OnVoiceInteractionContextEnabled(bool enabled) override {}
   void OnVoiceInteractionHotwordEnabled(bool enabled) override {}
-  void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override {}
   void OnAssistantFeatureAllowedChanged(
       ash::mojom::AssistantAllowedState state) override {}
   void OnLocaleChanged(const std::string& locale) override {}
diff --git a/ash/public/cpp/new_window_delegate.h b/ash/public/cpp/new_window_delegate.h
index ae4bf4e5..d236e5b 100644
--- a/ash/public/cpp/new_window_delegate.h
+++ b/ash/public/cpp/new_window_delegate.h
@@ -5,6 +5,8 @@
 #ifndef ASH_PUBLIC_CPP_NEW_WINDOW_DELEGATE_H_
 #define ASH_PUBLIC_CPP_NEW_WINDOW_DELEGATE_H_
 
+#include <string>
+
 #include "ash/public/cpp/ash_public_export.h"
 #include "base/macros.h"
 
@@ -51,6 +53,10 @@
   // true then the page is triggered from Assistant.
   virtual void OpenFeedbackPage(bool from_assistant = false) = 0;
 
+  // Launches the camera app from Android camera intent with the intent
+  // information as url |queries|.
+  virtual void LaunchCameraApp(const std::string& queries) = 0;
+
  protected:
   NewWindowDelegate();
   virtual ~NewWindowDelegate();
diff --git a/ash/public/cpp/test/test_new_window_delegate.cc b/ash/public/cpp/test/test_new_window_delegate.cc
index 8704e19e..6e5c5852 100644
--- a/ash/public/cpp/test/test_new_window_delegate.cc
+++ b/ash/public/cpp/test/test_new_window_delegate.cc
@@ -20,5 +20,6 @@
 void TestNewWindowDelegate::ShowKeyboardShortcutViewer() {}
 void TestNewWindowDelegate::ShowTaskManager() {}
 void TestNewWindowDelegate::OpenFeedbackPage(bool from_assistant) {}
+void TestNewWindowDelegate::LaunchCameraApp(const std::string& queries) {}
 
 }  // namespace ash
diff --git a/ash/public/cpp/test/test_new_window_delegate.h b/ash/public/cpp/test/test_new_window_delegate.h
index 96d6365..31f77df 100644
--- a/ash/public/cpp/test/test_new_window_delegate.h
+++ b/ash/public/cpp/test/test_new_window_delegate.h
@@ -28,6 +28,7 @@
   void ShowKeyboardShortcutViewer() override;
   void ShowTaskManager() override;
   void OpenFeedbackPage(bool from_assistant) override;
+  void LaunchCameraApp(const std::string& queries) override;
 
   DISALLOW_COPY_AND_ASSIGN(TestNewWindowDelegate);
 };
diff --git a/ash/public/cpp/voice_interaction_controller.cc b/ash/public/cpp/voice_interaction_controller.cc
index a924a8b..4e4d8c3d 100644
--- a/ash/public/cpp/voice_interaction_controller.cc
+++ b/ash/public/cpp/voice_interaction_controller.cc
@@ -84,18 +84,6 @@
     observer.OnVoiceInteractionHotwordEnabled(enabled);
 }
 
-void VoiceInteractionController::NotifyHotwordAlwaysOn(bool always_on) {
-  if (hotword_always_on_.has_value() && hotword_always_on_.value() == always_on)
-    return;
-
-  hotword_always_on_ = always_on;
-  observers_.ForAllPtrs([always_on](auto* observer) {
-    observer->OnVoiceInteractionHotwordAlwaysOn(always_on);
-  });
-  for (auto& observer : local_observers_)
-    observer.OnVoiceInteractionHotwordAlwaysOn(always_on);
-}
-
 void VoiceInteractionController::NotifyFeatureAllowed(
     mojom::AssistantAllowedState state) {
   if (allowed_state_ == state)
@@ -109,10 +97,6 @@
     observer.OnAssistantFeatureAllowedChanged(state);
 }
 
-void VoiceInteractionController::NotifyNotificationEnabled(bool enabled) {
-  notification_enabled_ = enabled;
-}
-
 void VoiceInteractionController::NotifyLocaleChanged(
     const std::string& locale) {
   if (locale_ == locale)
@@ -125,11 +109,6 @@
     observer.OnLocaleChanged(locale);
 }
 
-void VoiceInteractionController::NotifyLaunchWithMicOpen(
-    bool launch_with_mic_open) {
-  launch_with_mic_open_ = launch_with_mic_open;
-}
-
 void VoiceInteractionController::NotifyArcPlayStoreEnabledChanged(
     bool enabled) {
   if (arc_play_store_enabled_ == enabled)
@@ -185,8 +164,6 @@
     observer->OnVoiceInteractionContextEnabled(context_enabled_.value());
   if (hotword_enabled_.has_value())
     observer->OnVoiceInteractionHotwordEnabled(hotword_enabled_.value());
-  if (hotword_always_on_.has_value())
-    observer->OnVoiceInteractionHotwordAlwaysOn(hotword_always_on_.value());
   if (allowed_state_.has_value())
     observer->OnAssistantFeatureAllowedChanged(allowed_state_.value());
   if (locale_.has_value())
diff --git a/ash/public/cpp/voice_interaction_controller.h b/ash/public/cpp/voice_interaction_controller.h
index e66b479..29a5030 100644
--- a/ash/public/cpp/voice_interaction_controller.h
+++ b/ash/public/cpp/voice_interaction_controller.h
@@ -42,22 +42,13 @@
   // Called when the hotword listening is enabled/disabled.
   virtual void NotifyHotwordEnabled(bool enabled);
 
-  // Called when the hotword is set to always on/only with power source.
-  virtual void NotifyHotwordAlwaysOn(bool always_on);
-
   // Notify if voice interaction feature is allowed or not. e.g. not allowed
   // if disabled by policy.
   virtual void NotifyFeatureAllowed(mojom::AssistantAllowedState state);
 
-  // Called when the notification is enabled/disabled.
-  virtual void NotifyNotificationEnabled(bool enabled);
-
   // Called when the locale is changed.
   virtual void NotifyLocaleChanged(const std::string& locale);
 
-  // Called when the launch with mic open state is changed.
-  virtual void NotifyLaunchWithMicOpen(bool launch_with_mic_open);
-
   // Called when Google Play Store is enabled/disabled.
   virtual void NotifyArcPlayStoreEnabledChanged(bool enabled);
 
@@ -72,19 +63,9 @@
   void RemoveLocalObserver(DefaultVoiceInteractionObserver* observer);
   void InitObserver(mojom::VoiceInteractionObserver* observer);
 
-  bool notification_enabled() const { return notification_enabled_; }
-
-  bool launch_with_mic_open() const { return launch_with_mic_open_; }
-
   void FlushForTesting();
 
  private:
-  // Whether notification is enabled.
-  bool notification_enabled_ = false;
-
-  // Whether the Assistant should launch with mic open;
-  bool launch_with_mic_open_ = false;
-
   mojo::BindingSet<mojom::VoiceInteractionController> bindings_;
 
   mojo::InterfacePtrSet<mojom::VoiceInteractionObserver> observers_;
diff --git a/ash/public/cpp/voice_interaction_controller_unittest.cc b/ash/public/cpp/voice_interaction_controller_unittest.cc
index dbb6d345..824a0bc 100644
--- a/ash/public/cpp/voice_interaction_controller_unittest.cc
+++ b/ash/public/cpp/voice_interaction_controller_unittest.cc
@@ -32,9 +32,6 @@
   void OnVoiceInteractionContextEnabled(bool enabled) override {
     context_enabled_ = enabled;
   }
-  void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override {
-    hotword_always_on_ = always_on;
-  }
   void OnVoiceInteractionHotwordEnabled(bool enabled) override {
     hotword_enabled_ = enabled;
   }
@@ -51,7 +48,6 @@
   }
   bool settings_enabled() const { return settings_enabled_; }
   bool context_enabled() const { return context_enabled_; }
-  bool hotword_always_on() const { return hotword_always_on_; }
   bool hotword_enabled() const { return hotword_enabled_; }
   bool arc_play_store_enabled() const { return arc_play_store_enabled_; }
 
@@ -65,7 +61,6 @@
   mojom::VoiceInteractionState state_ = mojom::VoiceInteractionState::STOPPED;
   bool settings_enabled_ = false;
   bool context_enabled_ = false;
-  bool hotword_always_on_ = false;
   bool hotword_enabled_ = false;
   bool arc_play_store_enabled_ = false;
 
@@ -132,13 +127,6 @@
   EXPECT_TRUE(observer()->context_enabled());
 }
 
-TEST_F(VoiceInteractionControllerTest, NotifyHotwordAlwaysOn) {
-  controller()->NotifyHotwordAlwaysOn(true);
-  controller()->FlushForTesting();
-  // The observers should be notified.
-  EXPECT_TRUE(observer()->hotword_always_on());
-}
-
 TEST_F(VoiceInteractionControllerTest, NotifyHotwordEnabled) {
   controller()->NotifyHotwordEnabled(true);
   controller()->FlushForTesting();
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom
index e3be921..dd8daa3 100644
--- a/ash/public/interfaces/voice_interaction_controller.mojom
+++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -62,9 +62,6 @@
   // Called when hotword listening is enabled/disabled.
   OnVoiceInteractionHotwordEnabled(bool enabled);
 
-  // Called when hotword is set to always on/only with power source.
-  OnVoiceInteractionHotwordAlwaysOn(bool always_on);
-
   // Called when assistant feature allowed state has changed.
   OnAssistantFeatureAllowedChanged(AssistantAllowedState state);
 
diff --git a/ash/shell/content/client/shell_new_window_delegate.cc b/ash/shell/content/client/shell_new_window_delegate.cc
index c4d97442..d6a93b0 100644
--- a/ash/shell/content/client/shell_new_window_delegate.cc
+++ b/ash/shell/content/client/shell_new_window_delegate.cc
@@ -48,5 +48,7 @@
 
 void ShellNewWindowDelegate::OpenFeedbackPage(bool from_assistant) {}
 
+void ShellNewWindowDelegate::LaunchCameraApp(const std::string& queries) {}
+
 }  // namespace shell
 }  // namespace ash
diff --git a/ash/shell/content/client/shell_new_window_delegate.h b/ash/shell/content/client/shell_new_window_delegate.h
index c61a3be..59b06e7 100644
--- a/ash/shell/content/client/shell_new_window_delegate.h
+++ b/ash/shell/content/client/shell_new_window_delegate.h
@@ -32,6 +32,7 @@
   void ShowKeyboardShortcutViewer() override;
   void ShowTaskManager() override;
   void OpenFeedbackPage(bool from_assistant) override;
+  void LaunchCameraApp(const std::string& queries) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ShellNewWindowDelegate);
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index e9d9ae3..d58a46b 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -193,7 +193,8 @@
 }
 
 void UnifiedSystemTray::ShowAudioDetailedViewBubble() {
-  ShowBubble(false /* show_by_click */);
+  // The settings menu bubble gains focus when |show_by_click| is true.
+  ShowBubble(true /* show_by_click */);
   bubble_->ShowAudioDetailedView();
 }
 
diff --git a/base/android/java/src/org/chromium/base/Log.java b/base/android/java/src/org/chromium/base/Log.java
index 399f16d..6711bc43 100644
--- a/base/android/java/src/org/chromium/base/Log.java
+++ b/base/android/java/src/org/chromium/base/Log.java
@@ -87,6 +87,7 @@
      * Note: Has no effect on whether logs are sent or not. Use a method with
      * {@link RemovableInRelease} to log something in Debug builds only.
      */
+    @RemovableInRelease
     public static boolean isLoggable(String tag, int level) {
         return android.util.Log.isLoggable(tag, level);
     }
@@ -105,6 +106,7 @@
      * @param args Arguments referenced by the format specifiers in the format string. If the last
      *             one is a {@link Throwable}, its trace will be printed.
      */
+    @RemovableInRelease
     private static void verbose(String tag, String messageTemplate, Object... args) {
         String message = formatLogWithStack(messageTemplate, args);
         Throwable tr = getThrowableToLog(args);
@@ -190,6 +192,7 @@
      * @param args Arguments referenced by the format specifiers in the format string. If the last
      *             one is a {@link Throwable}, its trace will be printed.
      */
+    @RemovableInRelease
     private static void debug(String tag, String messageTemplate, Object... args) {
         String message = formatLogWithStack(messageTemplate, args);
         Throwable tr = getThrowableToLog(args);
@@ -362,6 +365,7 @@
     }
 
     /** Returns a string form of the origin of the log call, to be used as secondary tag.*/
+    @RemovableInRelease
     private static String getCallOrigin() {
         StackTraceElement[] st = Thread.currentThread().getStackTrace();
 
diff --git a/base/android/proguard/chromium_apk.flags b/base/android/proguard/chromium_apk.flags
index 354a887d..d2e53ba3 100644
--- a/base/android/proguard/chromium_apk.flags
+++ b/base/android/proguard/chromium_apk.flags
@@ -48,13 +48,6 @@
   static *** v(...);
   static *** isLoggable(...);
 }
--checkdiscard class org.chromium.base.Log {
-  public static void d(...);
-  public static void v(...);
-  private static void debug(...);
-  private static void verbose(...);
-  private static String getCallOrigin(...);
-}
 
 # The following chart was created on July 20, 2016, to decide on 3 optimization
 # passes for Chrome.
diff --git a/base/android/proguard/chromium_code.flags b/base/android/proguard/chromium_code.flags
index ab2821f5..ec20b8a 100644
--- a/base/android/proguard/chromium_code.flags
+++ b/base/android/proguard/chromium_code.flags
@@ -42,10 +42,15 @@
   native <methods>;
 }
 
-# Remove methods annotated with this if their return value is unused.
+# Remove methods with this annotation. Methods generally need to be void, or
+# have unused return values in order to be removed. Compiles will fail if any
+# such method was not able to be safely removed.
 -assumenosideeffects class ** {
   @org.chromium.base.annotations.RemovableInRelease <methods>;
 }
+-checkdiscard class ** {
+  @org.chromium.base.annotations.RemovableInRelease <methods>;
+}
 
 # Never inline classes or methods with this annotation, but allow shrinking and
 # obfuscation.
diff --git a/base/memory/weak_ptr.cc b/base/memory/weak_ptr.cc
index 64fd499..0efcc44 100644
--- a/base/memory/weak_ptr.cc
+++ b/base/memory/weak_ptr.cc
@@ -46,7 +46,7 @@
 
 WeakReference::~WeakReference() = default;
 
-WeakReference::WeakReference(WeakReference&& other) = default;
+WeakReference::WeakReference(WeakReference&& other) noexcept = default;
 
 WeakReference::WeakReference(const WeakReference& other) = default;
 
diff --git a/base/memory/weak_ptr.h b/base/memory/weak_ptr.h
index 72b5f1f..ccd22fd13 100644
--- a/base/memory/weak_ptr.h
+++ b/base/memory/weak_ptr.h
@@ -116,9 +116,9 @@
   explicit WeakReference(const scoped_refptr<Flag>& flag);
   ~WeakReference();
 
-  WeakReference(WeakReference&& other);
+  WeakReference(WeakReference&& other) noexcept;
   WeakReference(const WeakReference& other);
-  WeakReference& operator=(WeakReference&& other) = default;
+  WeakReference& operator=(WeakReference&& other) noexcept = default;
   WeakReference& operator=(const WeakReference& other) = default;
 
   bool IsValid() const;
@@ -153,9 +153,9 @@
   ~WeakPtrBase();
 
   WeakPtrBase(const WeakPtrBase& other) = default;
-  WeakPtrBase(WeakPtrBase&& other) = default;
+  WeakPtrBase(WeakPtrBase&& other) noexcept = default;
   WeakPtrBase& operator=(const WeakPtrBase& other) = default;
-  WeakPtrBase& operator=(WeakPtrBase&& other) = default;
+  WeakPtrBase& operator=(WeakPtrBase&& other) noexcept = default;
 
   void reset() {
     ref_ = internal::WeakReference();
@@ -236,7 +236,7 @@
     ptr_ = reinterpret_cast<uintptr_t>(t);
   }
   template <typename U>
-  WeakPtr(WeakPtr<U>&& other) : WeakPtrBase(std::move(other)) {
+  WeakPtr(WeakPtr<U>&& other) noexcept : WeakPtrBase(std::move(other)) {
     // Need to cast from U* to T* to do pointer adjustment in case of multiple
     // inheritance. This also enforces the "U is a T" rule.
     T* t = reinterpret_cast<U*>(other.ptr_);
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index bdc6462..1005a17 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8907128039086305440
\ No newline at end of file
+8907102379238362000
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 77d0db30..4907cd45 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8907132289784850704
\ No newline at end of file
+8907101189391279168
\ No newline at end of file
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
index dded3d9c..c4002572 100644
--- a/build/whitespace_file.txt
+++ b/build/whitespace_file.txt
@@ -175,3 +175,5 @@
 
 SECRET ENDING: IT WAS _____ ALL ALONG!
 testing trailing line.
+
+So many books, so little time.
diff --git a/chrome/OWNERS b/chrome/OWNERS
index e5f0451b..0f0021a 100644
--- a/chrome/OWNERS
+++ b/chrome/OWNERS
@@ -24,3 +24,5 @@
 per-file VERSION=anantha@chromium.org
 per-file VERSION=govind@chromium.org
 per-file VERSION=mmoss@chromium.org
+# COMPONENT: Build
+# TEAM: chromium-reviews@chromium.org
diff --git a/chrome/VERSION b/chrome/VERSION
index a8f6692..a099c31f 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=77
 MINOR=0
-BUILD=3863
+BUILD=3864
 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
index c438e5e..cc28b32 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantAutostartTest.java
@@ -4,14 +4,13 @@
 
 package org.chromium.chrome.browser.autofill_assistant;
 
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
 import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static android.support.test.espresso.matcher.ViewMatchers.withText;
 
+import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
+
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
-import android.view.View;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -19,8 +18,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.FlakyTest;
-import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
@@ -31,8 +28,6 @@
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.content_public.browser.test.util.Criteria;
-import org.chromium.content_public.browser.test.util.CriteriaHelper;
 
 import java.util.Collections;
 
@@ -55,7 +50,6 @@
      */
     @Test
     @MediumTest
-    @FlakyTest(message = "crbug.com/986026")
     public void testAutostart() throws Exception {
         AutofillAssistantTestScript script = new AutofillAssistantTestScript(
                 SupportedScriptProto.newBuilder()
@@ -85,15 +79,6 @@
                                 "http://www.example.com")
                         .putExtra("org.chromium.chrome.browser.autofill_assistant.ENABLED", true));
 
-        // Wait until autofill assistant is visible on screen.
-        CriteriaHelper.pollUiThread(new Criteria("Autofill Assistant never started.") {
-            @Override
-            public boolean isSatisfied() {
-                View view = mTestRule.getActivity().findViewById(R.id.autofill_assistant);
-                return view != null && view.getHeight() > 0 && view.isShown();
-            }
-        });
-
-        onView(withText("Hello World!")).check(matches(isDisplayed()));
+        waitUntilViewMatchesCondition(withText("Hello World!"), isDisplayed());
     }
 }
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
index 7ec9b81..92a7222 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java
@@ -4,10 +4,14 @@
 
 package org.chromium.chrome.browser.autofill_assistant;
 
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+
 import android.graphics.Bitmap;
 import android.support.annotation.Nullable;
 import android.support.design.widget.CoordinatorLayout;
 import android.support.test.InstrumentationRegistry;
+import android.support.test.espresso.NoMatchingViewException;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -15,6 +19,7 @@
 import android.widget.TextView;
 
 import org.hamcrest.Description;
+import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
 
 import org.chromium.base.Callback;
@@ -29,6 +34,8 @@
 import org.chromium.chrome.browser.snackbar.BottomContainer;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
+import org.chromium.content_public.browser.test.util.Criteria;
+import org.chromium.content_public.browser.test.util.CriteriaHelper;
 
 import jp.tomorrowkey.android.gifplayer.BaseGifImage;
 
@@ -85,6 +92,28 @@
     }
 
     /**
+     * Waits until {@code matcher} matches {@code condition}. Will automatically fail after a
+     * default timeout.
+     */
+    public static void waitUntilViewMatchesCondition(
+            Matcher<View> matcher, Matcher<View> condition) {
+        CriteriaHelper.pollInstrumentationThread(
+                new Criteria("Timeout while waiting for " + matcher + " to satisfy " + condition) {
+                    @Override
+                    public boolean isSatisfied() {
+                        try {
+                            onView(matcher).check(matches(condition));
+                            return true;
+                        } catch (NoMatchingViewException e) {
+                            // Note: all other exceptions are let through, in particular
+                            // AmbiguousViewMatcherException.
+                            return false;
+                        }
+                    }
+                });
+    }
+
+    /**
      * Creates a {@link BottomSheetController} for the activity, suitable for testing.
      *
      * <p>The returned controller is different from the one returned by {@link
diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
index 7b7d0d25..dc91e9c 100644
--- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
@@ -137,13 +137,6 @@
   static *** v(...);
   static *** isLoggable(...);
 }
--checkdiscard class org.chromium.base.Log {
-  public static void d(...);
-  public static void v(...);
-  private static void debug(...);
-  private static void verbose(...);
-  private static String getCallOrigin(...);
-}
 
 # The following chart was created on July 20, 2016, to decide on 3 optimization
 # passes for Chrome.
@@ -215,10 +208,15 @@
   native <methods>;
 }
 
-# Remove methods annotated with this if their return value is unused.
+# Remove methods with this annotation. Methods generally need to be void, or
+# have unused return values in order to be removed. Compiles will fail if any
+# such method was not able to be safely removed.
 -assumenosideeffects class ** {
   @org.chromium.base.annotations.RemovableInRelease <methods>;
 }
+-checkdiscard class ** {
+  @org.chromium.base.annotations.RemovableInRelease <methods>;
+}
 
 # Never inline classes or methods with this annotation, but allow shrinking and
 # obfuscation.
diff --git a/chrome/android/java/res/drawable/white_with_top_rounded_corners.xml b/chrome/android/java/res/drawable/white_with_top_rounded_corners.xml
new file mode 100644
index 0000000..453a157
--- /dev/null
+++ b/chrome/android/java/res/drawable/white_with_top_rounded_corners.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2017 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid
+        android:color="@android:color/white"/>
+    <corners
+        android:topRightRadius="@dimen/bottom_sheet_corner_radius"
+        android:topLeftRadius="@dimen/bottom_sheet_corner_radius" />
+</shape>
diff --git a/chrome/android/java/res/layout/bottom_sheet.xml b/chrome/android/java/res/layout/bottom_sheet.xml
index eb9b83a..309ca68 100644
--- a/chrome/android/java/res/layout/bottom_sheet.xml
+++ b/chrome/android/java/res/layout/bottom_sheet.xml
@@ -5,7 +5,6 @@
 
 <org.chromium.chrome.browser.widget.bottomsheet.BottomSheet
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/bottom_sheet"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" >
@@ -28,7 +27,14 @@
             android:src="@drawable/modern_toolbar_shadow"
             android:scaleType="fitXY"
             android:scaleY="-1"
-            tools:ignore="ContentDescription" />
+            android:importantForAccessibility="no" />
+        <ImageView
+            android:id="@+id/bottom_sheet_round_top"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bottom_sheet_corner_radius"
+            android:layout_marginTop="@dimen/bottom_sheet_corner_radius"
+            android:src="@drawable/white_with_top_rounded_corners"
+            android:importantForAccessibility="no" />
 
         <view
             class="org.chromium.chrome.browser.widget.bottomsheet.TouchRestrictingFrameLayout"
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 5a9c81a..5ced564 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -552,6 +552,7 @@
     <!-- Bottom Sheet dimensions -->
     <dimen name="bottom_sheet_min_full_half_distance">140dp</dimen>
     <dimen name="bottom_sheet_peek_height">56dp</dimen>
+    <dimen name="bottom_sheet_corner_radius">4dp</dimen>
 
     <!-- TextBubble dimensions -->
     <dimen name="text_bubble_margin">4dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gcore/ConnectedTask.java b/chrome/android/java/src/org/chromium/chrome/browser/gcore/ConnectedTask.java
index 481afa2b..1089339 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gcore/ConnectedTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gcore/ConnectedTask.java
@@ -73,8 +73,7 @@
     protected abstract void doWhenConnected(T client);
 
     /**
-     * Returns a name of a task. Implementations should not have side effects
-     * as we want to have the logging related calls removed.
+     * Returns a name of a task (for debug logging).
      */
     @RemovableInRelease
     protected abstract String getName();
@@ -93,6 +92,10 @@
      */
     protected void connectionFailed() {}
 
+    private void debugLog(String message) {
+        Log.d(TAG, "%s:%s %s", mLogPrefix, getName(), message);
+    }
+
     @Override
     @VisibleForTesting
     // We always only pass in a string literal here.
@@ -100,34 +103,30 @@
     public final void run() {
         TraceEvent.begin("GCore:" + mLogPrefix + ":run");
         try {
-            Log.d(TAG, "%s:%s started", mLogPrefix, getName());
+            debugLog("started");
             if (mClient.connectWithTimeout(CONNECTION_TIMEOUT_MS)) {
                 try {
-                    Log.d(TAG, "%s:%s connected", mLogPrefix, getName());
+                    debugLog("connected");
                     doWhenConnected(mClient);
-                    Log.d(TAG, "%s:%s finished", mLogPrefix, getName());
+                    debugLog("finished");
                 } finally {
                     mClient.disconnect();
-                    Log.d(TAG, "%s:%s disconnected", mLogPrefix, getName());
+                    debugLog("disconnected");
                     cleanUp();
-                    Log.d(TAG, "%s:%s cleaned up", mLogPrefix, getName());
+                    debugLog("cleaned up");
                 }
             } else {
                 mRetryNumber++;
                 if (mRetryNumber < RETRY_NUMBER_LIMIT && mClient.isGooglePlayServicesAvailable()) {
-                    Log.d(TAG, "%s:%s calling retry", mLogPrefix, getName());
+                    debugLog("calling retry");
                     retry(this, CONNECTION_RETRY_TIME_MS);
                 } else {
                     connectionFailed();
-                    Log.d(TAG, "%s:%s number of retries exceeded", mLogPrefix, getName());
+                    debugLog("number of retries exceeded");
                     cleanUp();
-                    Log.d(TAG, "%s:%s cleaned up", mLogPrefix, getName());
+                    debugLog("cleaned up");
                 }
             }
-        } catch (RuntimeException e) {
-            Log.e(TAG, "%s:%s runtime exception %s: %s", mLogPrefix, getName(),
-                    e.getClass().getName(), e.getMessage());
-            throw e;
         } finally {
             TraceEvent.end("GCore:" + mLogPrefix + ":run");
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 3ee1109..6ba0a0e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -149,6 +149,9 @@
     /** The height of the shadow that sits above the toolbar. */
     private final int mToolbarShadowHeight;
 
+    /** The radius of the rounded corner at the top of the sheet. */
+    private final int mRoundedCornerRadius;
+
     /** The {@link BottomSheetMetrics} used to record user actions and histograms. */
     private final BottomSheetMetrics mMetrics;
 
@@ -420,7 +423,8 @@
                 getResources().getDimensionPixelSize(R.dimen.bottom_sheet_min_full_half_distance);
         mToolbarShadowHeight =
                 getResources().getDimensionPixelOffset(R.dimen.toolbar_shadow_height);
-
+        mRoundedCornerRadius =
+                getResources().getDimensionPixelOffset(R.dimen.bottom_sheet_corner_radius);
         mMetrics = new BottomSheetMetrics();
         addObserver(mMetrics);
 
@@ -1181,7 +1185,7 @@
     @VisibleForTesting
     float getFullRatio() {
         if (mContainerHeight <= 0) return 0;
-        return (mContainerHeight + mToolbarShadowHeight) / mContainerHeight;
+        return (mContainerHeight + mToolbarShadowHeight - mRoundedCornerRadius) / mContainerHeight;
     }
 
     /**
@@ -1397,7 +1401,8 @@
         mSheetContent.getContentView().measure(
                 MeasureSpec.makeMeasureSpec((int) mContainerWidth, MeasureSpec.EXACTLY),
                 MeasureSpec.makeMeasureSpec((int) mContainerHeight, MeasureSpec.AT_MOST));
-        mContentDesiredHeight = mSheetContent.getContentView().getMeasuredHeight();
+        mContentDesiredHeight =
+                mSheetContent.getContentView().getMeasuredHeight() - mRoundedCornerRadius;
     }
 
     private float getRatioForState(int state) {
@@ -1595,4 +1600,9 @@
     private void invalidateContentDesiredHeight() {
         mContentDesiredHeight = HEIGHT_UNSPECIFIED;
     }
+
+    @VisibleForTesting
+    int getRoundedCornerRadius() {
+        return mRoundedCornerRadius;
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
index 5439edf..45262cd7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkReorderTest.java
@@ -8,6 +8,7 @@
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.view.View;
 
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.night_mode.NightModeTestUtils;
 import org.junit.Assert;
@@ -61,14 +62,17 @@
     @Test
     @MediumTest
     @Feature({"RenderTest"})
+    @DisabledTest(message = "https://crbug.com/986915")
     @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
     public void testBookmarkFolderIcon(boolean nightModeEnabled) throws Exception {
-        Assert.assertTrue("Expected Bookmark Reordering to be enabled", ChromeFeatureList.isEnabled(ChromeFeatureList.REORDER_BOOKMARKS));
+        Assert.assertTrue("Expected Bookmark Reordering to be enabled",
+                          ChromeFeatureList.isEnabled(ChromeFeatureList.REORDER_BOOKMARKS));
         super.testBookmarkFolderIcon(nightModeEnabled);
     }
 
     @Test
     @MediumTest
+    @DisabledTest(message = "https://crbug.com/986915")
     public void testEndIconVisibilityInSelectionMode() throws Exception {
         BookmarkId testId = addFolder(TEST_FOLDER_TITLE);
         addBookmark(TEST_TITLE_A, TEST_URL_A);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
index 67d4805..34b37b26 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -30,7 +30,6 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
@@ -54,6 +53,8 @@
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.bookmarks.BookmarkId;
 import org.chromium.components.bookmarks.BookmarkType;
+import org.chromium.components.sync.AndroidSyncSettings;
+import org.chromium.components.sync.test.util.MockSyncContentResolverDelegate;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.browser.test.util.TouchCommon;
@@ -295,8 +296,12 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "https://crbug.com/984582")
     public void testSearchBookmarks() throws Exception {
+        // The master sync should be on in order to show the Chrome sync promo in the bookmark
+        // manager.
+        MockSyncContentResolverDelegate syncDelegate = new MockSyncContentResolverDelegate();
+        syncDelegate.setMasterSyncAutomatically(true);
+        AndroidSyncSettings.overrideForTests(syncDelegate, null);
         BookmarkPromoHeader.forcePromoStateForTests(BookmarkPromoHeader.PromoState.PROMO_SYNC);
         addBookmark(TEST_PAGE_TITLE_GOOGLE, mTestPage);
         addBookmark(TEST_PAGE_TITLE_FOO, mTestPageFoo);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java
index 1666e93a..0594f6b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappAuthenticatorTest.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.webapps;
 
-import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 
 import org.junit.After;
@@ -13,7 +12,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -37,7 +35,6 @@
     @SmallTest
     @Feature({"Webapps"})
     public void testAuthentication() {
-        ContextUtils.initApplicationContextForTests(InstrumentationRegistry.getTargetContext());
         String url = "http://www.example.org/hello.html";
         byte[] mac = WebappAuthenticator.getMacForUrl(url);
         Assert.assertNotNull(mac);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetObserverTest.java
index 1f074c7..b2ee1e7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetObserverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetObserverTest.java
@@ -257,7 +257,8 @@
         assertEquals(BottomSheet.SheetState.FULL, bottomSheet.getSheetState());
 
         // Check the offset.
-        assertEquals(wrappedContentHeight + bottomSheet.getToolbarShadowHeight(),
+        assertEquals(wrappedContentHeight + bottomSheet.getToolbarShadowHeight()
+                        - bottomSheet.getRoundedCornerRadius(),
                 bottomSheet.getCurrentOffsetPx(), MathUtils.EPSILON);
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeActionModeCallbackTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeActionModeCallbackTest.java
index 4a24bfe..44fbda2b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeActionModeCallbackTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeActionModeCallbackTest.java
@@ -16,12 +16,9 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.Callback;
-import org.chromium.base.CommandLine;
-import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.locale.LocaleManager;
@@ -62,8 +59,6 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application);
-        CommandLine.init(null);
         RecordUserAction.setDisabledForTests(true);
 
         mActionModeCallback =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
index f3a58293..43b2658 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
@@ -33,23 +33,21 @@
 import org.junit.runner.RunWith;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
 import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.PathUtils;
 import org.chromium.base.library_loader.ProcessInitException;
+import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
 import org.chromium.chrome.browser.init.AsyncInitTaskRunner;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.components.signin.ChromeSigninController;
 import org.chromium.content_public.common.ContentProcessInfo;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -63,7 +61,7 @@
 /**
  * Unit tests for {@link org.chromium.chrome.browser.ChromeBackupAgent}.
  */
-@RunWith(LocalRobolectricTestRunner.class)
+@RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ChromeBackupAgentTest.BackupManagerShadow.class})
 public class ChromeBackupAgentTest {
     /**
@@ -87,7 +85,6 @@
         }
     }
 
-    private Context mContext;
     private ChromeBackupAgent mAgent;
     private AsyncInitTaskRunner mTaskRunner;
 
@@ -99,20 +96,8 @@
         editor.apply();
     }
 
-    private void clearPrefs() {
-        ContextUtils.getAppSharedPreferences().edit().clear().apply();
-    }
-
     @Before
     public void setUp() {
-        // Set up the context.
-        mContext = RuntimeEnvironment.application.getApplicationContext();
-        ContextUtils.initApplicationContextForTests(mContext);
-        CommandLine.init(null);
-
-        // Clear any app preferences
-        clearPrefs();
-
         // Create the agent to test; override the native calls and fetching the task runner, and
         // spy on the agent to allow us to validate calls to these methods.
         mAgent = spy(new ChromeBackupAgent() {
@@ -585,7 +570,7 @@
 
         // Prove that the value equalTo held in the app preferences (and not, for example, in a
         // static).
-        clearPrefs();
+        ContextUtils.getAppSharedPreferences().edit().clear().apply();
         assertThat(ChromeBackupAgent.getRestoreStatus(),
                 equalTo(ChromeBackupAgent.RestoreStatus.NO_RESTORE));
 
@@ -617,7 +602,7 @@
         ChromeBackupAgent agent = new ChromeBackupAgent();
         ChromeBrowserInitializer initializer = mock(ChromeBrowserInitializer.class);
         ChromeBrowserInitializer.setForTesting(initializer);
-        assertTrue(agent.initializeBrowser(mContext));
+        assertTrue(agent.initializeBrowser(ContextUtils.getApplicationContext()));
     }
 
     /**
@@ -630,7 +615,7 @@
         ChromeBackupAgent agent = new ChromeBackupAgent();
         ChromeBrowserInitializer initializer = mock(ChromeBrowserInitializer.class);
         ChromeBrowserInitializer.setForTesting(initializer);
-        assertFalse(agent.initializeBrowser(mContext));
+        assertFalse(agent.initializeBrowser(ContextUtils.getApplicationContext()));
         verifyNoMoreInteractions(initializer);
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
index 58c618d8..5f3b5c12 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
@@ -31,7 +31,6 @@
 import org.robolectric.shadows.ShadowLog;
 import org.robolectric.shadows.ShadowLooper;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.media.ui.MediaNotificationManager.ListenerService;
@@ -134,9 +133,6 @@
 
         mMockForegroundServiceUtils = mock(ForegroundServiceUtils.class);
         ForegroundServiceUtils.setInstanceForTesting(mMockForegroundServiceUtils);
-
-        // Init the command line to avoid assertion failure in |SysUtils#isLowEndDevice()|.
-        CommandLine.init(null);
     }
 
     @After
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java
index a406785..79d769a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java
@@ -16,7 +16,6 @@
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 
 /**
@@ -45,8 +44,6 @@
 
     @Test
     public void testUsageAndCrashReportingAccessors() {
-        CommandLine.init(null);
-
         // TODO(yolandyan): Use Junit4 parameters to clean up this test structure.
         runTest(CONNECTED, UNMETERED, METRICS_REPORTING_ENABLED, METRICS_UPLOAD_PERMITTED,
                 CRASH_NETWORK_AVAILABLE);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java
index 33c6383..cd03ea4 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java
@@ -70,7 +70,6 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ContextUtils.initApplicationContextForTests(mContext);
-        ContextUtils.getAppSharedPreferences().edit().clear().apply();
 
         ChromeFeatureList.setTestFeatures(new HashMap<String, Boolean>());
         ShadowRecordHistogram.reset();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java
index 98c8f8a..abf0efd 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java
@@ -4,17 +4,13 @@
 
 package org.chromium.chrome.browser.send_tab_to_self;
 
-import android.content.Context;
 import android.content.SharedPreferences;
 import android.support.annotation.Nullable;
 import android.support.test.filters.SmallTest;
 
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Spy;
-import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.ContextUtils;
@@ -25,15 +21,6 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class NotificationSharedPrefManagerTest {
-    @Spy
-    private Context mContext = RuntimeEnvironment.application.getApplicationContext();
-
-    @Before
-    public void setUp() {
-        ContextUtils.initApplicationContext(mContext);
-        ContextUtils.getAppSharedPreferences().edit().clear().apply();
-    }
-
     private @Nullable ActiveNotification deserialize(String serialized) {
         return NotificationSharedPrefManager.deserializeNotification(serialized);
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java
index 0db9fa0..2f1fb5715 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java
@@ -62,7 +62,6 @@
         mTestController = new TestChromeSurveyController();
         mTestController.setTabModelSelector(mSelector);
         mSharedPreferences = ContextUtils.getAppSharedPreferences();
-        mSharedPreferences.edit().clear().apply();
         Assert.assertNull("Tab should be null", mTestController.getLastTabInfobarShown());
         Map<String, Boolean> featureMap = new ArrayMap<>();
         featureMap.put(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID, true);
@@ -71,7 +70,6 @@
 
     @After
     public void after() {
-        mSharedPreferences.edit().clear().apply();
         RecordHistogram.setDisabledForTests(false);
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
index efa31538..18b9954 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
@@ -34,7 +34,6 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
-import org.chromium.base.CommandLine;
 import org.chromium.base.PathUtils;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -481,7 +480,6 @@
     @Before
     public void setUp() throws Exception {
         PathUtils.setPrivateDataDirectorySuffix("chrome");
-        CommandLine.init(null);
         PostTask.setPrenativeThreadPoolExecutorForTesting(new RoboExecutorService());
 
         mJniMocker.mock(WebApkUpdateManagerJni.TEST_HOOKS, new TestWebApkUpdateManagerJni());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDataStorageTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDataStorageTest.java
index d2185c80..0932b47 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDataStorageTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappDataStorageTest.java
@@ -13,7 +13,6 @@
 import android.content.SharedPreferences;
 import android.graphics.Bitmap;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -68,11 +67,6 @@
         mCallbackCalled = false;
     }
 
-    @After
-    public void tearDown() {
-        mSharedPreferences.edit().clear().apply();
-    }
-
     @Test
     @Feature({"Webapp"})
     public void testBackwardCompat() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java
index 2dd4de1..5ce07b6c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java
@@ -14,7 +14,6 @@
 import android.content.SharedPreferences;
 import android.text.TextUtils;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -88,11 +87,6 @@
         mCallbackCalled = false;
     }
 
-    @After
-    public void tearDown() {
-        mSharedPreferences.edit().clear().apply();
-    }
-
     private void registerWebapp(String webappId,
             WebappRegistry.FetchWebappDataStorageCallback callback) throws Exception {
         WebappRegistry.getInstance().register(webappId, callback);
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index c36dccf..2197c1bb 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-77.0.3861.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-77.0.3862.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index fbb5c2da..d6094f6 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -430,7 +430,7 @@
     "//components/data_reduction_proxy/core/common:interfaces",
     "//components/dom_distiller/content/common/mojom",
     "//components/metrics/public/interfaces:call_stack_mojo_bindings",
-    "//components/rappor/public/interfaces",
+    "//components/rappor/public/mojom",
     "//components/safe_browsing/common:interfaces",
     "//components/services/heap_profiling/public/mojom",
     "//components/services/quarantine/public/mojom",
@@ -524,7 +524,7 @@
     "//components/autofill/content/common/mojom",
     "//components/dom_distiller/content/common/mojom",
     "//components/metrics/public/interfaces:call_stack_mojo_bindings",
-    "//components/rappor/public/interfaces",
+    "//components/rappor/public/mojom",
     "//components/safe_browsing/common:interfaces",
     "//components/services/heap_profiling/public/mojom",
     "//components/subresource_filter/content/mojom",
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index 327a13d..0f2a5a56 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -31,7 +31,7 @@
 #include "components/dom_distiller/content/common/mojom/distillability_service.mojom.h"
 #include "components/dom_distiller/content/common/mojom/distiller_javascript_service.mojom.h"
 #include "components/metrics/public/interfaces/call_stack_profile_collector.mojom.h"
-#include "components/rappor/public/interfaces/rappor_recorder.mojom.h"
+#include "components/rappor/public/mojom/rappor_recorder.mojom.h"
 #include "components/safe_browsing/common/safe_browsing.mojom.h"
 #include "components/services/heap_profiling/public/mojom/heap_profiling_client.mojom.h"
 #include "components/services/quarantine/public/mojom/quarantine.mojom.h"
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index a54f295..3af94d10 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -4091,6 +4091,13 @@
     The next time you restart your device, your administrator will perform a one-time update that will delete your local data.
   </message>
 
+  <message name="IDS_RELEASE_NOTES_NOTIFICATION_TITLE" desc="Text for the notification title informing the user that the device has been updated and patch notes are available.">
+    See what's new on Chromebook
+  </message>
+  <message name="IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE" desc="Text for the notification message informing the user that the device has been updated and patch notes are available.">
+    Get highlights from the latest update
+  </message>
+
   <!-- Strings for Add Supervision screen -->
   <message name="IDS_ADD_SUPERVISION_PAGE_TITLE" desc="Title for the Chrome OS Add Supervision screen.">
     Add Supervision
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE.png.sha1
new file mode 100644
index 0000000..fa1fbfc
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@
+51e6a2ba245da0527c4d1a77142448a6f9d42f35
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1
new file mode 100644
index 0000000..fa1fbfc
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_RELEASE_NOTES_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@
+51e6a2ba245da0527c4d1a77142448a6f9d42f35
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 03768ae..9c1dcc39 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -149,6 +149,12 @@
       Report an issue
     </message>
   </if>
+    <message name="IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES" desc="Warning that internet connection is required to display Chrome OS release notes.">
+      Internet connection required
+  </message>
+  <message name="IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES" desc="Text of the button which shows user the release notes.">
+    See what's new
+  </message>
   <message name="IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED" desc="Status label: About to start checking for updates">
     Checking for updates
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 1c63a55..9cffc8d 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2808,10 +2808,8 @@
       "search_engines/template_url_service_factory_android.cc",
       "search_engines/template_url_service_factory_android.h",
       "signin/identity_services_provider_android.cc",
-      "signin/signin_manager_android_wrapper.cc",
-      "signin/signin_manager_android_wrapper.h",
-      "signin/signin_manager_android_wrapper_factory.cc",
-      "signin/signin_manager_android_wrapper_factory.h",
+      "signin/signin_manager_android_factory.cc",
+      "signin/signin_manager_android_factory.h",
       "ssl/security_state_model_android.cc",
       "sync/glue/synced_tab_delegate_android.cc",
       "sync/glue/synced_tab_delegate_android.h",
@@ -3463,6 +3461,8 @@
       "usb/web_usb_chooser_desktop.h",
       "usb/web_usb_detector.cc",
       "usb/web_usb_detector.h",
+      "web_launch/web_launch_files_helper.cc",
+      "web_launch/web_launch_files_helper.h",
     ]
     deps += [
       ":theme_properties",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 11ee113a..fbaa74d 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3538,6 +3538,7 @@
          chromeos::assistant::features::kEnableMediaSessionIntegration)},
 #endif  // defined(OS_CHROMEOS)
 
+#if !defined(OS_CHROMEOS)
     {"click-to-call-receiver", flag_descriptions::kClickToCallReceiverName,
      flag_descriptions::kClickToCallReceiverDescription, kOsAll,
      FEATURE_VALUE_TYPE(kClickToCallReceiver)},
@@ -3545,6 +3546,7 @@
     {"click-to-call-ui", flag_descriptions::kClickToCallUIName,
      flag_descriptions::kClickToCallUIDescription, kOsAll,
      FEATURE_VALUE_TYPE(kClickToCallUI)},
+#endif  // !defined(OS_CHROMEOS)
 
     {"enable-ambient-authentication-in-incognito",
      flag_descriptions::kEnableAmbientAuthenticationInIncognitoName,
@@ -4038,6 +4040,12 @@
 #endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
 
 #if defined(OS_CHROMEOS)
+    {"release-notes", flag_descriptions::kReleaseNotesName,
+     flag_descriptions::kReleaseNotesDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kReleaseNotes)},
+#endif  // defined(OS_CHROMEOS)
+
+#if defined(OS_CHROMEOS)
     {"smart-dim-model-v3", flag_descriptions::kSmartDimModelV3Name,
      flag_descriptions::kSmartDimModelV3Description, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kSmartDimModelV3)},
diff --git a/chrome/browser/android/signin/signin_manager_android.h b/chrome/browser/android/signin/signin_manager_android.h
index 616fa244..f1f721e0 100644
--- a/chrome/browser/android/signin/signin_manager_android.h
+++ b/chrome/browser/android/signin/signin_manager_android.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/android/signin/signin_manager_delegate.h"
+#include "components/keyed_service/core/keyed_service.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_member.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
@@ -26,7 +27,8 @@
 //
 // This class implements parts of the sign-in flow, to make sure that policy
 // is available before sign-in completes.
-class SigninManagerAndroid : public signin::IdentityManager::Observer {
+class SigninManagerAndroid : public KeyedService,
+                             public signin::IdentityManager::Observer {
  public:
   SigninManagerAndroid(
       SigninClient* signin_client,
@@ -36,7 +38,7 @@
 
   ~SigninManagerAndroid() override;
 
-  void Shutdown();
+  void Shutdown() override;
 
   base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
 
diff --git a/chrome/browser/apps/app_service/app_launch_params.h b/chrome/browser/apps/app_service/app_launch_params.h
index e50d280..32a17a4 100644
--- a/chrome/browser/apps/app_service/app_launch_params.h
+++ b/chrome/browser/apps/app_service/app_launch_params.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_APPS_APP_SERVICE_APP_LAUNCH_PARAMS_H_
 
 #include <string>
+#include <vector>
 
 #include "base/command_line.h"
 #include "base/files/file_path.h"
@@ -79,6 +80,10 @@
   // The frame that initiated the open. May be null. If set, the new app will
   // have |opener| as its window.opener.
   content::RenderFrameHost* opener;
+
+  // The files the application was launched with. Empty if the application was
+  // not launched with files.
+  std::vector<base::FilePath> launch_files;
 };
 
 #endif  // CHROME_BROWSER_APPS_APP_SERVICE_APP_LAUNCH_PARAMS_H_
diff --git a/chrome/browser/assist_ranker/OWNERS b/chrome/browser/assist_ranker/OWNERS
index cebf50d8..c63059f5 100644
--- a/chrome/browser/assist_ranker/OWNERS
+++ b/chrome/browser/assist_ranker/OWNERS
@@ -1 +1,2 @@
 file://components/assist_ranker/OWNERS
+# COMPONENT: UI>Browser>Search>ContextualSearch
diff --git a/chrome/browser/background_fetch/OWNERS b/chrome/browser/background_fetch/OWNERS
index 1b61f56b..9504673a 100644
--- a/chrome/browser/background_fetch/OWNERS
+++ b/chrome/browser/background_fetch/OWNERS
@@ -1 +1,3 @@
 file://content/browser/background_fetch/OWNERS
+# COMPONENT: Blink>BackgroundFetch
+# TEAM: platform-capabilities@chromium.org 
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 193b0fa..c775a163 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -782,8 +782,6 @@
     "dbus/kiosk_info_service_provider.h",
     "dbus/libvda_service_provider.cc",
     "dbus/libvda_service_provider.h",
-    "dbus/machine_learning_decision_service_provider.cc",
-    "dbus/machine_learning_decision_service_provider.h",
     "dbus/metrics_event_service_provider.cc",
     "dbus/metrics_event_service_provider.h",
     "dbus/plugin_vm_service_provider.cc",
@@ -1919,6 +1917,10 @@
     "profiles/profile_helper.h",
     "profiles/profile_util.cc",
     "profiles/profile_util.h",
+    "release_notes/release_notes_notification.cc",
+    "release_notes/release_notes_notification.h",
+    "release_notes/release_notes_storage.cc",
+    "release_notes/release_notes_storage.h",
     "reset/metrics.h",
     "resource_reporter/resource_reporter.cc",
     "resource_reporter/resource_reporter.h",
@@ -2185,7 +2187,6 @@
     "dbus/org.chromium.DriveFileStreamService.conf",
     "dbus/org.chromium.KioskAppService.conf",
     "dbus/org.chromium.LibvdaService.conf",
-    "dbus/org.chromium.MachineLearningDecisionService.conf",
     "dbus/org.chromium.MetricsEventService.conf",
     "dbus/org.chromium.NetworkProxyService.conf",
     "dbus/org.chromium.PluginVmService.conf",
@@ -2657,6 +2658,8 @@
     "printing/usb_printer_detector_unittest.cc",
     "printing/zeroconf_printer_detector_unittest.cc",
     "proxy_config_service_impl_unittest.cc",
+    "release_notes/release_notes_notification_unittest.cc",
+    "release_notes/release_notes_storage_unittest.cc",
     "resource_reporter/resource_reporter_unittest.cc",
     "scheduler_configuration_manager_unittest.cc",
     "session_length_limiter_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
index 0a940ba6..37ae6c0 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
@@ -108,13 +108,6 @@
   ash::VoiceInteractionController::Get()->NotifyHotwordEnabled(enabled);
 }
 
-void VoiceInteractionControllerClient::NotifyHotwordAlwaysOn() {
-  DCHECK(profile_);
-  PrefService* prefs = profile_->GetPrefs();
-  bool always_on = prefs->GetBoolean(prefs::kVoiceInteractionHotwordAlwaysOn);
-  ash::VoiceInteractionController::Get()->NotifyHotwordAlwaysOn(always_on);
-}
-
 void VoiceInteractionControllerClient::NotifyFeatureAllowed() {
   DCHECK(profile_);
   ash::mojom::AssistantAllowedState state =
@@ -122,13 +115,6 @@
   ash::VoiceInteractionController::Get()->NotifyFeatureAllowed(state);
 }
 
-void VoiceInteractionControllerClient::NotifyNotificationEnabled() {
-  DCHECK(profile_);
-  PrefService* prefs = profile_->GetPrefs();
-  bool enabled = prefs->GetBoolean(prefs::kVoiceInteractionNotificationEnabled);
-  ash::VoiceInteractionController::Get()->NotifyNotificationEnabled(enabled);
-}
-
 void VoiceInteractionControllerClient::NotifyLocaleChanged() {
   DCHECK(profile_);
 
@@ -140,15 +126,6 @@
   ash::VoiceInteractionController::Get()->NotifyLocaleChanged(out_locale);
 }
 
-void VoiceInteractionControllerClient::NotifyLaunchWithMicOpen() {
-  DCHECK(profile_);
-  PrefService* prefs = profile_->GetPrefs();
-  bool voice_preferred =
-      prefs->GetBoolean(prefs::kVoiceInteractionLaunchWithMicOpen);
-  ash::VoiceInteractionController::Get()->NotifyLaunchWithMicOpen(
-      voice_preferred);
-}
-
 void VoiceInteractionControllerClient::ActiveUserChanged(
     const user_manager::User* active_user) {
   if (active_user && active_user->is_profile_created())
@@ -193,29 +170,11 @@
       base::BindRepeating(
           &VoiceInteractionControllerClient::NotifyHotwordEnabled,
           base::Unretained(this)));
-  pref_change_registrar_->Add(
-      prefs::kVoiceInteractionHotwordAlwaysOn,
-      base::BindRepeating(
-          &VoiceInteractionControllerClient::NotifyHotwordAlwaysOn,
-          base::Unretained(this)));
-  pref_change_registrar_->Add(
-      prefs::kVoiceInteractionNotificationEnabled,
-      base::BindRepeating(
-          &VoiceInteractionControllerClient::NotifyNotificationEnabled,
-          base::Unretained(this)));
-  pref_change_registrar_->Add(
-      prefs::kVoiceInteractionLaunchWithMicOpen,
-      base::BindRepeating(
-          &VoiceInteractionControllerClient::NotifyLaunchWithMicOpen,
-          base::Unretained(this)));
 
   NotifySettingsEnabled();
   NotifyContextEnabled();
   NotifyLocaleChanged();
-  NotifyNotificationEnabled();
-  NotifyLaunchWithMicOpen();
   NotifyHotwordEnabled();
-  NotifyHotwordAlwaysOn();
   OnArcPlayStoreEnabledChanged(IsArcPlayStoreEnabledForProfile(profile_));
 }
 
diff --git a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
index 72360dd..451eca0 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
+++ b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
@@ -53,7 +53,6 @@
   void NotifySettingsEnabled();
   void NotifyContextEnabled();
   void NotifyHotwordEnabled();
-  void NotifyHotwordAlwaysOn();
   void NotifyFeatureAllowed();
   void NotifyNotificationEnabled();
   void NotifyLocaleChanged();
diff --git a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client_unittest.cc b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client_unittest.cc
index 9adb89ac..0129709 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client_unittest.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client_unittest.cc
@@ -102,26 +102,10 @@
   ASSERT_EQ(true, prefs->GetBoolean(prefs::kVoiceInteractionHotwordEnabled));
   EXPECT_EQ(true, ash::VoiceInteractionController::Get()->hotword_enabled());
 
-  // Default setting is true.
-  ASSERT_EQ(true,
-            prefs->GetBoolean(prefs::kVoiceInteractionNotificationEnabled));
-  prefs->SetBoolean(prefs::kVoiceInteractionNotificationEnabled, false);
-  ASSERT_EQ(false,
-            prefs->GetBoolean(prefs::kVoiceInteractionNotificationEnabled));
-  EXPECT_EQ(false,
-            ash::VoiceInteractionController::Get()->notification_enabled());
-
   ASSERT_EQ("", prefs->GetString(language::prefs::kApplicationLocale));
   prefs->SetString(language::prefs::kApplicationLocale, "en-CA");
   ASSERT_EQ("en-CA", prefs->GetString(language::prefs::kApplicationLocale));
   EXPECT_EQ("en-CA", ash::VoiceInteractionController::Get()->locale());
-
-  ASSERT_EQ(false,
-            prefs->GetBoolean(prefs::kVoiceInteractionLaunchWithMicOpen));
-  prefs->SetBoolean(prefs::kVoiceInteractionLaunchWithMicOpen, true);
-  ASSERT_EQ(true, prefs->GetBoolean(prefs::kVoiceInteractionLaunchWithMicOpen));
-  EXPECT_EQ(true,
-            ash::VoiceInteractionController::Get()->launch_with_mic_open());
 }
 
 }  // namespace arc
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index d8e45b3..ade0d8c1 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -52,7 +52,6 @@
 #include "chrome/browser/chromeos/dbus/drive_file_stream_service_provider.h"
 #include "chrome/browser/chromeos/dbus/kiosk_info_service_provider.h"
 #include "chrome/browser/chromeos/dbus/libvda_service_provider.h"
-#include "chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h"
 #include "chrome/browser/chromeos/dbus/metrics_event_service_provider.h"
 #include "chrome/browser/chromeos/dbus/plugin_vm_service_provider.h"
 #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h"
@@ -92,6 +91,7 @@
 #include "chrome/browser/chromeos/power/freezer_cgroup_process_manager.h"
 #include "chrome/browser/chromeos/power/idle_action_warning_observer.h"
 #include "chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_controller.h"
 #include "chrome/browser/chromeos/power/power_data_collector.h"
 #include "chrome/browser/chromeos/power/power_metrics_reporter.h"
 #include "chrome/browser/chromeos/power/process_data_collector.h"
@@ -295,9 +295,6 @@
                                 ? nullptr
                                 : DBusThreadManager::Get()->GetSystemBus();
 
-    // See also PostBrowserStart() where machine_learning_decision_service_ is
-    // initialized.
-
     proxy_resolution_service_ = CrosDBusService::Create(
         system_bus, kNetworkProxyServiceName,
         dbus::ObjectPath(kNetworkProxyServicePath),
@@ -396,19 +393,6 @@
         OwnerSettingsServiceChromeOSFactory::GetInstance()->GetOwnerKeyUtil());
   }
 
-  void CreateMachineLearningDecisionProvider() {
-    dbus::Bus* system_bus = DBusThreadManager::Get()->IsUsingFakes()
-                                ? nullptr
-                                : DBusThreadManager::Get()->GetSystemBus();
-    // TODO(alanlxl): update Ml here to MachineLearning after powerd is
-    // uprevved.
-    machine_learning_decision_service_ = CrosDBusService::Create(
-        system_bus, machine_learning::kMlDecisionServiceName,
-        dbus::ObjectPath(machine_learning::kMlDecisionServicePath),
-        CrosDBusService::CreateServiceProviderList(
-            std::make_unique<MachineLearningDecisionServiceProvider>()));
-  }
-
   ~DBusServices() {
     NetworkHandler::Shutdown();
     cryptohome::AsyncMethodCaller::Shutdown();
@@ -426,7 +410,6 @@
     vm_applications_service_.reset();
     drive_file_stream_service_.reset();
     cryptohome_key_delegate_service_.reset();
-    machine_learning_decision_service_.reset();
     ProcessDataCollector::Shutdown();
     PowerDataCollector::Shutdown();
     PowerPolicyController::Shutdown();
@@ -446,7 +429,6 @@
   std::unique_ptr<CrosDBusService> drive_file_stream_service_;
   std::unique_ptr<CrosDBusService> cryptohome_key_delegate_service_;
   std::unique_ptr<CrosDBusService> libvda_service_;
-  std::unique_ptr<CrosDBusService> machine_learning_decision_service_;
 
   DISALLOW_COPY_AND_ASSIGN(DBusServices);
 };
@@ -992,7 +974,6 @@
     low_disk_notification_ = std::make_unique<LowDiskNotification>();
 
   gnubby_notification_ = std::make_unique<GnubbyNotification>();
-
   demo_mode_resources_remover_ = DemoModeResourcesRemover::CreateIfNeeded(
       g_browser_process->local_state());
   // Start measuring crosvm processes resource usage.
@@ -1051,10 +1032,8 @@
   }
 
   if (base::FeatureList::IsEnabled(::features::kUserActivityEventLogging)) {
-    // MachineLearningDecisionServiceProvider needs to be created after
-    // UserActivityController which depends on UserActivityDetector, not
-    // available until PostBrowserStart.
-    dbus_services_->CreateMachineLearningDecisionProvider();
+    user_activity_controller_ =
+        std::make_unique<power::ml::UserActivityController>();
   }
 
   auto_screen_brightness_controller_ =
@@ -1125,6 +1104,7 @@
   ScreenLocker::ShutDownClass();
   low_disk_notification_.reset();
   demo_mode_resources_remover_.reset();
+  user_activity_controller_.reset();
   adaptive_screen_brightness_manager_.reset();
   scheduler_configuration_manager_.reset();
   auto_screen_brightness_controller_.reset();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index ac760e8..c384fb2 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -43,6 +43,7 @@
 class DiscoverManager;
 class EventRewriterDelegateImpl;
 class FastTransitionObserver;
+class GnubbyNotification;
 class IdleActionWarningObserver;
 class LowDiskNotification;
 class NetworkChangeManagerClient;
@@ -55,7 +56,6 @@
 class ShutdownPolicyForwarder;
 class WakeOnWifiManager;
 class WilcoDtcSupportdManager;
-class GnubbyNotification;
 
 namespace default_app_order {
 class ExternalLoader;
@@ -69,6 +69,7 @@
 namespace power {
 namespace ml {
 class AdaptiveScreenBrightnessManager;
+class UserActivityController;
 }  // namespace ml
 
 namespace auto_screen_brightness {
@@ -154,6 +155,7 @@
   std::unique_ptr<power::ml::AdaptiveScreenBrightnessManager>
       adaptive_screen_brightness_manager_;
 
+  std::unique_ptr<power::ml::UserActivityController> user_activity_controller_;
   std::unique_ptr<power::auto_screen_brightness::Controller>
       auto_screen_brightness_controller_;
 
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 110a0207..1bef613 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -421,7 +421,8 @@
                  << ", mount_type=" << mount_info.mount_type
                  << ", mount_condition=" << mount_info.mount_condition;
     } else {
-      crostini_manager_->SetContainerSshfsMounted(vm_name_, container_name_);
+      crostini_manager_->SetContainerSshfsMounted(vm_name_, container_name_,
+                                                  true);
 
       // Register filesystem and add volume to VolumeManager.
       base::FilePath mount_path = base::FilePath(mount_info.mount_path);
@@ -514,11 +515,12 @@
 ContainerInfo::ContainerInfo(const ContainerInfo&) = default;
 
 void CrostiniManager::SetContainerSshfsMounted(std::string vm_name,
-                                               std::string container_name) {
+                                               std::string container_name,
+                                               bool is_mounted) {
   auto range = running_containers_.equal_range(std::move(vm_name));
   for (auto it = range.first; it != range.second; ++it) {
     if (it->second.name == container_name) {
-      it->second.sshfs_mounted = true;
+      it->second.sshfs_mounted = is_mounted;
     }
   }
 }
@@ -563,6 +565,9 @@
   DCHECK(!profile_->IsOffTheRecord());
   GetCiceroneClient()->AddObserver(this);
   GetConciergeClient()->AddContainerObserver(this);
+  if (chromeos::PowerManagerClient::Get()) {
+    chromeos::PowerManagerClient::Get()->AddObserver(this);
+  }
 }
 
 CrostiniManager::~CrostiniManager() {
@@ -576,6 +581,9 @@
   dbus_observers_removed_ = true;
   GetCiceroneClient()->RemoveObserver(this);
   GetConciergeClient()->RemoveContainerObserver(this);
+  if (chromeos::PowerManagerClient::Get()) {
+    chromeos::PowerManagerClient::Get()->RemoveObserver(this);
+  }
 }
 
 // static
@@ -2545,4 +2553,22 @@
   }
 }
 
+void CrostiniManager::SuspendImminent(
+    power_manager::SuspendImminent::Reason reason) {
+  // https://crbug.com/968060.  Unmount sshfs before suspend.
+  file_manager::VolumeManager::Get(profile_)->RemoveSshfsCrostiniVolume(
+      file_manager::util::GetCrostiniMountDirectory(profile_));
+  SetContainerSshfsMounted(kCrostiniDefaultVmName,
+                           kCrostiniDefaultContainerName, false);
+}
+
+void CrostiniManager::SuspendDone(const base::TimeDelta& sleep_duration) {
+  // https://crbug.com/968060.  Sshfs is unmounted before suspend,
+  // call RestartCrostini to force remount if container is running.
+  if (GetContainerInfo(kCrostiniDefaultVmName, kCrostiniDefaultContainerName)) {
+    RestartCrostini(kCrostiniDefaultVmName, kCrostiniDefaultContainerName,
+                    base::DoNothing());
+  }
+}
+
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index 18d5739..7649e5d 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -23,6 +23,7 @@
 #include "chromeos/dbus/cicerone_client.h"
 #include "chromeos/dbus/concierge/service.pb.h"
 #include "chromeos/dbus/concierge_client.h"
+#include "chromeos/dbus/power/power_manager_client.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "services/device/public/mojom/usb_manager.mojom.h"
 
@@ -114,7 +115,8 @@
 // only the Concierge name is exposed outside of here.
 class CrostiniManager : public KeyedService,
                         public chromeos::ConciergeClient::ContainerObserver,
-                        public chromeos::CiceroneClient::Observer {
+                        public chromeos::CiceroneClient::Observer,
+                        public chromeos::PowerManagerClient::Observer {
  public:
   using CrostiniResultCallback =
       base::OnceCallback<void(CrostiniResult result)>;
@@ -446,6 +448,10 @@
   void OnPendingAppListUpdates(
       const vm_tools::cicerone::PendingAppListUpdatesSignal& signal) override;
 
+  // chromeos::PowerManagerClient::Observer overrides:
+  void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
+  void SuspendDone(const base::TimeDelta& sleep_duration) override;
+
   void RemoveCrostini(std::string vm_name, RemoveCrostiniCallback callback);
 
   void UpdateVmState(std::string vm_name, VmState vm_state);
@@ -455,7 +461,8 @@
   void AddRunningVmForTesting(std::string vm_name);
 
   void SetContainerSshfsMounted(std::string vm_name,
-                                std::string container_name);
+                                std::string container_name,
+                                bool is_mounted);
   // Returns null if VM or container is not running.
   base::Optional<ContainerInfo> GetContainerInfo(std::string vm_name,
                                                  std::string container_name);
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.cc b/chrome/browser/chromeos/crostini/crostini_pref_names.cc
index 46456db..c60bb26 100644
--- a/chrome/browser/chromeos/crostini/crostini_pref_names.cc
+++ b/chrome/browser/chromeos/crostini/crostini_pref_names.cc
@@ -33,6 +33,10 @@
 // the crostini export / import UI.
 const char kUserCrostiniExportImportUIAllowedByPolicy[] =
     "crostini.user_export_import_ui_allowed_by_policy";
+// A boolean preference representing a user level enterprise policy to enable
+// VM management CLI.
+const char kVmManagementCliAllowedByPolicy[] =
+    "crostini.vm_management_cli_allowed_by_policy";
 // A boolean preference representing a user level enterprise policy to allow
 // Crostini root access.
 // TODO(https://crbug.com/983998): The features that have to be implemented.
@@ -86,6 +90,7 @@
   registry->RegisterBooleanPref(kUserCrostiniAllowedByPolicy, true);
   registry->RegisterBooleanPref(kUserCrostiniExportImportUIAllowedByPolicy,
                                 true);
+  registry->RegisterBooleanPref(kVmManagementCliAllowedByPolicy, true);
   registry->RegisterBooleanPref(kUserCrostiniRootAccessAllowedByPolicy, true);
 }
 
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.h b/chrome/browser/chromeos/crostini/crostini_pref_names.h
index 5c7cd78..c8bbfb4 100644
--- a/chrome/browser/chromeos/crostini/crostini_pref_names.h
+++ b/chrome/browser/chromeos/crostini/crostini_pref_names.h
@@ -20,6 +20,7 @@
 
 extern const char kUserCrostiniAllowedByPolicy[];
 extern const char kUserCrostiniExportImportUIAllowedByPolicy[];
+extern const char kVmManagementCliAllowedByPolicy[];
 extern const char kUserCrostiniRootAccessAllowedByPolicy[];
 
 extern const char kReportCrostiniUsageEnabled[];
diff --git a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.cc b/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.cc
deleted file mode 100644
index 0ad7a32f..0000000
--- a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h"
-
-#include "base/bind.h"
-#include "chrome/browser/chromeos/power/ml/user_activity_controller.h"
-#include "chromeos/constants/devicetype.h"
-#include "dbus/bus.h"
-#include "dbus/message.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-namespace chromeos {
-
-MachineLearningDecisionServiceProvider::MachineLearningDecisionServiceProvider()
-    : user_activity_controller_(
-          std::make_unique<power::ml::UserActivityController>()),
-      weak_ptr_factory_(this) {}
-
-MachineLearningDecisionServiceProvider::
-    ~MachineLearningDecisionServiceProvider() = default;
-
-void MachineLearningDecisionServiceProvider::Start(
-    scoped_refptr<dbus::ExportedObject> exported_object) {
-  exported_object->ExportMethod(
-      machine_learning::kMlDecisionServiceInterface,
-      machine_learning::kShouldDeferScreenDimMethod,
-      base::BindRepeating(
-          &MachineLearningDecisionServiceProvider::ShouldDeferScreenDim,
-          weak_ptr_factory_.GetWeakPtr()),
-      base::BindRepeating(&MachineLearningDecisionServiceProvider::OnExported,
-                          weak_ptr_factory_.GetWeakPtr()));
-}
-
-void MachineLearningDecisionServiceProvider::OnExported(
-    const std::string& interface_name,
-    const std::string& method_name,
-    bool success) {
-  if (!success) {
-    LOG(ERROR) << "Failed to export " << interface_name << "." << method_name;
-  }
-}
-
-void MachineLearningDecisionServiceProvider::ShouldDeferScreenDim(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-
-  // Smart dim only works on chromebook devices. Simply return false on other
-  // device types.
-  if (chromeos::GetDeviceType() != chromeos::DeviceType::kChromebook) {
-    SendSmartDimDecision(std::move(response), std::move(response_sender),
-                         false);
-    return;
-  }
-
-  user_activity_controller_->ShouldDeferScreenDim(base::BindOnce(
-      &MachineLearningDecisionServiceProvider::SendSmartDimDecision,
-      weak_ptr_factory_.GetWeakPtr(), std::move(response),
-      std::move(response_sender)));
-}
-
-void MachineLearningDecisionServiceProvider::SendSmartDimDecision(
-    std::unique_ptr<dbus::Response> response,
-    dbus::ExportedObject::ResponseSender response_sender,
-    bool defer_dimming) {
-  dbus::MessageWriter writer(response.get());
-  writer.AppendBool(defer_dimming);
-  response_sender.Run(std::move(response));
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h b/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h
deleted file mode 100644
index 74d479be..0000000
--- a/chrome/browser/chromeos/dbus/machine_learning_decision_service_provider.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
-#define CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "chromeos/dbus/services/cros_dbus_service.h"
-#include "dbus/exported_object.h"
-
-namespace dbus {
-
-class MethodCall;
-
-}  // namespace dbus
-
-namespace chromeos {
-namespace power {
-namespace ml {
-
-class UserActivityController;
-
-}  // namespace ml
-}  // namespace power
-
-// This class processes machine learning decision requests from Chrome OS side.
-//
-// ShouldDeferScreenDim:
-// % dbus-send --system --type=method_call --print-reply
-//     --dest=org.chromium.MlDecisionService
-//     /org/chromium/MlDecisionService
-//     org.chromium.MlDecisionService.ShouldDeferScreenDim
-//     boolean: true or false
-//
-// % (True means smart dim decides to defer the imminent screen dimming.)
-//
-// Now it only exports ShouldDeferScreenDim for powerd. New machine learning
-// related methods can be added when required.
-class MachineLearningDecisionServiceProvider
-    : public CrosDBusService::ServiceProviderInterface {
- public:
-  MachineLearningDecisionServiceProvider();
-  ~MachineLearningDecisionServiceProvider() override;
-
-  // CrosDBusService::ServiceProviderInterface overrides:
-  void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
-
- private:
-  // Called from ExportedObject when a handler is exported as a D-Bus
-  // method or failed to be exported.
-  void OnExported(const std::string& interface_name,
-                  const std::string& method_name,
-                  bool success);
-
-  // Called on UI thread in response to D-Bus requests.
-  void ShouldDeferScreenDim(
-      dbus::MethodCall* method_call,
-      dbus::ExportedObject::ResponseSender response_sender);
-
-  // Sends |defer_dimming| as the response to a ShouldDeferScreenDim method
-  // call.
-  void SendSmartDimDecision(
-      std::unique_ptr<dbus::Response> response,
-      dbus::ExportedObject::ResponseSender response_sender,
-      bool defer_dimming);
-
-  // The real provider of ShouldDeferScreenDim
-  std::unique_ptr<power::ml::UserActivityController> user_activity_controller_;
-
-  // Keep this last so that all weak pointers will be invalidated at the
-  // beginning of destruction.
-  base::WeakPtrFactory<MachineLearningDecisionServiceProvider>
-      weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(MachineLearningDecisionServiceProvider);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_DBUS_MACHINE_LEARNING_DECISION_SERVICE_PROVIDER_H_
diff --git a/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf b/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf
deleted file mode 100644
index 09f45ee..0000000
--- a/chrome/browser/chromeos/dbus/org.chromium.MachineLearningDecisionService.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
-  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<!--
-  Copyright 2019 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.
--->
-<busconfig>
-  <policy user="chronos">
-    <allow own="org.chromium.MlDecisionService"/>
-  </policy>
-
-  <!--
-    powerd uses this service to ask Chrome whether to defer the imminent screen
-    dimming.
-  -->
-  <policy user="power">
-    <allow send_destination="org.chromium.MlDecisionService"
-           send_interface="org.chromium.MlDecisionService"/>
-  </policy>
-
-  <!--
-    upstart and tast run as root.
-  -->
-  <policy user="root">
-    <allow send_destination="org.chromium.MlDecisionService"
-           send_interface="org.chromium.MlDecisionService"/>
-  </policy>
-</busconfig>
diff --git a/chrome/browser/chromeos/extensions/default_web_app_ids.h b/chrome/browser/chromeos/extensions/default_web_app_ids.h
index d403c77..bddfa529 100644
--- a/chrome/browser/chromeos/extensions/default_web_app_ids.h
+++ b/chrome/browser/chromeos/extensions/default_web_app_ids.h
@@ -19,6 +19,11 @@
 // web_app::GenerateAppIdFromURL(GURL("https://canvas.apps.chrome/")).
 constexpr char kCanvasAppId[] = "ieailfmhaghpphfffooibmlghaeopach";
 
+// Generated as
+// web_app::GenerateAppIdFromURL(GURL(
+// "https://google.com/chromebook/whatsnew/embedded/")).
+constexpr char kReleaseNotesAppId[] = "kddjchdmnnpakappplfnloipgcbioilo";
+
 }  // namespace default_web_apps
 }  // namespace chromeos
 
diff --git a/chrome/browser/chromeos/file_manager/file_tasks.cc b/chrome/browser/chromeos/file_manager/file_tasks.cc
index 1d6aeb6..340d52d5 100644
--- a/chrome/browser/chromeos/file_manager/file_tasks.cc
+++ b/chrome/browser/chromeos/file_manager/file_tasks.cc
@@ -432,6 +432,7 @@
                              WindowOpenDisposition::NEW_FOREGROUND_TAB,
                              extensions::AppLaunchSource::kSourceFileHandler);
       params.override_url = GURL(task.action_id);
+      params.launch_files = std::move(paths);
       OpenApplication(params);
     }
     if (!done.is_null())
diff --git a/chrome/browser/chromeos/login/session/chrome_session_manager.cc b/chrome/browser/chromeos/login/session/chrome_session_manager.cc
index ac52f85e..8cb8282 100644
--- a/chrome/browser/chromeos/login/session/chrome_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/chrome_session_manager.cc
@@ -207,6 +207,8 @@
   UserSessionManager::GetInstance()->CheckEolStatus(user_profile);
   tpm_firmware_update::ShowNotificationIfNeeded(user_profile);
   UserSessionManager::GetInstance()->MaybeShowU2FNotification();
+  UserSessionManager::GetInstance()->MaybeShowReleaseNotesNotification(
+      user_profile);
   g_browser_process->platform_part()
       ->browser_policy_connector_chromeos()
       ->GetTPMAutoUpdateModePolicyHandler()
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index 22b040a..975cfd1e 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -2208,6 +2208,9 @@
   // Show legacy U2F notification if applicable.
   MaybeShowU2FNotification();
 
+  // Show Release Notes notification if applicable.
+  MaybeShowReleaseNotesNotification(profile);
+
   g_browser_process->platform_part()
       ->browser_policy_connector_chromeos()
       ->GetTPMAutoUpdateModePolicyHandler()
@@ -2319,6 +2322,7 @@
   first_run::GoodiesDisplayer::Delete();
   always_on_vpn_manager_.reset();
   u2f_notification_.reset();
+  release_notes_notification_.reset();
 }
 
 void UserSessionManager::SetSwitchesForUser(
@@ -2348,6 +2352,18 @@
   }
 }
 
+void UserSessionManager::MaybeShowReleaseNotesNotification(Profile* profile) {
+  if (!base::FeatureList::IsEnabled(features::kReleaseNotes))
+    return;
+  if (!ProfileHelper::IsPrimaryProfile(profile))
+    return;
+  if (!release_notes_notification_) {
+    release_notes_notification_ =
+        std::make_unique<ReleaseNotesNotification>(profile);
+    release_notes_notification_->MaybeShowReleaseNotes();
+  }
+}
+
 void UserSessionManager::CreateTokenUtilIfMissing() {
   if (!token_handle_util_.get())
     token_handle_util_.reset(new TokenHandleUtil());
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.h b/chrome/browser/chromeos/login/session/user_session_manager.h
index 4a5d0609..c4536b4 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.h
+++ b/chrome/browser/chromeos/login/session/user_session_manager.h
@@ -28,6 +28,7 @@
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
 #include "chrome/browser/chromeos/login/signin/token_handle_util.h"
+#include "chrome/browser/chromeos/release_notes/release_notes_notification.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/chromeos/u2f_notification.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
@@ -342,6 +343,9 @@
   // Shows U2F notification if necessary.
   void MaybeShowU2FNotification();
 
+  // Shows Release Notes notification if necessary.
+  void MaybeShowReleaseNotesNotification(Profile* profile);
+
  protected:
   // Protected for testability reasons.
   UserSessionManager();
@@ -652,6 +656,8 @@
 
   std::unique_ptr<U2FNotification> u2f_notification_;
 
+  std::unique_ptr<ReleaseNotesNotification> release_notes_notification_;
+
   base::WeakPtrFactory<UserSessionManager> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(UserSessionManager);
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index e90abd2a..024214dc 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -233,6 +233,7 @@
 
   screen_name[0] = std::toupper(screen_name[0]);
   std::string histogram_name = "OOBE.StepCompletionTime." + screen_name;
+
   // Equivalent to using UMA_HISTOGRAM_MEDIUM_TIMES. UMA_HISTOGRAM_MEDIUM_TIMES
   // can not be used here, because |histogram_name| is calculated dynamically
   // and changes from call to call.
@@ -715,10 +716,8 @@
 
   VLOG(1) << "Wizard screen " << screen << " exited with code: " << exit_code;
 
-  if (IsOOBEStepToTrack(screen)) {
-    RecordUMAHistogramForOOBEStepCompletionTime(
-        screen, base::Time::Now() - screen_show_times_[screen]);
-  }
+  RecordUMAHistogramForOOBEStepCompletionTime(
+      screen, base::Time::Now() - screen_show_times_[screen]);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1301,9 +1300,8 @@
     current_screen_->SetConfiguration(nullptr);
   }
 
-  const OobeScreenId screen = new_current->screen_id();
-  if (IsOOBEStepToTrack(screen))
-    screen_show_times_[screen] = base::Time::Now();
+  // Record show time for UMA.
+  screen_show_times_[new_current->screen_id()] = base::Time::Now();
 
   previous_screen_ = current_screen_;
   current_screen_ = new_current;
@@ -1541,16 +1539,6 @@
 }
 
 // static
-bool WizardController::IsOOBEStepToTrack(OobeScreenId screen_id) {
-  return (screen_id == HIDDetectionView::kScreenId ||
-          screen_id == WelcomeView::kScreenId ||
-          screen_id == UpdateView::kScreenId ||
-          screen_id == EulaView::kScreenId ||
-          screen_id == OobeScreen::SCREEN_SPECIAL_LOGIN ||
-          screen_id == WrongHWIDScreenView::kScreenId);
-}
-
-// static
 void WizardController::SkipPostLoginScreensForTesting() {
   skip_post_login_screens_ = true;
   if (!default_controller() || !default_controller()->current_screen())
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index 77287f3..c03d9a05 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -76,9 +76,6 @@
   // If true zero delays have been enabled (for browser tests).
   static bool IsZeroDelayEnabled();
 
-  // Checks whether screen show time should be tracked with UMA.
-  static bool IsOOBEStepToTrack(OobeScreenId screen_id);
-
   // Skips any screens that may normally be shown after login (registration,
   // Terms of Service, user image selection).
   static void SkipPostLoginScreensForTesting();
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
index fe5f8f2e..23ffdc2 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager.cc
@@ -125,14 +125,11 @@
   // wait before starting the VM.
   if (vm_state_ == vm_tools::plugin_dispatcher::VmState::VM_STATE_UNKNOWN ||
       VmIsStopping(vm_state_)) {
-    ChromeLauncherController* chrome_controller =
-        ChromeLauncherController::instance();
-    // Can be null in tests.
-    if (chrome_controller) {
-      chrome_controller->GetShelfSpinnerController()->AddSpinnerToShelf(
-          kPluginVmAppId,
-          std::make_unique<ShelfSpinnerItemController>(kPluginVmAppId));
-    }
+    ChromeLauncherController::instance()
+        ->GetShelfSpinnerController()
+        ->AddSpinnerToShelf(
+            kPluginVmAppId,
+            std::make_unique<ShelfSpinnerItemController>(kPluginVmAppId));
   }
 
   // Launching Plugin Vm goes through the following steps:
@@ -182,9 +179,10 @@
                  vm_tools::plugin_dispatcher::VmState::VM_STATE_STOPPED ||
              vm_state_ ==
                  vm_tools::plugin_dispatcher::VmState::VM_STATE_SUSPENDED) {
-    // When the VM_STATE_STOPPED or VM_STATE_SUSPENDED signal is received, reset
-    // seneschal handle to indicate that it is no longer valid.
+    // The previous seneschal handle is no longer valid.
     seneschal_server_handle_ = 0;
+
+    ChromeLauncherController::instance()->Close(ash::ShelfID(kPluginVmAppId));
   }
 }
 
@@ -344,12 +342,9 @@
 void PluginVmManager::LaunchFailed(PluginVmLaunchResult result) {
   RecordPluginVmLaunchResultHistogram(result);
 
-  ChromeLauncherController* chrome_controller =
-      ChromeLauncherController::instance();
-  if (chrome_controller) {
-    chrome_controller->GetShelfSpinnerController()->CloseSpinner(
-        kPluginVmAppId);
-  }
+  ChromeLauncherController::instance()
+      ->GetShelfSpinnerController()
+      ->CloseSpinner(kPluginVmAppId);
 }
 
 }  // namespace plugin_vm
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager_unittest.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager_unittest.cc
index 6a90faf..0dc556b 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_manager_unittest.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_manager_unittest.cc
@@ -36,11 +36,16 @@
     plugin_vm_manager_ = PluginVmManager::GetForProfile(testing_profile_.get());
     display_service_ = std::make_unique<NotificationDisplayServiceTester>(
         testing_profile_.get());
+    shelf_model_ = std::make_unique<ash::ShelfModel>();
+    chrome_launcher_controller_ = std::make_unique<ChromeLauncherController>(
+        testing_profile_.get(), shelf_model_.get());
     histogram_tester_ = std::make_unique<base::HistogramTester>();
   }
 
   ~PluginVmManagerTest() override {
     histogram_tester_.reset();
+    chrome_launcher_controller_.reset();
+    shelf_model_.reset();
     display_service_.reset();
     test_helper_.reset();
     testing_profile_.reset();
@@ -61,11 +66,17 @@
         chromeos::DBusThreadManager::Get()->GetSeneschalClient());
   }
 
+  ShelfSpinnerController* SpinnerController() {
+    return chrome_launcher_controller_->GetShelfSpinnerController();
+  }
+
   content::TestBrowserThreadBundle thread_bundle_;
   std::unique_ptr<TestingProfile> testing_profile_;
   std::unique_ptr<PluginVmTestHelper> test_helper_;
   std::unique_ptr<NotificationDisplayServiceTester> display_service_;
   PluginVmManager* plugin_vm_manager_;
+  std::unique_ptr<ash::ShelfModel> shelf_model_;
+  std::unique_ptr<ChromeLauncherController> chrome_launcher_controller_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
 
  private:
@@ -143,6 +154,10 @@
   EXPECT_TRUE(IsPluginVmAllowedForProfile(testing_profile_.get()));
 
   // Signals for RUNNING, then STOPPED.
+  test_helper_->OpenShelfItem();
+  EXPECT_TRUE(
+      chrome_launcher_controller_->IsOpen(ash::ShelfID(kPluginVmAppId)));
+
   vm_tools::plugin_dispatcher::VmStateChangedSignal state_changed_signal;
   state_changed_signal.set_owner_id(
       chromeos::ProfileHelper::GetUserIdHashFromProfile(
@@ -163,6 +178,8 @@
   VmPluginDispatcherClient().NotifyVmStateChanged(state_changed_signal);
   thread_bundle_.RunUntilIdle();
   EXPECT_EQ(plugin_vm_manager_->seneschal_server_handle(), 0ul);
+  EXPECT_FALSE(
+      chrome_launcher_controller_->IsOpen(ash::ShelfID(kPluginVmAppId)));
 
   // Signals for RUNNING, then SUSPENDED.
   state_changed_signal.set_vm_state(
@@ -179,17 +196,11 @@
 }
 
 TEST_F(PluginVmManagerTest, LaunchPluginVmSpinner) {
-  ash::ShelfModel shelf_model;
-  ChromeLauncherController chrome_launcher_controller(testing_profile_.get(),
-                                                      &shelf_model);
-  ShelfSpinnerController* spinner_controller =
-      chrome_launcher_controller.GetShelfSpinnerController();
-
   test_helper_->AllowPluginVm();
   EXPECT_TRUE(IsPluginVmAllowedForProfile(testing_profile_.get()));
 
   // No spinner before doing anything
-  EXPECT_FALSE(spinner_controller->HasApp(kPluginVmAppId));
+  EXPECT_FALSE(SpinnerController()->HasApp(kPluginVmAppId));
 
   vm_tools::plugin_dispatcher::ListVmResponse list_vms_response;
   list_vms_response.add_vm_info()->set_state(
@@ -200,26 +211,21 @@
   thread_bundle_.RunUntilIdle();
 
   // Spinner exists for first launch.
-  EXPECT_TRUE(spinner_controller->HasApp(kPluginVmAppId));
-  // Under normal operation, the Plugin VM window would appear and close the
-  // spinner. Since the ShowVm call doesn't actually do this, manually close
-  // the spinner.
-  spinner_controller->CloseSpinner(kPluginVmAppId);
+  EXPECT_TRUE(SpinnerController()->HasApp(kPluginVmAppId));
+  // The actual flow would've launched a real window.
+  test_helper_->OpenShelfItem();
+  EXPECT_FALSE(SpinnerController()->HasApp(kPluginVmAppId));
+  test_helper_->CloseShelfItem();
 
   plugin_vm_manager_->LaunchPluginVm();
   thread_bundle_.RunUntilIdle();
   // A second launch shouldn't show a spinner.
-  EXPECT_FALSE(spinner_controller->HasApp(kPluginVmAppId));
+  EXPECT_FALSE(SpinnerController()->HasApp(kPluginVmAppId));
 }
 
 TEST_F(PluginVmManagerTest, LaunchPluginVmFromSuspending) {
   // We cannot start a vm in states like SUSPENDING, so the StartVm call is
   // delayed until an appropriate state change signal is received.
-  ash::ShelfModel shelf_model;
-  ChromeLauncherController chrome_launcher_controller(testing_profile_.get(),
-                                                      &shelf_model);
-  ShelfSpinnerController* spinner_controller =
-      chrome_launcher_controller.GetShelfSpinnerController();
   test_helper_->AllowPluginVm();
 
   vm_tools::plugin_dispatcher::VmStateChangedSignal state_changed_signal;
@@ -241,7 +247,7 @@
   EXPECT_TRUE(VmPluginDispatcherClient().list_vms_called());
   EXPECT_FALSE(VmPluginDispatcherClient().start_vm_called());
   EXPECT_FALSE(VmPluginDispatcherClient().show_vm_called());
-  EXPECT_TRUE(spinner_controller->HasApp(kPluginVmAppId));
+  EXPECT_TRUE(SpinnerController()->HasApp(kPluginVmAppId));
 
   // The launch process continues once the operation completes.
   state_changed_signal.set_vm_state(
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.cc
index 0b033f93..16b22bc 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.cc
@@ -4,12 +4,15 @@
 
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h"
 
+#include "ash/public/cpp/shelf_item_delegate.h"
+#include "ash/public/cpp/shelf_model.h"
 #include "base/json/json_reader.h"
 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
+#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/constants/chromeos_switches.h"
@@ -31,6 +34,22 @@
 const char kDeviceId[] = "device_id";
 const char kPluginVmImageUrl[] = "https://example.com/plugin_vm_image";
 
+// For adding a fake shelf item without requiring opening an actual window.
+class FakeShelfItemDelegate : public ash::ShelfItemDelegate {
+ public:
+  explicit FakeShelfItemDelegate(const ash::ShelfID& shelf_id)
+      : ShelfItemDelegate(shelf_id) {}
+
+  void ExecuteCommand(bool from_context_menu,
+                      int64_t command_id,
+                      int32_t event_flags,
+                      int64_t display_id) override {}
+  void Close() override {
+    ChromeLauncherController::instance()->CloseLauncherItem(
+        ash::ShelfID(kPluginVmAppId));
+  }
+};
+
 }  // namespace
 
 void SetupConciergeForSuccessfulDiskImageImport(
@@ -143,4 +162,26 @@
   ASSERT_TRUE(IsPluginVmAllowedForProfile(testing_profile_));
 }
 
+void PluginVmTestHelper::OpenShelfItem() {
+  ash::ShelfID shelf_id(kPluginVmAppId);
+  std::unique_ptr<ash::ShelfItemDelegate> delegate =
+      std::make_unique<FakeShelfItemDelegate>(shelf_id);
+  ChromeLauncherController* laucher_controller =
+      ChromeLauncherController::instance();
+  // Similar logic to InternalAppWindowShelfController, for handling pins and
+  // spinners.
+  if (laucher_controller->GetItem(shelf_id)) {
+    laucher_controller->shelf_model()->SetShelfItemDelegate(
+        shelf_id, std::move(delegate));
+    laucher_controller->SetItemStatus(shelf_id, ash::STATUS_RUNNING);
+  } else {
+    laucher_controller->CreateAppLauncherItem(std::move(delegate),
+                                              ash::STATUS_RUNNING);
+  }
+}
+
+void PluginVmTestHelper::CloseShelfItem() {
+  ChromeLauncherController::instance()->Close(ash::ShelfID(kPluginVmAppId));
+}
+
 }  // namespace plugin_vm
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h
index f3583634..86f6da36 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h
@@ -40,6 +40,10 @@
   // enterprise enrolled so that manual testing of PluginVm is easier.
   void AllowPluginVmForManualTesting();
 
+  // Fakes the Plugin VM window being opened or closed.
+  void OpenShelfItem();
+  void CloseShelfItem();
+
  private:
   TestingProfile* testing_profile_;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
diff --git a/chrome/browser/chromeos/policy/device_scheduled_update_checker.cc b/chrome/browser/chromeos/policy/device_scheduled_update_checker.cc
index 4df5d83..68015d3 100644
--- a/chrome/browser/chromeos/policy/device_scheduled_update_checker.cc
+++ b/chrome/browser/chromeos/policy/device_scheduled_update_checker.cc
@@ -112,8 +112,7 @@
       return base::TimeDelta();
   }
 
-  return base::TimeDelta::FromMillisecondsD(
-      update_checker_internal::GetDiffInMs(*update_check_cal, *cur_cal));
+  return update_checker_internal::GetDiff(*update_check_cal, *cur_cal);
 }
 
 // Calculates the next update check timer delay from |cur_time| in a weekly
@@ -176,8 +175,7 @@
     }
   }
 
-  return base::TimeDelta::FromMillisecondsD(
-      update_checker_internal::GetDiffInMs(*update_check_cal, *cur_cal));
+  return update_checker_internal::GetDiff(*update_check_cal, *cur_cal);
 }
 
 // Calculates the next update check timer delay from |cur_time| in a monthly
@@ -203,8 +201,7 @@
     return base::TimeDelta();
   }
 
-  return base::TimeDelta::FromMillisecondsD(
-      update_checker_internal::GetDiffInMs(*update_check_cal, *cur_cal));
+  return update_checker_internal::GetDiff(*update_check_cal, *cur_cal);
 }
 
 }  // namespace
@@ -285,13 +282,14 @@
   return result;
 }
 
-double GetDiffInMs(const icu::Calendar& a, const icu::Calendar& b) {
+base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b) {
   UErrorCode status = U_ZERO_ERROR;
   UDate a_ms = a.getTime(status);
   DCHECK(U_SUCCESS(status));
   UDate b_ms = b.getTime(status);
   DCHECK(U_SUCCESS(status));
-  return a_ms - b_ms;
+  DCHECK(a_ms >= b_ms);
+  return base::TimeDelta::FromMilliseconds(a_ms - b_ms);
 }
 
 std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time,
@@ -416,11 +414,14 @@
       os_and_policies_update_checker_(
           base::BindRepeating(&DeviceScheduledUpdateChecker::GetTicksSinceBoot,
                               base::Unretained(this))) {
+  chromeos::system::TimezoneSettings::GetInstance()->AddObserver(this);
   // Check if policy already exists.
   OnScheduledUpdateCheckDataChanged();
 }
 
-DeviceScheduledUpdateChecker::~DeviceScheduledUpdateChecker() = default;
+DeviceScheduledUpdateChecker::~DeviceScheduledUpdateChecker() {
+  chromeos::system::TimezoneSettings::GetInstance()->RemoveObserver(this);
+}
 
 DeviceScheduledUpdateChecker::ScheduledUpdateCheckData::
     ScheduledUpdateCheckData() = default;
@@ -451,6 +452,14 @@
                      base::Unretained(this)));
 }
 
+void DeviceScheduledUpdateChecker::TimezoneChanged(
+    const icu::TimeZone& time_zone) {
+  // Anytime the time zone changes, the update check timer delay should be
+  // recalculated and the timer should be started with updated values according
+  // to the new time zone.
+  MaybeStartUpdateCheckTimer();
+}
+
 void DeviceScheduledUpdateChecker::OnScheduledUpdateCheckDataChanged() {
   // If the policy is removed then reset all state including any existing update
   // checks.
diff --git a/chrome/browser/chromeos/policy/device_scheduled_update_checker.h b/chrome/browser/chromeos/policy/device_scheduled_update_checker.h
index b8f44b0b..ded3842d 100644
--- a/chrome/browser/chromeos/policy/device_scheduled_update_checker.h
+++ b/chrome/browser/chromeos/policy/device_scheduled_update_checker.h
@@ -24,10 +24,11 @@
 
 // This class listens for changes in the scheduled update check policy and then
 // manages recurring update checks based on the policy.
-class DeviceScheduledUpdateChecker {
+class DeviceScheduledUpdateChecker
+    : public chromeos::system::TimezoneSettings::Observer {
  public:
   explicit DeviceScheduledUpdateChecker(chromeos::CrosSettings* cros_settings);
-  virtual ~DeviceScheduledUpdateChecker();
+  ~DeviceScheduledUpdateChecker() override;
 
   // Frequency at which the update check should occur.
   enum class Frequency {
@@ -63,6 +64,9 @@
     base::TimeTicks next_update_check_time_ticks;
   };
 
+  // chromeos::system::TimezoneSettings::Observer implementation.
+  void TimezoneChanged(const icu::TimeZone& time_zone) override;
+
  protected:
   // Called when |update_check_timer_| fires. Triggers an update check and
   // schedules the next update check based on |scheduled_update_check_data_|.
@@ -147,8 +151,9 @@
 // Converts an icu::Calendar to base::Time. Assumes |time| is valid.
 base::Time IcuToBaseTime(const icu::Calendar& time);
 
-// Calculates the difference in milliseconds of |a| - |b|.
-double GetDiffInMs(const icu::Calendar& a, const icu::Calendar& b);
+// Calculates the difference in milliseconds of |a| - |b|. Caller has to ensure
+// |a| >= |b|.
+base::TimeDelta GetDiff(const icu::Calendar& a, const icu::Calendar& b);
 
 // Converts |cur_time| to ICU time in the time zone |tz|.
 std::unique_ptr<icu::Calendar> ConvertUtcToTzIcuTime(base::Time cur_time,
diff --git a/chrome/browser/chromeos/policy/device_scheduled_update_checker_unittest.cc b/chrome/browser/chromeos/policy/device_scheduled_update_checker_unittest.cc
index 5f8958c3..28679a4 100644
--- a/chrome/browser/chromeos/policy/device_scheduled_update_checker_unittest.cc
+++ b/chrome/browser/chromeos/policy/device_scheduled_update_checker_unittest.cc
@@ -37,6 +37,8 @@
 
 // Time zones that will be used in tests.
 constexpr char kESTTimeZoneID[] = "America/New_York";
+constexpr char kISTTimeZoneID[] = "Asia/Kolkata";
+constexpr char kPSTTimeZoneID[] = "America/Los_Angeles";
 
 void DecodeJsonStringAndNormalize(const std::string& json_string,
                                   base::Value* value) {
@@ -98,6 +100,54 @@
   return "SATURDAY";
 }
 
+// Sets |output|'s time of day to |input|'s. Assume's |input| is valid.
+void SetTimeOfDay(const icu::Calendar& input, icu::Calendar* output) {
+  // Getting each of these properties should succeed if |input| is valid.
+  UErrorCode status = U_ZERO_ERROR;
+  int32_t hour = input.get(UCAL_HOUR_OF_DAY, status);
+  ASSERT_TRUE(U_SUCCESS(status));
+  int32_t minute = input.get(UCAL_MINUTE, status);
+  ASSERT_TRUE(U_SUCCESS(status));
+  int32_t seconds = input.get(UCAL_SECOND, status);
+  ASSERT_TRUE(U_SUCCESS(status));
+  int32_t ms = input.get(UCAL_MILLISECOND, status);
+  ASSERT_TRUE(U_SUCCESS(status));
+
+  output->set(UCAL_HOUR_OF_DAY, hour);
+  output->set(UCAL_MINUTE, minute);
+  output->set(UCAL_SECOND, seconds);
+  output->set(UCAL_MILLISECOND, ms);
+}
+
+// Calculates |cur_time + delay| in |old_tz|. Then gets the same time of day
+// (hours:minutes:seconds:ms) in |new_tz|. Returns the delay between |cur_time|
+// and |new_tz|. |delay| must be non-zero.
+base::TimeDelta CalculateTimerExpirationDelayInDailyPolicyForTimeZone(
+    base::Time cur_time,
+    base::TimeDelta delay,
+    const icu::TimeZone& old_tz,
+    const icu::TimeZone& new_tz) {
+  DCHECK(!delay.is_zero());
+
+  auto cur_time_utc_cal = update_checker_internal::ConvertUtcToTzIcuTime(
+      cur_time, *icu::TimeZone::getGMT());
+
+  auto old_tz_timer_expiration_cal =
+      update_checker_internal::ConvertUtcToTzIcuTime(cur_time + delay, old_tz);
+
+  auto new_tz_timer_expiration_cal =
+      update_checker_internal::ConvertUtcToTzIcuTime(cur_time, new_tz);
+  SetTimeOfDay(*old_tz_timer_expiration_cal, new_tz_timer_expiration_cal.get());
+
+  base::TimeDelta result = update_checker_internal::GetDiff(
+      *new_tz_timer_expiration_cal, *cur_time_utc_cal);
+  // If the update check time in the new time zone has already passed then it
+  // will happen on the next day.
+  if (result <= base::TimeDelta())
+    result += base::TimeDelta::FromDays(1);
+  return result;
+}
+
 }  // namespace
 
 class DeviceScheduledUpdateCheckerForTest
@@ -131,6 +181,7 @@
 
   void SetTimeZone(std::unique_ptr<icu::TimeZone> time_zone) {
     time_zone_ = std::move(time_zone);
+    DeviceScheduledUpdateChecker::TimezoneChanged(*time_zone_);
   }
 
   base::Time GetCurrentTime() override { return clock_->Now(); }
@@ -380,6 +431,81 @@
                           std::move(update_check_icu_time));
   }
 
+  // Checks if a time zone change to |tz_id| recalculates and sets the correct
+  // update check timer. Returns false if |tz_id| is the same as the current
+  // time zone or on a scheduling error.
+  bool CheckRecalculationOnTimezoneChange(const std::string& new_tz_id) {
+    base::Time cur_time = device_scheduled_update_checker_->GetCurrentTime();
+    const icu::TimeZone& cur_tz =
+        device_scheduled_update_checker_->GetTimeZone();
+    auto new_tz = base::WrapUnique(
+        icu::TimeZone::createTimeZone(icu::UnicodeString::fromUTF8(new_tz_id)));
+    if (cur_tz == *new_tz) {
+      ADD_FAILURE() << "New time zone same as current time zone: " << new_tz_id;
+      return false;
+    }
+
+    base::TimeDelta delay_from_now = base::TimeDelta::FromHours(1);
+    // If the timer is set to expire at 5PM in |cur_tz| then changing time zones
+    // means that the new timer would expire at 5PM in |new_tz| as well. This
+    // delay is the delay between the new time zone's timer expiration time and
+    // |cur_time|.
+    base::TimeDelta new_tz_timer_expiration_delay =
+        CalculateTimerExpirationDelayInDailyPolicyForTimeZone(
+            cur_time, delay_from_now, cur_tz, *new_tz);
+    EXPECT_FALSE(new_tz_timer_expiration_delay <= base::TimeDelta());
+
+    // Set daily policy to start update check one hour from now.
+    int expected_update_checks = 0;
+    int expected_update_check_requests = 0;
+    int expected_update_check_completions = 0;
+    auto policy_and_next_update_check_time = CreatePolicy(
+        delay_from_now, DeviceScheduledUpdateChecker::Frequency::kDaily);
+    cros_settings_.device_settings()->Set(
+        chromeos::kDeviceScheduledUpdateCheck,
+        std::move(policy_and_next_update_check_time.first));
+    if (!CheckStats(expected_update_checks, expected_update_check_requests,
+                    expected_update_check_completions)) {
+      ADD_FAILURE() << "Incorrect stats after policy set";
+      return false;
+    }
+
+    // Change the time zone. This should change the time at which the timer
+    // should expire.
+    device_scheduled_update_checker_->SetTimeZone(std::move(new_tz));
+
+    // Fast forward right before the new time zone's expected timer expiration
+    // time and check if no new events happened.
+    const base::TimeDelta small_delay = base::TimeDelta::FromMilliseconds(1);
+    scoped_task_environment_.FastForwardBy(new_tz_timer_expiration_delay -
+                                           small_delay);
+    if (!CheckStats(expected_update_checks, expected_update_check_requests,
+                    expected_update_check_completions)) {
+      ADD_FAILURE()
+          << "Incorrect stats just before the new time zone expiration";
+      return false;
+    }
+
+    // Fast forward to the new time zone's expected timer expiration time and
+    // check if the timer expiration and update check happens.
+    expected_update_checks += 1;
+    expected_update_check_requests += 1;
+    expected_update_check_completions += 1;
+    scoped_task_environment_.FastForwardBy(small_delay);
+    // Simulate update check succeeding.
+    NotifyUpdateCheckStatus(
+        chromeos::UpdateEngineClient::UpdateStatusOperation::
+            UPDATE_STATUS_UPDATED_NEED_REBOOT);
+    if (!CheckStats(expected_update_checks, expected_update_check_requests,
+                    expected_update_check_completions)) {
+      ADD_FAILURE()
+          << "Incorrect stats just after the expected new time zone expiration";
+      return false;
+    }
+
+    return true;
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<DeviceScheduledUpdateCheckerForTest>
       device_scheduled_update_checker_;
@@ -772,4 +898,18 @@
                          expected_update_check_completions));
 }
 
+// Checks if a time zone change successfully recalculates update check timer
+// expiration delays when time zone moves forward.
+TEST_F(DeviceScheduledUpdateCheckerTest,
+       CheckRecalculationOnForwardTimezoneChange) {
+  EXPECT_TRUE(CheckRecalculationOnTimezoneChange(kISTTimeZoneID));
+}
+
+// Checks if a time zone change successfully recalculates update check timer
+// expiration delays when time zone moves backward.
+TEST_F(DeviceScheduledUpdateCheckerTest,
+       CheckRecalculationOnBackwardTimezoneChange) {
+  EXPECT_TRUE(CheckRecalculationOnTimezoneChange(kPSTTimeZoneID));
+}
+
 }  // namespace policy
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
index e667b8af..ba1a427 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
@@ -467,6 +467,11 @@
         metrics_reporter_->SetDeviceClass(MetricsReporter::DeviceClass::kAtlas);
         return;
       }
+      if (params_.metrics_key == "nocturne") {
+        metrics_reporter_->SetDeviceClass(
+            MetricsReporter::DeviceClass::kNocturne);
+        return;
+      }
       metrics_reporter_->SetDeviceClass(
           MetricsReporter::DeviceClass::kSupportedAls);
       return;
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.cc
index 28a97e8..3f5a3c6 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.cc
@@ -29,6 +29,7 @@
         prefs::kAutoScreenBrightnessMetricsUnsupportedAlsUserAdjustmentCount,
         prefs::kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount,
         prefs::kAutoScreenBrightnessMetricsEveUserAdjustmentCount,
+        prefs::kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount,
 };
 
 // Histograms corresponding to UserAdjustment values.
@@ -39,6 +40,7 @@
         MetricsReporter::kUnsupportedAlsUserAdjustmentName,
         MetricsReporter::kAtlasUserAdjustmentName,
         MetricsReporter::kEveUserAdjustmentName,
+        MetricsReporter::kNocturneUserAdjustmentName,
 };
 
 }  // namespace
@@ -49,6 +51,7 @@
 constexpr char MetricsReporter::kUnsupportedAlsUserAdjustmentName[];
 constexpr char MetricsReporter::kAtlasUserAdjustmentName[];
 constexpr char MetricsReporter::kEveUserAdjustmentName[];
+constexpr char MetricsReporter::kNocturneUserAdjustmentName[];
 
 constexpr int MetricsReporter::kNumberDeviceClasses;
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.h b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.h
index ac76883..d1b558d 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.h
@@ -33,7 +33,8 @@
     kUnsupportedAls = 2,
     kAtlas = 3,
     kEve = 4,
-    kMaxValue = kEve
+    kNocturne = 5,
+    kMaxValue = kNocturne
   };
 
   static constexpr int kNumberDeviceClasses =
@@ -55,6 +56,8 @@
       "AutoScreenBrightness.DailyUserAdjustment.Atlas";
   static constexpr char kEveUserAdjustmentName[] =
       "AutoScreenBrightness.DailyUserAdjustment.Eve";
+  static constexpr char kNocturneUserAdjustmentName[] =
+      "AutoScreenBrightness.DailyUserAdjustment.Nocturne";
 
   // Registers prefs used by MetricsReporter in |registry|.
   static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter_unittest.cc
index 9d2e50b1..5cda3fe 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter_unittest.cc
@@ -26,6 +26,7 @@
 constexpr auto kUnsupportedAls = MetricsReporter::DeviceClass::kUnsupportedAls;
 constexpr auto kAtlas = MetricsReporter::DeviceClass::kAtlas;
 constexpr auto kEve = MetricsReporter::DeviceClass::kEve;
+constexpr auto kNocturne = MetricsReporter::DeviceClass::kNocturne;
 
 }  // namespace
 
@@ -124,6 +125,15 @@
   SendOnUserBrightnessChangeRequested();
   TriggerDailyEventAndVerifyHistograms(MetricsReporter::kEveUserAdjustmentName,
                                        2);
+
+  // Four with Nocturne.
+  ResetReporter(kNocturne);
+  SendOnUserBrightnessChangeRequested();
+  SendOnUserBrightnessChangeRequested();
+  SendOnUserBrightnessChangeRequested();
+  SendOnUserBrightnessChangeRequested();
+  TriggerDailyEventAndVerifyHistograms(
+      MetricsReporter::kNocturneUserAdjustmentName, 4);
 }
 
 TEST_F(MetricsReporterTest, LoadInitialCountsFromPrefs) {
@@ -137,6 +147,8 @@
       prefs::kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount, 2);
   pref_service_.SetInteger(
       prefs::kAutoScreenBrightnessMetricsEveUserAdjustmentCount, 4);
+  pref_service_.SetInteger(
+      prefs::kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount, 3);
   ResetReporter(kAtlas);
 
   TriggerDailyEventAndVerifyHistograms(
@@ -160,10 +172,11 @@
                           0);
   tester.ExpectTotalCount(MetricsReporter::kAtlasUserAdjustmentName, 0);
   tester.ExpectTotalCount(MetricsReporter::kEveUserAdjustmentName, 0);
+  tester.ExpectTotalCount(MetricsReporter::kNocturneUserAdjustmentName, 0);
 }
 
 TEST_F(MetricsReporterTest, IgnoreDailyEventClockChanged) {
-  ResetReporter(kAtlas);
+  ResetReporter(kNocturne);
   SendOnUserBrightnessChangeRequested();
 
   // metrics::DailyEvent notifies observers if it sees that the system clock has
@@ -176,11 +189,12 @@
                           0);
   tester.ExpectTotalCount(MetricsReporter::kAtlasUserAdjustmentName, 0);
   tester.ExpectTotalCount(MetricsReporter::kEveUserAdjustmentName, 0);
+  tester.ExpectTotalCount(MetricsReporter::kNocturneUserAdjustmentName, 0);
 
   // The existing stats should be cleared when the clock change notification is
   // received, so the next report should only contain zeros.
   TriggerDailyEventAndVerifyHistograms(
-      MetricsReporter::kAtlasUserAdjustmentName, 0);
+      MetricsReporter::kNocturneUserAdjustmentName, 0);
 }
 
 }  // namespace auto_screen_brightness
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
index ac19405..ebfc464a 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier.cc
@@ -92,6 +92,16 @@
   boot_clock_ = std::move(test_boot_clock);
 }
 
+void IdleEventNotifier::AddObserver(Observer* observer) {
+  DCHECK(observer);
+  observers_.AddObserver(observer);
+}
+
+void IdleEventNotifier::RemoveObserver(Observer* observer) {
+  DCHECK(observer);
+  observers_.RemoveObserver(observer);
+}
+
 void IdleEventNotifier::LidEventReceived(
     chromeos::PowerManagerClient::LidState state,
     const base::TimeTicks& /* timestamp */) {
@@ -109,6 +119,15 @@
   }
 }
 
+void IdleEventNotifier::ScreenDimImminent() {
+  // powerd should not dim the screen if video is playing.
+  DCHECK(!video_playing_);
+  const ActivityData data = ConvertActivityData(*internal_data_);
+
+  for (auto& observer : observers_)
+    observer.OnIdleEventObserved(data);
+  ResetTimestampsForRecentActivity();
+}
 
 void IdleEventNotifier::SuspendDone(const base::TimeDelta& sleep_duration) {
   // SuspendDone is triggered by user opening the lid (or other user
@@ -169,16 +188,6 @@
   UpdateActivityData(ActivityType::VIDEO);
 }
 
-IdleEventNotifier::ActivityData IdleEventNotifier::GetActivityDataAndReset() {
-  const ActivityData data = ConvertActivityData(*internal_data_);
-  ResetTimestampsForRecentActivity();
-  return data;
-}
-
-IdleEventNotifier::ActivityData IdleEventNotifier::GetActivityData() const {
-  return ConvertActivityData(*internal_data_);
-}
-
 IdleEventNotifier::ActivityData IdleEventNotifier::ConvertActivityData(
     const ActivityDataInternal& internal_data) const {
   const base::TimeDelta time_since_boot = boot_clock_->GetTimeSinceBoot();
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier.h b/chrome/browser/chromeos/power/ml/idle_event_notifier.h
index 5b70648..cbd0adb 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier.h
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier.h
@@ -95,6 +95,15 @@
     int touch_events_in_last_hour = 0;
   };
 
+  class Observer {
+   public:
+    // Called when an idle event is observed.
+    virtual void OnIdleEventObserved(const ActivityData& activity_data) = 0;
+
+   protected:
+    virtual ~Observer() {}
+  };
+
   IdleEventNotifier(PowerManagerClient* power_client,
                     ui::UserActivityDetector* detector,
                     viz::mojom::VideoDetectorObserverRequest request);
@@ -105,10 +114,15 @@
                           base::Clock* test_clock,
                           std::unique_ptr<BootClock> test_boot_clock);
 
+  // Adds or removes an observer.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
   // chromeos::PowerManagerClient::Observer overrides:
   void LidEventReceived(chromeos::PowerManagerClient::LidState state,
                         const base::TimeTicks& timestamp) override;
   void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
+  void ScreenDimImminent() override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
   // ui::UserActivityObserver overrides:
@@ -118,14 +132,6 @@
   void OnVideoActivityStarted() override;
   void OnVideoActivityEnded() override;
 
-  // Called in UserActivityController::ShouldDeferScreenDim to prepare activity
-  // data for making Smart Dim decision.
-  ActivityData GetActivityDataAndReset();
-
-  // Get activity data only, do not mutate the class, may be used by machine
-  // learning internal page.
-  ActivityData GetActivityData() const;
-
  private:
   FRIEND_TEST_ALL_PREFIXES(IdleEventNotifierTest, CheckInitialValues);
   friend class IdleEventNotifierTest;
diff --git a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
index 0fb267a..a954951 100644
--- a/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/idle_event_notifier_unittest.cc
@@ -24,19 +24,6 @@
 
 namespace {
 
-base::TimeDelta GetTimeSinceMidnight(base::Time time) {
-  return time - time.LocalMidnight();
-}
-
-UserActivityEvent_Features_DayOfWeek GetDayOfWeek(base::Time time) {
-  base::Time::Exploded exploded;
-  time.LocalExplode(&exploded);
-  return static_cast<UserActivityEvent_Features_DayOfWeek>(
-      exploded.day_of_week);
-}
-
-}  // namespace
-
 bool operator==(const IdleEventNotifier::ActivityData& x,
                 const IdleEventNotifier::ActivityData& y) {
   return x.last_activity_day == y.last_activity_day &&
@@ -53,6 +40,42 @@
          x.touch_events_in_last_hour == y.touch_events_in_last_hour;
 }
 
+base::TimeDelta GetTimeSinceMidnight(base::Time time) {
+  return time - time.LocalMidnight();
+}
+
+UserActivityEvent_Features_DayOfWeek GetDayOfWeek(base::Time time) {
+  base::Time::Exploded exploded;
+  time.LocalExplode(&exploded);
+  return static_cast<UserActivityEvent_Features_DayOfWeek>(
+      exploded.day_of_week);
+}
+
+class TestObserver : public IdleEventNotifier::Observer {
+ public:
+  TestObserver() : idle_event_count_(0) {}
+  ~TestObserver() override {}
+
+  int idle_event_count() const { return idle_event_count_; }
+  const IdleEventNotifier::ActivityData& activity_data() const {
+    return activity_data_;
+  }
+
+  // IdleEventNotifier::Observer overrides:
+  void OnIdleEventObserved(
+      const IdleEventNotifier::ActivityData& activity_data) override {
+    ++idle_event_count_;
+    activity_data_ = activity_data;
+  }
+
+ private:
+  int idle_event_count_;
+  IdleEventNotifier::ActivityData activity_data_;
+  DISALLOW_COPY_AND_ASSIGN(TestObserver);
+};
+
+}  // namespace
+
 class IdleEventNotifierTest : public testing::Test {
  public:
   IdleEventNotifierTest()
@@ -74,6 +97,7 @@
         const_cast<base::Clock*>(scoped_task_env_.GetMockClock()),
         std::make_unique<FakeBootClock>(&scoped_task_env_,
                                         base::TimeDelta::FromSeconds(10)));
+    idle_event_notifier_->AddObserver(&test_observer_);
     ac_power_.set_external_power(
         power_manager::PowerSupplyProperties_ExternalPower_AC);
     disconnected_power_.set_external_power(
@@ -86,8 +110,21 @@
   }
 
  protected:
+  void ReportScreenDimImminent() {
+    FakePowerManagerClient::Get()->SendScreenDimImminent();
+  }
+
+  void ReportIdleEventAndCheckResults(
+      int expected_idle_count,
+      const IdleEventNotifier::ActivityData& expected_activity_data) {
+    ReportScreenDimImminent();
+    EXPECT_EQ(expected_idle_count, test_observer_.idle_event_count());
+    EXPECT_TRUE(expected_activity_data == test_observer_.activity_data());
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_env_;
 
+  TestObserver test_observer_;
   std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
   power_manager::PowerSupplyProperties ac_power_;
   power_manager::PowerSupplyProperties disconnected_power_;
@@ -114,7 +151,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // PowerChanged signal is received but source isn't changed, so it won't change
@@ -128,11 +165,11 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
   idle_event_notifier_->PowerChanged(ac_power_);
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data);
 }
 
 // PowerChanged signal is received and source is changed, so a different
@@ -146,7 +183,7 @@
   data_1.last_activity_time_of_day = time_of_day_1;
   data_1.last_user_activity_time_of_day = time_of_day_1;
   data_1.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(100));
   base::Time now_2 = scoped_task_env_.GetMockClock()->Now();
@@ -157,7 +194,7 @@
   data_2.last_activity_time_of_day = time_of_day_2;
   data_2.last_user_activity_time_of_day = time_of_day_2;
   data_2.recent_time_active = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 // Short sleep duration does not break up recent time active.
@@ -178,7 +215,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = now_2 - now_1;
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // Long sleep duration recalc recent time active.
@@ -201,7 +238,7 @@
   data.last_activity_time_of_day = time_of_day;
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = now_2 - now_1;
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityKey) {
@@ -217,7 +254,7 @@
   data.time_since_last_key = base::TimeDelta::FromSeconds(10);
   data.key_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityMouse) {
@@ -235,7 +272,7 @@
   data.time_since_last_mouse = base::TimeDelta::FromSeconds(10);
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserActivityOther) {
@@ -251,7 +288,7 @@
   data.last_user_activity_time_of_day = time_of_day;
   data.recent_time_active = base::TimeDelta();
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 // Two consecutive activities separated by 2sec only. Only 1 idle event with
@@ -279,7 +316,7 @@
   data.key_events_in_last_hour = 1;
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, ActivityAfterVideoStarts) {
@@ -306,7 +343,7 @@
   data.time_since_video_ended = base::TimeDelta::FromSeconds(10);
   data.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, IdleEventFieldReset) {
@@ -331,7 +368,7 @@
   data_1.key_events_in_last_hour = 1;
   data_1.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   idle_event_notifier_->PowerChanged(ac_power_);
   base::Time now_3 = scoped_task_env_.GetMockClock()->Now();
@@ -348,7 +385,7 @@
   data_2.key_events_in_last_hour = 1;
   data_2.mouse_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(20));
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, TwoConsecutiveVideoPlaying) {
@@ -384,7 +421,7 @@
   data.time_since_video_ended =
       base::TimeDelta::FromSeconds(25) + now_3 - now_2;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(25));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingFarApartOneIdleEvent) {
@@ -419,7 +456,7 @@
   data.video_playing_time = now_3 - now_2;
   data.time_since_video_ended = base::TimeDelta::FromSeconds(25);
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(25));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingFarApartTwoIdleEvents) {
@@ -441,7 +478,7 @@
       IdleEventNotifier::kIdleDelay + base::TimeDelta::FromSeconds(10);
   scoped_task_env_.FastForwardBy(IdleEventNotifier::kIdleDelay +
                                  base::TimeDelta::FromSeconds(10));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   base::Time now_3 = scoped_task_env_.GetMockClock()->Now();
   idle_event_notifier_->OnVideoActivityStarted();
@@ -455,7 +492,7 @@
   data_2.recent_time_active = now_4 - now_3;
   data_2.video_playing_time = now_4 - now_3;
   data_2.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, TwoVideoPlayingSeparatedByAnIdleEvent) {
@@ -475,7 +512,7 @@
   data_1.video_playing_time = kNow2 - kNow1;
   data_1.time_since_video_ended = base::TimeDelta::FromSeconds(1);
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(1));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   const base::Time kNow3 = scoped_task_env_.GetMockClock()->Now();
   idle_event_notifier_->OnVideoActivityStarted();
@@ -489,7 +526,7 @@
   data_2.recent_time_active = kNow4 - kNow3;
   data_2.video_playing_time = kNow4 - kNow3;
   data_2.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 TEST_F(IdleEventNotifierTest, VideoPlayingPausedByShortSuspend) {
@@ -511,7 +548,7 @@
   data.recent_time_active = now_3 - now_1;
   data.video_playing_time = now_3 - now_1;
   data.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, VideoPlayingPausedByLongSuspend) {
@@ -532,7 +569,7 @@
   data.recent_time_active = now_2 - now_1;
   data.video_playing_time = now_2 - now_1;
   data.time_since_video_ended = base::TimeDelta();
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserInputEventsOneIdleEvent) {
@@ -595,7 +632,7 @@
   data.touch_events_in_last_hour = 3;
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(30));
-  EXPECT_EQ(data, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data);
 }
 
 TEST_F(IdleEventNotifierTest, UserInputEventsTwoIdleEvents) {
@@ -617,7 +654,7 @@
   data_1.time_since_last_key = base::TimeDelta::FromSeconds(30);
   data_1.key_events_in_last_hour = 1;
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromSeconds(30));
-  EXPECT_EQ(data_1, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(1, data_1);
 
   scoped_task_env_.FastForwardBy(base::TimeDelta::FromMinutes(11));
   base::Time last_key_time = scoped_task_env_.GetMockClock()->Now();
@@ -664,7 +701,7 @@
   data_2.mouse_events_in_last_hour = 2;
   data_2.touch_events_in_last_hour = 3;
 
-  EXPECT_EQ(data_2, idle_event_notifier_->GetActivityDataAndReset());
+  ReportIdleEventAndCheckResults(2, data_2);
 }
 
 }  // namespace ml
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.cc b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
index d4b1bb08..32345e5 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
@@ -44,8 +44,9 @@
 
   viz::mojom::VideoDetectorObserverPtr video_observer_user_logger;
   user_activity_manager_ = std::make_unique<UserActivityManager>(
-      &user_activity_ukm_logger_, detector, power_manager_client,
-      session_manager, mojo::MakeRequest(&video_observer_user_logger),
+      &user_activity_ukm_logger_, idle_event_notifier_.get(), detector,
+      power_manager_client, session_manager,
+      mojo::MakeRequest(&video_observer_user_logger),
       chromeos::ChromeUserManager::Get(), &smart_dim_model_);
   aura::Env::GetInstance()
       ->context_factory_private()
@@ -55,12 +56,6 @@
 
 UserActivityController::~UserActivityController() = default;
 
-void UserActivityController::ShouldDeferScreenDim(
-    base::OnceCallback<void(bool)> callback) {
-  user_activity_manager_->UpdateAndGetSmartDimDecision(
-      idle_event_notifier_->GetActivityDataAndReset(), std::move(callback));
-}
-
 }  // namespace ml
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.h b/chrome/browser/chromeos/power/ml/user_activity_controller.h
index 30e2ba0..e1c3325 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "base/callback.h"
 #include "chrome/browser/chromeos/power/ml/idle_event_notifier.h"
 #include "chrome/browser/chromeos/power/ml/smart_dim/model_impl.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_manager.h"
@@ -25,10 +24,6 @@
   UserActivityController();
   ~UserActivityController();
 
-  // Prepares features, makes smart dim decision and returns the result via
-  // |callback|.
-  void ShouldDeferScreenDim(base::OnceCallback<void(bool)> callback);
-
  private:
   std::unique_ptr<IdleEventNotifier> idle_event_notifier_;
   UserActivityUkmLoggerImpl user_activity_ukm_logger_;
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index c65e4a7..f7b9e77 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -88,9 +88,6 @@
 
 }  // namespace
 
-// TODO(alanlxl): Fix the variable names and comments related to screen dim
-// imminent signals, because after powerd refactor (https://crrev.com/c/1601992)
-// ScreenDimImminent signals are deprecated.
 struct UserActivityManager::PreviousIdleEventData {
   // Gap between two ScreenDimImminent signals.
   base::TimeDelta dim_imminent_signal_interval;
@@ -104,6 +101,7 @@
 
 UserActivityManager::UserActivityManager(
     UserActivityUkmLogger* ukm_logger,
+    IdleEventNotifier* idle_event_notifier,
     ui::UserActivityDetector* detector,
     chromeos::PowerManagerClient* power_manager_client,
     session_manager::SessionManager* session_manager,
@@ -113,6 +111,7 @@
     : boot_clock_(std::make_unique<RealBootClock>()),
       ukm_logger_(ukm_logger),
       smart_dim_model_(smart_dim_model),
+      idle_event_observer_(this),
       user_activity_observer_(this),
       power_manager_client_observer_(this),
       session_manager_observer_(this),
@@ -122,6 +121,8 @@
       power_manager_client_(power_manager_client),
       weak_ptr_factory_(this) {
   DCHECK(ukm_logger_);
+  DCHECK(idle_event_notifier);
+  idle_event_observer_.Add(idle_event_notifier);
 
   DCHECK(detector);
   user_activity_observer_.Add(detector);
@@ -236,17 +237,16 @@
                 UserActivityEvent::Event::VIDEO_ACTIVITY);
 }
 
-void UserActivityManager::UpdateAndGetSmartDimDecision(
-    const IdleEventNotifier::ActivityData& activity_data,
-    base::OnceCallback<void(bool)> callback) {
+void UserActivityManager::OnIdleEventObserved(
+    const IdleEventNotifier::ActivityData& activity_data) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::TimeDelta now = boot_clock_->GetTimeSinceBoot();
   if (waiting_for_final_action_) {
     if (waiting_for_model_decision_) {
       CancelDimDecisionRequest();
     } else {
-      // Smart dim request comes again after an earlier request event without
-      // any user action/suspend in between.
+      // ScreenDimImminent is received again after an earlier ScreenDimImminent
+      // event without any user action/suspend in between.
       PopulatePreviousEventData(now);
     }
   }
@@ -273,15 +273,13 @@
     waiting_for_model_decision_ = true;
     time_dim_decision_requested_ = base::TimeTicks::Now();
     smart_dim_model_->RequestDimDecision(
-        features_,
-        base::BindOnce(&UserActivityManager::HandleSmartDimDecision,
-                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+        features_, base::Bind(&UserActivityManager::ApplyDimDecision,
+                              weak_ptr_factory_.GetWeakPtr()));
   }
   waiting_for_final_action_ = true;
 }
 
-void UserActivityManager::HandleSmartDimDecision(
-    base::OnceCallback<void(bool)> callback,
+void UserActivityManager::ApplyDimDecision(
     UserActivityEvent::ModelPrediction prediction) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   waiting_for_model_decision_ = false;
@@ -293,6 +291,7 @@
   // previously deferred.
   if (prediction.response() == UserActivityEvent::ModelPrediction::NO_DIM &&
       !dim_deferred_) {
+    power_manager_client_->DeferScreenDim();
     dim_deferred_ = true;
     prediction.set_model_applied(true);
   } else {
@@ -302,8 +301,8 @@
                                      UserActivityEvent::ModelPrediction::DIM &&
                                  !dim_deferred_);
   }
+
   model_prediction_ = prediction;
-  std::move(callback).Run(dim_deferred_);
 }
 
 void UserActivityManager::OnSessionManagerDestroyed() {
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.h b/chrome/browser/chromeos/power/ml/user_activity_manager.h
index 80394c74..e49283e 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.h
@@ -74,11 +74,13 @@
 // Logs user activity after an idle event is observed.
 // TODO(renjieliu): Add power-related activity as well.
 class UserActivityManager : public ui::UserActivityObserver,
+                            public IdleEventNotifier::Observer,
                             public PowerManagerClient::Observer,
                             public viz::mojom::VideoDetectorObserver,
                             public session_manager::SessionManagerObserver {
  public:
   UserActivityManager(UserActivityUkmLogger* ukm_logger,
+                      IdleEventNotifier* idle_event_notifier,
                       ui::UserActivityDetector* detector,
                       chromeos::PowerManagerClient* power_manager_client,
                       session_manager::SessionManager* session_manager,
@@ -106,15 +108,13 @@
   void OnVideoActivityStarted() override;
   void OnVideoActivityEnded() override {}
 
-  // Called in UserActivityController::ShouldDeferScreenDim to make smart dim
-  // decision and response via |callback|.
-  void UpdateAndGetSmartDimDecision(const IdleEventNotifier::ActivityData& data,
-                                    base::OnceCallback<void(bool)> callback);
+  // IdleEventNotifier::Observer overrides.
+  void OnIdleEventObserved(
+      const IdleEventNotifier::ActivityData& data) override;
 
-  // Converts a Smart Dim model |prediction| into a yes/no decision about
-  // whether to defer the screen dim and provides the result via |callback|.
-  void HandleSmartDimDecision(base::OnceCallback<void(bool)> callback,
-                              UserActivityEvent::ModelPrediction prediction);
+  // Decides whether or not to instruct the power manager to dim the screen
+  // given a |prediction| from the Smart Dim predictor.
+  void ApplyDimDecision(UserActivityEvent::ModelPrediction prediction);
 
   // session_manager::SessionManagerObserver overrides:
   void OnSessionManagerDestroyed() override;
@@ -194,6 +194,8 @@
 
   SmartDimModel* const smart_dim_model_;
 
+  ScopedObserver<IdleEventNotifier, IdleEventNotifier::Observer>
+      idle_event_observer_;
   ScopedObserver<ui::UserActivityDetector, ui::UserActivityObserver>
       user_activity_observer_;
   ScopedObserver<chromeos::PowerManagerClient,
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
index e471312..2c0e9b8 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
@@ -184,10 +184,13 @@
 
     PowerManagerClient::InitializeFake();
     viz::mojom::VideoDetectorObserverPtr observer;
+    idle_event_notifier_ = std::make_unique<IdleEventNotifier>(
+        PowerManagerClient::Get(), &user_activity_detector_,
+        mojo::MakeRequest(&observer));
     activity_logger_ = std::make_unique<UserActivityManager>(
-        &delegate_, &user_activity_detector_, PowerManagerClient::Get(),
-        &session_manager_, mojo::MakeRequest(&observer), &fake_user_manager_,
-        &model_);
+        &delegate_, idle_event_notifier_.get(), &user_activity_detector_,
+        PowerManagerClient::Get(), &session_manager_,
+        mojo::MakeRequest(&observer), &fake_user_manager_, &model_);
     activity_logger_->SetTaskRunnerForTesting(
         thread_bundle()->GetMainThreadTaskRunner(),
         std::make_unique<FakeBootClock>(thread_bundle(),
@@ -196,6 +199,7 @@
 
   void TearDown() override {
     activity_logger_.reset();
+    idle_event_notifier_.reset();
     PowerManagerClient::Shutdown();
     ChromeRenderViewHostTestHarness::TearDown();
   }
@@ -205,17 +209,8 @@
     activity_logger_->OnUserActivity(event);
   }
 
-  // Requests a smart dim decision from UserActivityManager based on |data|.
-  // Populates |*should_defer| with the result once it is provided.
-  void ReportIdleEvent(const IdleEventNotifier::ActivityData& data,
-                       bool* should_defer = nullptr) {
-    activity_logger_->UpdateAndGetSmartDimDecision(
-        data, base::BindOnce(
-                  [](bool* should_defer, bool decision) {
-                    if (should_defer)
-                      *should_defer = decision;
-                  },
-                  should_defer));
+  void ReportIdleEvent(const IdleEventNotifier::ActivityData& data) {
+    activity_logger_->OnIdleEventObserved(data);
   }
 
   void ReportLidEvent(chromeos::PowerManagerClient::LidState state) {
@@ -265,6 +260,10 @@
     FakePowerManagerClient::Get()->SetInactivityDelays(proto);
   }
 
+  int GetNumberOfDeferredDims() {
+    return FakePowerManagerClient::Get()->num_defer_screen_dim_calls();
+  }
+
   TabProperty UpdateOpenTabURL() {
     return activity_logger_->UpdateOpenTabURL();
   }
@@ -987,11 +986,10 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1028,10 +1026,9 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1054,13 +1051,12 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   // Report user activity immediately after the idle event, so that
   // the SmartDimModel doesn't get a chance to run.
   ReportUserActivity(nullptr);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string hist_complete("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(hist_complete, 0);
@@ -1087,13 +1083,11 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer_1 = false;
-  bool should_defer_2 = false;
-  ReportIdleEvent(data, &should_defer_1);
-  ReportIdleEvent(data, &should_defer_2);
+  ReportIdleEvent(data);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_NE(should_defer_1, should_defer_2);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string hist_complete("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(hist_complete, 1);
@@ -1132,11 +1126,10 @@
   model_.set_decision_threshold(50);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
@@ -1166,10 +1159,9 @@
   model_.set_inactivity_score(40);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(6));
   ReportSuspend(power_manager::SuspendImminent_Reason_IDLE,
@@ -1178,9 +1170,9 @@
   // 2nd ScreenDimImminent is not deferred despite model score says so.
   model_.set_inactivity_score(20);
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(10));
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 2);
@@ -1241,17 +1233,16 @@
   // 1st ScreenDimImminent gets deferred
   model_.set_inactivity_score(40);
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_TRUE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   // 2nd ScreenDimImminent is not deferred despite model score says so.
   model_.set_inactivity_score(20);
   thread_bundle()->FastForwardBy(base::TimeDelta::FromSeconds(10));
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 2);
@@ -1308,11 +1299,10 @@
   model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
-  bool should_defer = false;
-  ReportIdleEvent(data, &should_defer);
+  ReportIdleEvent(data);
   thread_bundle()->RunUntilIdle();
   ReportUserActivity(nullptr);
-  EXPECT_FALSE(should_defer);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
 
   std::string histogram("PowerML.SmartDimModel.RequestCompleteDuration");
   histogram_tester.ExpectTotalCount(histogram, 1);
diff --git a/chrome/browser/chromeos/release_notes/release_notes_notification.cc b/chrome/browser/chromeos/release_notes/release_notes_notification.cc
new file mode 100644
index 0000000..5e4cb0b0c
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_notification.cc
@@ -0,0 +1,73 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/release_notes/release_notes_notification.h"
+
+#include <string>
+
+#include "ash/public/cpp/notification_utils.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+#include "base/strings/string_util.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "content/public/browser/notification_service.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/public/cpp/notification_delegate.h"
+
+using message_center::Notification;
+
+namespace {
+const char kShowNotificationID[] = "show_release_notes_notification";
+}  // namespace
+
+namespace chromeos {
+
+ReleaseNotesNotification::ReleaseNotesNotification(Profile* profile)
+    : profile_(profile), weak_ptr_factory_(this) {}
+
+ReleaseNotesNotification::~ReleaseNotesNotification() {}
+
+void ReleaseNotesNotification::MaybeShowReleaseNotes() {
+  release_notes_storage_ = std::make_unique<ReleaseNotesStorage>(profile_);
+  if (!release_notes_storage_->ShouldNotify())
+    return;
+  ShowReleaseNotesNotification();
+  base::RecordAction(base::UserMetricsAction("ReleaseNotes.NotificationShown"));
+  release_notes_storage_->MarkNotificationShown();
+}
+
+void ReleaseNotesNotification::HandleClickShowNotification() {
+  SystemNotificationHelper::GetInstance()->Close(kShowNotificationID);
+  base::RecordAction(
+      base::UserMetricsAction("ReleaseNotes.LaunchedNotification"));
+  chrome::LaunchReleaseNotes(profile_);
+}
+
+void ReleaseNotesNotification::ShowReleaseNotesNotification() {
+  base::string16 title =
+      l10n_util::GetStringUTF16(IDS_RELEASE_NOTES_NOTIFICATION_TITLE);
+  base::string16 message =
+      l10n_util::GetStringUTF16(IDS_RELEASE_NOTES_NOTIFICATION_MESSAGE);
+
+  release_notes_available_notification_ = ash::CreateSystemNotification(
+      message_center::NOTIFICATION_TYPE_SIMPLE, kShowNotificationID,
+      std::move(title), std::move(message), base::string16(), GURL(),
+      message_center::NotifierId(), message_center::RichNotificationData(),
+      base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+          base::BindRepeating(
+              &ReleaseNotesNotification::HandleClickShowNotification,
+              weak_ptr_factory_.GetWeakPtr())),
+      gfx::VectorIcon(),
+      message_center::SystemNotificationWarningLevel::NORMAL);
+  SystemNotificationHelper::GetInstance()->Display(
+      *release_notes_available_notification_);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/release_notes/release_notes_notification.h b/chrome/browser/chromeos/release_notes/release_notes_notification.h
new file mode 100644
index 0000000..e283720
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_notification.h
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_NOTIFICATION_H_
+#define CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_NOTIFICATION_H_
+
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
+#include "base/task/post_task.h"
+#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
+#include "chromeos/network/network_state_handler_observer.h"
+#include "components/session_manager/core/session_manager_observer.h"
+
+namespace message_center {
+class Notification;
+}
+
+namespace chromeos {
+
+class ReleaseNotesNotificationTest;
+
+// Notifies user when release notes are available for their
+// recently updated CrOS device.
+class ReleaseNotesNotification {
+ public:
+  explicit ReleaseNotesNotification(Profile* profile);
+  ~ReleaseNotesNotification();
+
+  // Checks profile preferences and release notes storage to determine whether
+  // to show release notes available notification to user.
+  void MaybeShowReleaseNotes();
+
+ private:
+  friend class ReleaseNotesNotificationTest;
+
+  // Creates notification that the CrOS device has been updated, shows the
+  // notification, and registers that a notification was shown for the current
+  // profile for the current Chrome release.
+  void ShowReleaseNotesNotification();
+
+  void HandleClickShowNotification();
+
+  Profile* const profile_;
+  std::unique_ptr<ReleaseNotesStorage> release_notes_storage_;
+  std::unique_ptr<message_center::Notification>
+      release_notes_available_notification_;
+
+  base::WeakPtrFactory<ReleaseNotesNotification> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(ReleaseNotesNotification);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_NOTIFICATION_H_
diff --git a/chrome/browser/chromeos/release_notes/release_notes_notification_unittest.cc b/chrome/browser/chromeos/release_notes/release_notes_notification_unittest.cc
new file mode 100644
index 0000000..cf73be7
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_notification_unittest.cc
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/release_notes/release_notes_notification.h"
+
+#include "base/feature_list.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/prefs/testing_pref_service.h"
+
+namespace chromeos {
+
+class ReleaseNotesNotificationTest : public BrowserWithTestWindowTest {
+ public:
+  ReleaseNotesNotificationTest() {}
+  ~ReleaseNotesNotificationTest() override = default;
+
+  // BrowserWithTestWindowTest:
+  TestingProfile* CreateProfile() override {
+    return profile_manager()->CreateTestingProfile("googler@google.com");
+  }
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+    TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
+        std::make_unique<SystemNotificationHelper>());
+    tester_ = std::make_unique<NotificationDisplayServiceTester>(nullptr);
+    tester_->SetNotificationAddedClosure(
+        base::BindRepeating(&ReleaseNotesNotificationTest::OnNotificationAdded,
+                            base::Unretained(this)));
+    release_notes_notification_ =
+        std::make_unique<ReleaseNotesNotification>(profile());
+  }
+
+  void TearDown() override {
+    release_notes_notification_.reset();
+    tester_.reset();
+    BrowserWithTestWindowTest::TearDown();
+  }
+
+  void OnNotificationAdded() { notification_count_++; }
+
+ protected:
+  bool HasReleaseNotesNotification() {
+    return tester_->GetNotification("show_release_notes_notification")
+        .has_value();
+  }
+
+  int notification_count_ = 0;
+  std::unique_ptr<ReleaseNotesNotification> release_notes_notification_;
+
+ private:
+  std::unique_ptr<NotificationDisplayServiceTester> tester_;
+
+  DISALLOW_COPY_AND_ASSIGN(ReleaseNotesNotificationTest);
+};
+
+TEST_F(ReleaseNotesNotificationTest, ShowReleaseNotesNotification) {
+  release_notes_notification_->MaybeShowReleaseNotes();
+  ASSERT_TRUE(HasReleaseNotesNotification());
+  EXPECT_EQ(1, notification_count_);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/release_notes/release_notes_storage.cc b/chrome/browser/chromeos/release_notes/release_notes_storage.cc
new file mode 100644
index 0000000..4238c43
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_storage.cc
@@ -0,0 +1,56 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
+
+#include "base/version.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/channel_info.h"
+#include "chrome/common/pref_names.h"
+#include "chromeos/login/login_state/login_state.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+#include "components/user_manager/user_manager.h"
+#include "components/version_info/version_info.h"
+
+namespace {
+
+int GetMilestone() {
+  return version_info::GetVersion().components()[0];
+}
+
+}  // namespace
+
+namespace chromeos {
+
+void ReleaseNotesStorage::RegisterProfilePrefs(PrefRegistrySimple* registry) {
+  registry->RegisterIntegerPref(prefs::kReleaseNotesLastShownMilestone, 0);
+}
+
+ReleaseNotesStorage::ReleaseNotesStorage(Profile* profile)
+    : profile_(profile) {}
+
+ReleaseNotesStorage::~ReleaseNotesStorage() = default;
+
+bool ReleaseNotesStorage::ShouldNotify() {
+  std::string user_email = profile_->GetProfileUserName();
+  if (base::EndsWith(user_email, "@google.com",
+                     base::CompareCase::INSENSITIVE_ASCII) ||
+      (ProfileHelper::Get()->GetUserByProfile(profile_)->HasGaiaAccount() &&
+       !profile_->GetProfilePolicyConnector()->IsManaged())) {
+    int last_milestone = profile_->GetPrefs()->GetInteger(
+        prefs::kReleaseNotesLastShownMilestone);
+    return (last_milestone < GetMilestone());
+  }
+  return false;
+}
+
+void ReleaseNotesStorage::MarkNotificationShown() {
+  profile_->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone,
+                                   GetMilestone());
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/release_notes/release_notes_storage.h b/chrome/browser/chromeos/release_notes/release_notes_storage.h
new file mode 100644
index 0000000..ea163b2
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_storage.h
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_STORAGE_H_
+#define CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_STORAGE_H_
+
+#include "base/macros.h"
+
+class Profile;
+class PrefRegistrySimple;
+
+namespace chromeos {
+
+// Class used to determine when/if to show user notification that release notes
+// are available for their recently updated device.
+class ReleaseNotesStorage {
+ public:
+  // Registers profile prefs.
+  static void RegisterProfilePrefs(PrefRegistrySimple* registry);
+
+  explicit ReleaseNotesStorage(Profile* profile);
+  ~ReleaseNotesStorage();
+
+  // Returns true if system has been updated since last notification, user
+  // has internet connection, and user has not opted out of release notes.
+  bool ShouldNotify();
+
+  // Marks the current release as having shown the notification.
+  void MarkNotificationShown();
+
+ private:
+  Profile* const profile_;
+
+  DISALLOW_COPY_AND_ASSIGN(ReleaseNotesStorage);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_RELEASE_NOTES_RELEASE_NOTES_STORAGE_H_
diff --git a/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc b/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc
new file mode 100644
index 0000000..79b9fb8
--- /dev/null
+++ b/chrome/browser/chromeos/release_notes/release_notes_storage_unittest.cc
@@ -0,0 +1,98 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
+
+#include <memory>
+
+#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chromeos/login/login_state/login_state.h"
+#include "components/account_id/account_id.h"
+#include "components/prefs/pref_service.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+class ReleaseNotesStorageTest : public testing::Test {
+ protected:
+  ReleaseNotesStorageTest()
+      : user_manager_(new FakeChromeUserManager()),
+        scoped_user_manager_(
+            std::unique_ptr<chromeos::FakeChromeUserManager>(user_manager_)) {}
+  ~ReleaseNotesStorageTest() override {}
+
+  std::unique_ptr<Profile> CreateProfile(std::string email) {
+    AccountId account_id_ = AccountId::FromUserEmailGaiaId(email, "12345");
+    user_manager_->AddUser(account_id_);
+    TestingProfile::Builder builder;
+    builder.SetProfileName(email);
+    return builder.Build();
+  }
+
+  FakeChromeUserManager* user_manager_;
+  user_manager::ScopedUserManager scoped_user_manager_;
+  content::TestBrowserThreadBundle thread_bundle_;
+
+  DISALLOW_COPY_AND_ASSIGN(ReleaseNotesStorageTest);
+};
+
+TEST_F(ReleaseNotesStorageTest, ModifyLastRelease) {
+  std::unique_ptr<Profile> profile = CreateProfile("test@gmail.com");
+
+  profile->GetProfilePolicyConnector()->OverrideIsManagedForTesting(false);
+  std::unique_ptr<ReleaseNotesStorage> release_notes_storage =
+      std::make_unique<ReleaseNotesStorage>(profile.get());
+  profile.get()->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone,
+                                        -1);
+
+  EXPECT_EQ(true, release_notes_storage->ShouldNotify());
+  release_notes_storage->MarkNotificationShown();
+  EXPECT_NE(-1, profile.get()->GetPrefs()->GetInteger(
+                    prefs::kReleaseNotesLastShownMilestone));
+  EXPECT_EQ(false, release_notes_storage->ShouldNotify());
+}
+
+TEST_F(ReleaseNotesStorageTest, ShouldShowReleaseNotes) {
+  std::unique_ptr<Profile> profile = CreateProfile("test@gmail.com");
+
+  profile->GetProfilePolicyConnector()->OverrideIsManagedForTesting(false);
+  std::unique_ptr<ReleaseNotesStorage> release_notes_storage =
+      std::make_unique<ReleaseNotesStorage>(profile.get());
+  profile.get()->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone,
+                                        -1);
+
+  EXPECT_EQ(true, release_notes_storage->ShouldNotify());
+}
+
+TEST_F(ReleaseNotesStorageTest, ShouldNotShowReleaseNotes) {
+  std::unique_ptr<Profile> profile = CreateProfile("test@company.com");
+
+  profile->GetProfilePolicyConnector()->OverrideIsManagedForTesting(true);
+  std::unique_ptr<ReleaseNotesStorage> release_notes_storage =
+      std::make_unique<ReleaseNotesStorage>(profile.get());
+  profile.get()->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone,
+                                        -1);
+
+  EXPECT_EQ(false, release_notes_storage->ShouldNotify());
+}
+
+TEST_F(ReleaseNotesStorageTest, ShouldShowReleaseNotesGoogler) {
+  std::unique_ptr<Profile> profile = CreateProfile("test@google.com");
+
+  profile->GetProfilePolicyConnector()->OverrideIsManagedForTesting(true);
+  std::unique_ptr<ReleaseNotesStorage> release_notes_storage =
+      std::make_unique<ReleaseNotesStorage>(profile.get());
+  profile.get()->GetPrefs()->SetInteger(prefs::kReleaseNotesLastShownMilestone,
+                                        -1);
+
+  EXPECT_EQ(true, release_notes_storage->ShouldNotify());
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/drive/OWNERS b/chrome/browser/drive/OWNERS
index 7ca29178..07e88fc 100644
--- a/chrome/browser/drive/OWNERS
+++ b/chrome/browser/drive/OWNERS
@@ -4,3 +4,4 @@
 hirono@chromium.org
 kinaba@chromium.org
 yoshiki@chromium.org
+# COMPONENT: Platform>Apps>FileManager
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 0ab4257..88476d2f 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -425,13 +425,13 @@
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
   (*s_whitelist)[arc::prefs::kVoiceInteractionContextEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_whitelist)[arc::prefs::kVoiceInteractionHotwordAlwaysOn] =
+  (*s_whitelist)[chromeos::assistant::prefs::kAssistantHotwordAlwaysOn] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
   (*s_whitelist)[arc::prefs::kVoiceInteractionHotwordEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_whitelist)[arc::prefs::kVoiceInteractionNotificationEnabled] =
+  (*s_whitelist)[chromeos::assistant::prefs::kAssistantLaunchWithMicOpen] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_whitelist)[arc::prefs::kVoiceInteractionLaunchWithMicOpen] =
+  (*s_whitelist)[chromeos::assistant::prefs::kAssistantNotificationEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
 
   // Misc.
diff --git a/chrome/browser/extensions/chrome_extensions_interface_registration.cc b/chrome/browser/extensions/chrome_extensions_interface_registration.cc
index d7b9be5..7a38aa66 100644
--- a/chrome/browser/extensions/chrome_extensions_interface_registration.cc
+++ b/chrome/browser/extensions/chrome_extensions_interface_registration.cc
@@ -11,9 +11,10 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
-#include "chrome/browser/media/router/media_router_feature.h"  // nogncheck
+#include "chrome/browser/media/router/media_router_feature.h"       // nogncheck
 #include "chrome/browser/media/router/mojo/media_router_desktop.h"  // nogncheck
 #include "chrome/common/extensions/extension_constants.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/video_capture_service.h"
@@ -24,9 +25,12 @@
 
 #if defined(OS_CHROMEOS)
 #include "base/task/post_task.h"
+#include "chrome/common/pref_names.h"
 #include "chromeos/services/ime/public/mojom/constants.mojom.h"
 #include "chromeos/services/ime/public/mojom/input_engine.mojom.h"
 #include "chromeos/services/media_perception/public/mojom/media_perception.mojom.h"
+#include "components/arc/intent_helper/arc_intent_helper_bridge.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/media_device_id.h"
 #include "extensions/browser/api/extensions_api_client.h"
@@ -73,6 +77,15 @@
                            std::move(callback_on_io_thread));
 }
 
+void TriggerCameraIntent(content::BrowserContext* context,
+                         uint32_t intent_id,
+                         bool is_success,
+                         const std::vector<uint8_t>& captured_data) {
+  auto* intent_helper =
+      arc::ArcIntentHelperBridge::GetForBrowserContext(context);
+  intent_helper->OnCameraIntentHandled(intent_id, is_success, captured_data);
+}
+
 // Binds CrosImageCaptureRequest to a proxy which translates the source id into
 // video device id and then forward the request to video capture service.
 void BindRendererFacingCrosImageCapture(
@@ -91,10 +104,13 @@
   auto mapping_callback =
       base::BindRepeating(&TranslateVideoDeviceId, media_device_id_salt,
                           std::move(security_origin));
+  auto intent_callback = base::BindRepeating(
+      &TriggerCameraIntent, source->GetProcess()->GetBrowserContext());
 
   // Bind origin request to proxy implementation.
   auto api_proxy = std::make_unique<media::RendererFacingCrosImageCapture>(
-      std::move(proxy_ptr), std::move(mapping_callback));
+      std::move(proxy_ptr), std::move(mapping_callback),
+      std::move(intent_callback));
   mojo::MakeStrongBinding(std::move(api_proxy), std::move(request));
 }
 #endif
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 33a05a3..8b5ace5 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2933,6 +2933,11 @@
     "expiry_milestone": 78
   },
   {
+    "name": "release-notes",
+    "owners": [ "yulunwu" ],
+    "expiry_milestone": 79
+  },
+  {
     "name": "smart-dim-model-v3",
     "owners": [ "amoylan", "jiameng" ],
     "expiry_milestone": 80
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 1655b8ed..8e37707 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3317,6 +3317,11 @@
     "searches Chrome Web Store for extensions that support printing to a USB "
     "printer with specific USB ID.";
 
+const char kReleaseNotesName[] = "CrOS Release Notes.";
+const char kReleaseNotesDescription[] =
+    "Instructs OS to show notification about CrOS ReleaseNotes on login after "
+    "update, show webview describing new OS features.";
+
 const char kSchedulerConfigurationName[] = "Scheduler Configuration";
 const char kSchedulerConfigurationDescription[] =
     "Instructs the OS to use a specific scheduler configuration setting.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index a57e9791..a8895e99 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1986,6 +1986,9 @@
 extern const char kPrinterProviderSearchAppName[];
 extern const char kPrinterProviderSearchAppDescription[];
 
+extern const char kReleaseNotesName[];
+extern const char kReleaseNotesDescription[];
+
 extern const char kSchedulerConfigurationName[];
 extern const char kSchedulerConfigurationDescription[];
 extern const char kSchedulerConfigurationConservative[];
diff --git a/chrome/browser/hang_monitor/OWNERS b/chrome/browser/hang_monitor/OWNERS
new file mode 100644
index 0000000..c9c9fab
--- /dev/null
+++ b/chrome/browser/hang_monitor/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>CrashReporting
diff --git a/chrome/browser/lifetime/OWNERS b/chrome/browser/lifetime/OWNERS
new file mode 100644
index 0000000..8ef4ddaa
--- /dev/null
+++ b/chrome/browser/lifetime/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>TaskScheduler
diff --git a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
index c8c6b484..3094cc8 100644
--- a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
+++ b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
@@ -264,12 +264,25 @@
   return PerformChecks(url, navigated_domain, service->GetLatestEngagedSites());
 }
 
-ThrottleCheckResult LookalikeUrlNavigationThrottle::WillStartRequest() {
+ThrottleCheckResult LookalikeUrlNavigationThrottle::WillProcessResponse() {
+  if (navigation_handle()->GetNetErrorCode() != net::OK) {
+    return content::NavigationThrottle::PROCEED;
+  }
   return HandleThrottleRequest(navigation_handle()->GetURL());
 }
 
 ThrottleCheckResult LookalikeUrlNavigationThrottle::WillRedirectRequest() {
-  return HandleThrottleRequest(navigation_handle()->GetURL());
+  const std::vector<GURL>& chain = navigation_handle()->GetRedirectChain();
+
+  // WillRedirectRequest is called after a redirect occurs, so the end of the
+  // chain is the URL that was redirected to. We need to check the preceding URL
+  // that caused the redirection. The final URL in the chain is checked either:
+  //  - after the next redirection (when there is a longer chain), or
+  //  - by WillProcessResponse (before content is rendered).
+  if (chain.size() < 2) {
+    return content::NavigationThrottle::PROCEED;
+  }
+  return HandleThrottleRequest(chain[chain.size() - 2]);
 }
 
 const char* LookalikeUrlNavigationThrottle::GetNameForLogging() {
diff --git a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.h b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.h
index b1cf902..5e5a951e 100644
--- a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.h
+++ b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.h
@@ -58,7 +58,7 @@
   ~LookalikeUrlNavigationThrottle() override;
 
   // content::NavigationThrottle:
-  ThrottleCheckResult WillStartRequest() override;
+  ThrottleCheckResult WillProcessResponse() override;
   ThrottleCheckResult WillRedirectRequest() override;
   const char* GetNameForLogging() override;
 
diff --git a/chrome/browser/lookalikes/lookalike_url_navigation_throttle_browsertest.cc b/chrome/browser/lookalikes/lookalike_url_navigation_throttle_browsertest.cc
index f60d24b6..82fd3e3b 100644
--- a/chrome/browser/lookalikes/lookalike_url_navigation_throttle_browsertest.cc
+++ b/chrome/browser/lookalikes/lookalike_url_navigation_throttle_browsertest.cc
@@ -590,7 +590,7 @@
   CheckNoUkm();
 }
 
-// Test that the heuristics are triggered even with net errors.
+// Test that the heuristics are not triggered even with net errors.
 IN_PROC_BROWSER_TEST_P(LookalikeUrlNavigationThrottleBrowserTest,
                        NetError_SiteEngagement_Interstitial) {
   // Create a test server that returns invalid responses.
@@ -603,10 +603,8 @@
   // Advance clock to force a fetch of new engaged sites list.
   test_clock()->Advance(base::TimeDelta::FromHours(1));
 
-  TestMetricsRecordedAndMaybeInterstitialShown(
-      browser(), custom_test_server.GetURL("sité1.com", "/title1.html"),
-      custom_test_server.GetURL("site1.com", "/"),
-      NavigationSuggestionEvent::kMatchSiteEngagement);
+  TestInterstitialNotShown(
+      browser(), custom_test_server.GetURL("sité1.com", "/title1.html"));
 }
 
 // Same as NetError_SiteEngagement_Interstitial, but triggered by a top domain.
@@ -617,61 +615,8 @@
   custom_test_server.RegisterRequestHandler(
       base::BindRepeating(&NetworkErrorResponseHandler));
   ASSERT_TRUE(custom_test_server.Start());
-
-  TestMetricsRecordedAndMaybeInterstitialShown(
-      browser(), GetURL("googlé.com"), GetURLWithoutPath("google.com"),
-      NavigationSuggestionEvent::kMatchTopSite);
-}
-
-// Verify that, after dismissing a lookalike warning when enabled, the user
-// sees a net error when applicable.
-IN_PROC_BROWSER_TEST_P(LookalikeUrlNavigationThrottleBrowserTest,
-                       NetError_SiteEngagement_NetErrorAfterDismiss) {
-  // Create a test server that returns invalid responses.
-  net::EmbeddedTestServer custom_test_server;
-  custom_test_server.RegisterRequestHandler(
-      base::BindRepeating(&NetworkErrorResponseHandler));
-  ASSERT_TRUE(custom_test_server.Start());
-
-  SetEngagementScore(browser(), GURL("http://site1.com"), kHighEngagement);
-  // Advance clock to force a fetch of new engaged sites list.
-  test_clock()->Advance(base::TimeDelta::FromHours(1));
-  NavigateToURLSync(browser(),
-                    custom_test_server.GetURL("sité1.com", "/title1.html"));
-  if (ui_enabled()) {
-    SendInterstitialCommandSync(browser(),
-                                SecurityInterstitialCommand::CMD_PROCEED);
-  }
-
-  EXPECT_GE(ui_test_utils::FindInPage(
-                browser()->tab_strip_model()->GetActiveWebContents(),
-                base::ASCIIToUTF16("ERR_EMPTY_RESPONSE"), true, true, nullptr,
-                nullptr),
-            1);
-}
-
-// Same as NetError_SiteEngagement_NetErrorAfterDismiss, but navigates to a top
-// domain instead.
-IN_PROC_BROWSER_TEST_P(LookalikeUrlNavigationThrottleBrowserTest,
-                       NetError_TopDomain_NetErrorAfterDismiss) {
-  // Create a test server that returns invalid responses.
-  net::EmbeddedTestServer custom_test_server;
-  custom_test_server.RegisterRequestHandler(
-      base::BindRepeating(&NetworkErrorResponseHandler));
-  ASSERT_TRUE(custom_test_server.Start());
-
-  NavigateToURLSync(browser(),
-                    custom_test_server.GetURL("googlé.com", "/title1.html"));
-  if (ShouldExpectInterstitial(NavigationSuggestionEvent::kMatchTopSite)) {
-    SendInterstitialCommandSync(browser(),
-                                SecurityInterstitialCommand::CMD_PROCEED);
-  }
-
-  EXPECT_GE(ui_test_utils::FindInPage(
-                browser()->tab_strip_model()->GetActiveWebContents(),
-                base::ASCIIToUTF16("ERR_EMPTY_RESPONSE"), true, true, nullptr,
-                nullptr),
-            1);
+  TestInterstitialNotShown(browser(),
+                           custom_test_server.GetURL("googlé.com", "/"));
 }
 
 // Navigate to a domain whose visual representation looks like a domain with a
@@ -1045,7 +990,7 @@
   LoadAndCheckInterstitialAt(browser(), kNavigatedUrl);
 }
 
-// Verify reloading the page does not result in dismissing an interstitial.
+// Verify reloading the page results in dismissing an interstitial.
 // Regression test for crbug/941886.
 IN_PROC_BROWSER_TEST_F(LookalikeUrlInterstitialPageBrowserTest,
                        RefreshDoesntDismiss) {
@@ -1063,7 +1008,7 @@
   chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   navigation_observer.Wait();
 
-  EXPECT_EQ(LookalikeUrlInterstitialPage::kTypeForTesting,
-            GetInterstitialType(web_contents));
-  EXPECT_FALSE(IsUrlShowing(browser()));
+  EXPECT_EQ(nullptr, GetInterstitialType(web_contents));
+  EXPECT_TRUE(IsUrlShowing(browser()));
+  EXPECT_EQ(GetURL("example.com"), web_contents->GetURL());
 }
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index e98c831..156b0226 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -84,15 +84,11 @@
 
 void GetStubResolverConfig(
     PrefService* local_state,
-    bool* insecure_stub_resolver_enabled,
-    net::DnsConfig::SecureDnsMode* secure_dns_mode,
+    bool* stub_resolver_enabled,
     base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>*
         dns_over_https_servers) {
   DCHECK(!dns_over_https_servers->has_value());
 
-  *insecure_stub_resolver_enabled =
-      local_state->GetBoolean(prefs::kBuiltInDnsClientEnabled);
-
   const auto& doh_server_list =
       local_state->GetList(prefs::kDnsOverHttpsServers)->GetList();
   const auto& doh_server_method_list =
@@ -132,24 +128,20 @@
     }
   }
 
-  // TODO(crbug.com/985589): Read secure dns mode from prefs.
-  if (dns_over_https_servers->has_value())
-    *secure_dns_mode = net::DnsConfig::SecureDnsMode::AUTOMATIC;
-  else
-    *secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF;
+  *stub_resolver_enabled =
+      dns_over_https_servers->has_value() ||
+      local_state->GetBoolean(prefs::kBuiltInDnsClientEnabled);
 }
 
 void OnStubResolverConfigChanged(PrefService* local_state,
                                  const std::string& pref_name) {
-  bool insecure_stub_resolver_enabled;
-  net::DnsConfig::SecureDnsMode secure_dns_mode;
+  bool stub_resolver_enabled;
   base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>
       dns_over_https_servers;
-  GetStubResolverConfig(local_state, &insecure_stub_resolver_enabled,
-                        &secure_dns_mode, &dns_over_https_servers);
+  GetStubResolverConfig(local_state, &stub_resolver_enabled,
+                        &dns_over_https_servers);
   content::GetNetworkService()->ConfigureStubHostResolver(
-      insecure_stub_resolver_enabled, secure_dns_mode,
-      std::move(dns_over_https_servers));
+      stub_resolver_enabled, std::move(dns_over_https_servers));
 }
 
 // Constructs HttpAuthStaticParams based on |local_state|.
@@ -562,15 +554,13 @@
 
   // Configure the stub resolver. This must be done after the system
   // NetworkContext is created, but before anything has the chance to use it.
-  bool insecure_stub_resolver_enabled;
-  net::DnsConfig::SecureDnsMode secure_dns_mode;
+  bool stub_resolver_enabled;
   base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>
       dns_over_https_servers;
-  GetStubResolverConfig(local_state_, &insecure_stub_resolver_enabled,
-                        &secure_dns_mode, &dns_over_https_servers);
+  GetStubResolverConfig(local_state_, &stub_resolver_enabled,
+                        &dns_over_https_servers);
   content::GetNetworkService()->ConfigureStubHostResolver(
-      insecure_stub_resolver_enabled, secure_dns_mode,
-      std::move(dns_over_https_servers));
+      stub_resolver_enabled, std::move(dns_over_https_servers));
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   const base::CommandLine& command_line =
@@ -716,12 +706,10 @@
 }
 
 void SystemNetworkContextManager::GetStubResolverConfigForTesting(
-    bool* insecure_stub_resolver_enabled,
-    net::DnsConfig::SecureDnsMode* secure_dns_mode,
+    bool* stub_resolver_enabled,
     base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>*
         dns_over_https_servers) {
-  GetStubResolverConfig(g_browser_process->local_state(),
-                        insecure_stub_resolver_enabled, secure_dns_mode,
+  GetStubResolverConfig(g_browser_process->local_state(), stub_resolver_enabled,
                         dns_over_https_servers);
 }
 
diff --git a/chrome/browser/net/system_network_context_manager.h b/chrome/browser/net/system_network_context_manager.h
index 87c657e2..59c34253 100644
--- a/chrome/browser/net/system_network_context_manager.h
+++ b/chrome/browser/net/system_network_context_manager.h
@@ -130,8 +130,7 @@
 
   // Returns configuration that would be sent to the stub DNS resolver.
   static void GetStubResolverConfigForTesting(
-      bool* insecure_stub_resolver_enabled,
-      net::DnsConfig::SecureDnsMode* secure_dns_mode,
+      bool* stub_resolver_enabled,
       base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>*
           dns_over_https_servers);
 
diff --git a/chrome/browser/net/system_network_context_manager_browsertest.cc b/chrome/browser/net/system_network_context_manager_browsertest.cc
index 48323a3..8010454 100644
--- a/chrome/browser/net/system_network_context_manager_browsertest.cc
+++ b/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -30,31 +30,25 @@
 namespace {
 
 void GetStubResolverConfig(
-    bool* insecure_stub_resolver_enabled,
-    net::DnsConfig::SecureDnsMode* secure_dns_mode,
+    bool* stub_resolver_enabled,
     base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>*
         dns_over_https_servers) {
   dns_over_https_servers->reset();
 
   SystemNetworkContextManager::GetStubResolverConfigForTesting(
-      insecure_stub_resolver_enabled, secure_dns_mode, dns_over_https_servers);
+      stub_resolver_enabled, dns_over_https_servers);
 }
 
 // Checks the values returned by GetStubResolverConfigForTesting() match
 // |async_dns_feature_enabled| (With empty DNS over HTTPS prefs). Then sets
 // various DNS over HTTPS servers, and makes sure the settings are respected.
-// TODO(crbug.com/985589): Check that the SecureDnsMode is read correctly from
-// the prefs once it is stored there.
 void RunStubResolverConfigTests(bool async_dns_feature_enabled) {
   // Check initial state.
-  bool insecure_stub_resolver_enabled = !async_dns_feature_enabled;
-  net::DnsConfig::SecureDnsMode secure_dns_mode;
+  bool stub_resolver_enabled = !async_dns_feature_enabled;
   base::Optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>
       dns_over_https_servers;
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
 
   // Check state after setting various DNS over HTTPS preferences.
@@ -80,10 +74,8 @@
   servers.GetList().push_back(base::Value(kGoodGetTemplate));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   servers.GetList().clear();
   methods.GetList().clear();
@@ -91,10 +83,8 @@
   methods.GetList().push_back(base::Value(kPost));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   servers.GetList().clear();
   methods.GetList().clear();
@@ -104,10 +94,8 @@
   methods.GetList().push_back(base::Value(kPost));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   servers.GetList().clear();
   methods.GetList().clear();
@@ -117,10 +105,8 @@
   methods.GetList().push_back(base::Value(3.14));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   servers.GetList().clear();
   methods.GetList().clear();
@@ -130,10 +116,8 @@
   methods.GetList().push_back(base::Value(kPost));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   servers.GetList().clear();
   methods.GetList().clear();
@@ -143,10 +127,8 @@
   methods.GetList().push_back(base::Value(kPost));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(true, stub_resolver_enabled);
   ASSERT_TRUE(dns_over_https_servers.has_value());
   ASSERT_EQ(1u, dns_over_https_servers->size());
   EXPECT_EQ(kGoodPostTemplate, dns_over_https_servers->at(0)->server_template);
@@ -161,10 +143,8 @@
   methods.GetList().push_back(base::Value(kPost));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(true, stub_resolver_enabled);
   ASSERT_TRUE(dns_over_https_servers.has_value());
   ASSERT_EQ(1u, dns_over_https_servers->size());
   EXPECT_EQ(kGoodGetTemplate, dns_over_https_servers->at(0)->server_template);
@@ -179,10 +159,8 @@
   methods.GetList().push_back(base::Value(kGet));
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(true, stub_resolver_enabled);
   ASSERT_TRUE(dns_over_https_servers.has_value());
   ASSERT_EQ(2u, dns_over_https_servers->size());
   EXPECT_EQ(kGoodPostTemplate, dns_over_https_servers->at(0)->server_template);
@@ -195,17 +173,13 @@
   // Test case with policy BuiltInDnsClientEnabled enabled.
   local_state->Set(prefs::kDnsOverHttpsServers, servers);
   local_state->Set(prefs::kDnsOverHttpsServerMethods, methods);
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
   local_state->Set(prefs::kBuiltInDnsClientEnabled,
                    base::Value(!async_dns_feature_enabled));
-  GetStubResolverConfig(&insecure_stub_resolver_enabled, &secure_dns_mode,
-                        &dns_over_https_servers);
-  EXPECT_EQ(!async_dns_feature_enabled, insecure_stub_resolver_enabled);
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF, secure_dns_mode);
+  GetStubResolverConfig(&stub_resolver_enabled, &dns_over_https_servers);
+  EXPECT_EQ(!async_dns_feature_enabled, stub_resolver_enabled);
   EXPECT_FALSE(dns_over_https_servers.has_value());
 }
 
diff --git a/chrome/browser/notifications/scheduler/internal/background_task_coordinator_unittest.cc b/chrome/browser/notifications/scheduler/internal/background_task_coordinator_unittest.cc
index 79afb08..b1eda78 100644
--- a/chrome/browser/notifications/scheduler/internal/background_task_coordinator_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/background_task_coordinator_unittest.cc
@@ -15,8 +15,8 @@
 #include "chrome/browser/notifications/scheduler/internal/scheduler_config.h"
 #include "chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h"
 #include "chrome/browser/notifications/scheduler/test/fake_clock.h"
+#include "chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.h"
 #include "chrome/browser/notifications/scheduler/test/test_utils.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
@@ -44,21 +44,6 @@
      {},
      base::nullopt /* suppression_info */}};
 
-class MockNotificationBackgroundTaskScheduler
-    : public NotificationBackgroundTaskScheduler {
- public:
-  MockNotificationBackgroundTaskScheduler() = default;
-  ~MockNotificationBackgroundTaskScheduler() override = default;
-  MOCK_METHOD3(Schedule,
-               void(notifications::SchedulerTaskTime,
-                    base::TimeDelta,
-                    base::TimeDelta));
-  MOCK_METHOD0(Cancel, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockNotificationBackgroundTaskScheduler);
-};
-
 base::TimeDelta NoopTimeRandomizer(const base::TimeDelta& time_window) {
   return base::TimeDelta();
 }
@@ -89,14 +74,14 @@
     config_.suppression_duration = base::TimeDelta::FromDays(3);
 
     auto background_task =
-        std::make_unique<MockNotificationBackgroundTaskScheduler>();
+        std::make_unique<test::MockNotificationBackgroundTaskScheduler>();
     background_task_ = background_task.get();
     coordinator_ = std::make_unique<BackgroundTaskCoordinator>(
         std::move(background_task), &config_,
         base::BindRepeating(&NoopTimeRandomizer, base::TimeDelta()), &clock_);
   }
 
-  MockNotificationBackgroundTaskScheduler* background_task() {
+  test::MockNotificationBackgroundTaskScheduler* background_task() {
     return background_task_;
   }
 
@@ -148,7 +133,7 @@
   test::FakeClock clock_;
   SchedulerConfig config_;
   std::unique_ptr<BackgroundTaskCoordinator> coordinator_;
-  MockNotificationBackgroundTaskScheduler* background_task_;
+  test::MockNotificationBackgroundTaskScheduler* background_task_;
   TestData test_data_;
   std::map<SchedulerClientType, std::unique_ptr<ClientState>> client_states_;
 
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc
index 3c1cc87..d06abd1 100644
--- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc
+++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.cc
@@ -201,8 +201,6 @@
       ++it;
     }
 
-    // TODO(xingliu): Use scheduling params to determine ImpressionResult.
-    // https://crbug.com/968880
     switch (impression->feedback) {
       case UserFeedback::kDismiss:
         dismisses.emplace_back(impression);
@@ -210,8 +208,8 @@
             &dismisses, impression->create_time - config_.dismiss_duration);
 
         // Three consecutive dismisses will result in suppression.
-        ApplyNegativeImpressions(client_state, &dismisses,
-                                 config_.dismiss_count);
+        CheckConsecutiveUserAction(client_state, &dismisses,
+                                   config_.dismiss_count);
         break;
       case UserFeedback::kClick:
         OnClickInternal(impression->guid, false /*update_db*/);
@@ -254,6 +252,75 @@
   }
 }
 
+void ImpressionHistoryTrackerImpl::GenerateImpressionResult(
+    Impression* impression) {
+  DCHECK(impression);
+  auto it = impression->impression_mapping.find(impression->feedback);
+  if (it != impression->impression_mapping.end()) {
+    // Use client defined impression mapping.
+    impression->impression = it->second;
+  } else {
+    // Use default mapping from user feedback to impression result.
+    switch (impression->feedback) {
+      case UserFeedback::kClick:
+      case UserFeedback::kHelpful:
+        impression->impression = ImpressionResult::kPositive;
+        break;
+      case UserFeedback::kDismiss:
+      case UserFeedback::kIgnore:
+        impression->impression = ImpressionResult::kNeutral;
+        break;
+      case UserFeedback::kNotHelpful:
+        impression->impression = ImpressionResult::kNegative;
+        break;
+      case UserFeedback::kNoFeedback:
+        NOTREACHED();
+        break;
+    }
+  }
+}
+
+void ImpressionHistoryTrackerImpl::UpdateThrottling(ClientState* client_state,
+                                                    Impression* impression) {
+  DCHECK(client_state);
+  DCHECK(impression);
+
+  // Affect the notification throttling.
+  switch (impression->impression) {
+    case ImpressionResult::kPositive:
+      ApplyPositiveImpression(client_state, impression);
+      break;
+    case ImpressionResult::kNegative:
+      ApplyNegativeImpression(client_state, impression);
+      break;
+    case ImpressionResult::kNeutral:
+      break;
+    case ImpressionResult::kInvalid:
+      NOTREACHED();
+      break;
+  }
+}
+
+void ImpressionHistoryTrackerImpl::CheckConsecutiveUserAction(
+    ClientState* client_state,
+    std::deque<Impression*>* impressions,
+    size_t num_actions) {
+  if (impressions->size() < num_actions)
+    return;
+
+  // Suppress the notification if the user performed consecutive operations that
+  // generates negative impressions.
+  for (size_t i = 0, size = impressions->size(); i < size; ++i) {
+    Impression* impression = (*impressions)[i];
+    if (impression->integrated)
+      continue;
+
+    impression->integrated = true;
+    SetNeedsUpdate(client_state->type, true);
+    GenerateImpressionResult(impression);
+  }
+}
+
 void ImpressionHistoryTrackerImpl::ApplyPositiveImpression(
     ClientState* client_state,
     Impression* impression) {
@@ -261,9 +328,9 @@
   if (impression->integrated)
     return;
 
+  DCHECK_EQ(impression->impression, ImpressionResult::kPositive);
   SetNeedsUpdate(client_state->type, true);
   impression->integrated = true;
-  impression->impression = ImpressionResult::kPositive;
 
   // A positive impression directly releases the suppression.
   if (client_state->suppression_info.has_value()) {
@@ -279,37 +346,15 @@
                          config_.max_daily_shown_per_type);
 }
 
-void ImpressionHistoryTrackerImpl::ApplyNegativeImpressions(
-    ClientState* client_state,
-    std::deque<Impression*>* impressions,
-    size_t num_actions) {
-  if (impressions->size() < num_actions)
-    return;
-
-  // Suppress the notification if the user performed consecutive operations that
-  // generates negative impressions.
-  for (size_t i = 0, size = impressions->size(); i < size; ++i) {
-    if ((*impressions)[i]->integrated)
-      continue;
-
-    (*impressions)[i]->integrated = true;
-
-    // Each user feedback after |num_action| will apply a new negative
-    // impression.
-    if (i + 1 >= num_actions)
-      ApplyNegativeImpression(client_state, (*impressions)[i]);
-  }
-}
-
 void ImpressionHistoryTrackerImpl::ApplyNegativeImpression(
     ClientState* client_state,
     Impression* impression) {
   if (impression->integrated)
     return;
 
+  DCHECK_EQ(impression->impression, ImpressionResult::kNegative);
   SetNeedsUpdate(client_state->type, true);
   impression->integrated = true;
-  impression->impression = ImpressionResult::kNegative;
 
   // Suppress the notification, the user will not see this type of notification
   // for a while.
@@ -403,8 +448,10 @@
   if (it == client_states_.end())
     return;
   ClientState* client_state = it->second.get();
-  ApplyPositiveImpression(client_state, impression);
   impression->feedback = UserFeedback::kClick;
+  GenerateImpressionResult(impression);
+  SetNeedsUpdate(impression->type, true);
+  UpdateThrottling(client_state, impression);
 
   if (update_db && MaybeUpdateDb(client_state->type))
     NotifyImpressionUpdate();
@@ -424,11 +471,9 @@
   ClientState* client_state = it->second.get();
   switch (button_type) {
     case ActionButtonType::kHelpful:
-      ApplyPositiveImpression(client_state, impression);
       impression->feedback = UserFeedback::kHelpful;
       break;
     case ActionButtonType::kUnhelpful:
-      ApplyNegativeImpression(client_state, impression);
       impression->feedback = UserFeedback::kNotHelpful;
       break;
     case ActionButtonType::kUnknownAction:
@@ -436,6 +481,10 @@
       break;
   }
 
+  GenerateImpressionResult(impression);
+  SetNeedsUpdate(impression->type, true);
+  UpdateThrottling(client_state, impression);
+
   if (update_db && MaybeUpdateDb(client_state->type))
     NotifyImpressionUpdate();
 }
@@ -452,9 +501,12 @@
     return;
   ClientState* client_state = it->second.get();
 
-  AnalyzeImpressionHistory(client_state);
+  impression->feedback = UserFeedback::kDismiss;
+  SetNeedsUpdate(impression->type, true);
 
-  if (update_db && MaybeUpdateDb(client_state->type))
+  // Check consecutive dismisses.
+  AnalyzeImpressionHistory(client_state);
+  if (MaybeUpdateDb(impression->type))
     NotifyImpressionUpdate();
 }
 
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h
index 80ff3c59..32c45da1 100644
--- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h
+++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker.h
@@ -118,16 +118,22 @@
   // Analyzes the impression history for a particular client.
   void AnalyzeImpressionHistory(ClientState* client_state);
 
+  // Check consecutive user actions, and generate impression result if no less
+  // than |num_actions| count of user actions.
+  void CheckConsecutiveUserAction(ClientState* client_state,
+                                  std::deque<Impression*>* impressions,
+                                  size_t num_actions);
+
+  // Generates user impression result.
+  void GenerateImpressionResult(Impression* impression);
+
+  // Updates notification throttling based on the impression result.
+  void UpdateThrottling(ClientState* client_state, Impression* impression);
+
   // Applies a positive impression result to this notification type.
   void ApplyPositiveImpression(ClientState* client_state,
                                Impression* impression);
 
-  // Applies negative impression on this notification type when |num_actions|
-  // consecutive negative impression result are generated.
-  void ApplyNegativeImpressions(ClientState* client_state,
-                                std::deque<Impression*>* impressions,
-                                size_t num_actions);
-
   // Applies one negative impression.
   void ApplyNegativeImpression(ClientState* client_state,
                                Impression* impression);
diff --git a/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc b/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc
index e2142f8..fbfcc15 100644
--- a/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/impression_history_tracker_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
+#include "base/time/time.h"
 #include "chrome/browser/notifications/scheduler/internal/impression_history_tracker.h"
 #include "chrome/browser/notifications/scheduler/test/fake_clock.h"
 #include "chrome/browser/notifications/scheduler/test/test_utils.h"
@@ -23,6 +24,7 @@
 namespace {
 
 const char kGuid1[] = "guid1";
+const char kTimeStr[] = "04/25/20 01:00:00 AM";
 
 struct TestCase {
   // Input data that will be pushed to the target class.
@@ -233,7 +235,7 @@
   tracker()->AddImpression(SchedulerClientType::kTest2, kGuid1);
   VerifyClientStates(test_case);
 
-  SetNow("04/25/20 01:00:00 AM");
+  SetNow(kTimeStr);
 
   EXPECT_CALL(*store(), Update(_, _, _));
   EXPECT_CALL(*delegate(), OnImpressionUpdated());
@@ -254,12 +256,15 @@
   VerifyClientStates(test_case);
 }
 
+// Defines the expected state of impression data after certain user action.
 struct UserActionTestParam {
   ImpressionResult impression_result = ImpressionResult::kInvalid;
   UserFeedback user_feedback = UserFeedback::kNoFeedback;
   int current_max_daily_show = 0;
   base::Optional<ActionButtonType> button_type;
-  base::Optional<SuppressionInfo> suppression_info;
+  bool integrated = false;
+  bool has_suppression = false;
+  std::map<UserFeedback, ImpressionResult> impression_mapping;
 };
 
 class ImpressionHistoryTrackerUserActionTest
@@ -273,28 +278,51 @@
   DISALLOW_COPY_AND_ASSIGN(ImpressionHistoryTrackerUserActionTest);
 };
 
-// TODO(xingliu): Add test for unhelpful/dismiss.
 const UserActionTestParam kUserActionTestParams[] = {
+    // Click.
     {ImpressionResult::kPositive, UserFeedback::kClick, 3, base::nullopt,
-     base::nullopt},
+     true /*integrated*/, false /*has_suppression*/},
+    // Helpful button.
     {ImpressionResult::kPositive, UserFeedback::kHelpful, 3,
-     ActionButtonType::kHelpful, base::nullopt}};
+     ActionButtonType::kHelpful, true /*integrated*/,
+     false /*has_suppression*/},
+    // Unhelpful button.
+    {ImpressionResult::kNegative, UserFeedback::kNotHelpful, 0,
+     ActionButtonType::kUnhelpful, true /*integrated*/,
+     true /*has_suppression*/},
+    // One dismiss.
+    {ImpressionResult::kInvalid, UserFeedback::kDismiss, 2, base::nullopt,
+     false /*integrated*/, false /*has_suppression*/},
+    // Click with negative impression result from impression mapping.
+    {ImpressionResult::kNegative,
+     UserFeedback::kClick,
+     0,
+     base::nullopt,
+     true /*integrated*/,
+     true /*has_suppression*/,
+     {{UserFeedback::kClick,
+       ImpressionResult::kNegative}} /*impression_mapping*/}};
 
 // User actions like clicks should update the ClientState data accordingly.
 TEST_P(ImpressionHistoryTrackerUserActionTest, UserAction) {
+  clock()->SetNow(base::Time::UnixEpoch());
   TestCase test_case = CreateDefaultTestCase();
   Impression impression = CreateImpression(base::Time::Now(), kGuid1);
   DCHECK(!test_case.input.empty());
+  impression.impression_mapping = GetParam().impression_mapping;
   test_case.input.front().impressions.emplace_back(impression);
 
   impression.impression = GetParam().impression_result;
-  impression.integrated = true;
+  impression.integrated = GetParam().integrated;
   impression.feedback = GetParam().user_feedback;
 
   test_case.expected.front().current_max_daily_show =
       GetParam().current_max_daily_show;
   test_case.expected.front().impressions.emplace_back(impression);
-  test_case.expected.front().suppression_info = GetParam().suppression_info;
+  if (GetParam().has_suppression) {
+    test_case.expected.front().suppression_info =
+        SuppressionInfo(base::Time::UnixEpoch(), config().suppression_duration);
+  }
 
   CreateTracker(test_case);
   InitTrackerWithData(test_case);
@@ -302,11 +330,14 @@
   EXPECT_CALL(*delegate(), OnImpressionUpdated());
 
   // Trigger user action.
-  if (GetParam().user_feedback == UserFeedback::kClick)
+  if (GetParam().user_feedback == UserFeedback::kClick) {
     tracker()->OnClick(SchedulerClientType::kTest1, kGuid1);
-  else if (GetParam().button_type.has_value())
+  } else if (GetParam().button_type.has_value()) {
     tracker()->OnActionClick(SchedulerClientType::kTest1, kGuid1,
                              GetParam().button_type.value());
+  } else if (GetParam().user_feedback == UserFeedback::kDismiss) {
+    tracker()->OnDismiss(SchedulerClientType::kTest1, kGuid1);
+  }
 
   VerifyClientStates(test_case);
 }
diff --git a/chrome/browser/notifications/scheduler/test/BUILD.gn b/chrome/browser/notifications/scheduler/test/BUILD.gn
index 51babb20..850d4bdf 100644
--- a/chrome/browser/notifications/scheduler/test/BUILD.gn
+++ b/chrome/browser/notifications/scheduler/test/BUILD.gn
@@ -9,12 +9,15 @@
 }
 
 source_set("test_lib") {
+  testonly = true
   visibility =
       [ "//chrome/browser/notifications/scheduler/internal:unit_tests" ]
 
   sources = [
     "fake_clock.cc",
     "fake_clock.h",
+    "mock_notification_background_task_scheduler.cc",
+    "mock_notification_background_task_scheduler.h",
     "test_utils.cc",
     "test_utils.h",
   ]
@@ -24,5 +27,7 @@
     "//chrome/browser/notifications/scheduler/internal:lib",
     "//chrome/browser/notifications/scheduler/public",
     "//skia",
+    "//testing/gmock",
+    "//testing/gtest",
   ]
 }
diff --git a/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.cc b/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.cc
new file mode 100644
index 0000000..ebaa68d
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.cc
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.h"
+
+namespace notifications {
+namespace test {
+
+MockNotificationBackgroundTaskScheduler::
+    MockNotificationBackgroundTaskScheduler() = default;
+MockNotificationBackgroundTaskScheduler::
+    ~MockNotificationBackgroundTaskScheduler() = default;
+
+}  // namespace test
+}  // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.h b/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.h
new file mode 100644
index 0000000..5a6f45f0
--- /dev/null
+++ b/chrome/browser/notifications/scheduler/test/mock_notification_background_task_scheduler.h
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_TEST_MOCK_NOTIFICATION_BACKGROUND_TASK_SCHEDULER_H_
+#define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_TEST_MOCK_NOTIFICATION_BACKGROUND_TASK_SCHEDULER_H_
+
+#include "chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace notifications {
+namespace test {
+
+class MockNotificationBackgroundTaskScheduler
+    : public NotificationBackgroundTaskScheduler {
+ public:
+  MockNotificationBackgroundTaskScheduler();
+  ~MockNotificationBackgroundTaskScheduler() override;
+  MOCK_METHOD3(Schedule,
+               void(notifications::SchedulerTaskTime,
+                    base::TimeDelta,
+                    base::TimeDelta));
+  MOCK_METHOD0(Cancel, void());
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockNotificationBackgroundTaskScheduler);
+};
+
+}  // namespace test
+}  // namespace notifications
+
+#endif  // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_TEST_MOCK_NOTIFICATION_BACKGROUND_TASK_SCHEDULER_H_
diff --git a/chrome/browser/password_manager/OWNERS b/chrome/browser/password_manager/OWNERS
index 2a1a8dae..6c318a1 100644
--- a/chrome/browser/password_manager/OWNERS
+++ b/chrome/browser/password_manager/OWNERS
@@ -6,3 +6,4 @@
 per-file generated_password_saved_infobar_delegate_android.*=rouslan@chromium.org
 
 # COMPONENT: UI>Browser>Passwords
+# TEAM: chromium-dev@chromium.org
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 04aa289..b99ee1b 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -510,15 +510,9 @@
   if (!pps)
     return;
 
-  syncer::SyncService* sync = ProfileSyncServiceFactory::GetForProfile(
-      Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
-  bool is_account_syncing =
-      (password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD) &&
-      (sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled());
   pps->MaybeStartProtectedPasswordEntryRequest(
       web_contents(), web_contents()->GetLastCommittedURL(), username,
-      password_type, pps->GetAccountInfo().hosted_domain, is_account_syncing,
-      matching_domains, password_field_exists);
+      password_type, matching_domains, password_field_exists);
 }
 
 void ChromePasswordManagerClient::LogPasswordReuseDetectedEvent() {
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index 82088d5f..a9ec2f3a 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -709,9 +709,9 @@
   std::unique_ptr<MockChromePasswordManagerClient> client(
       new MockChromePasswordManagerClient(test_web_contents.get()));
 
-  EXPECT_CALL(*client->password_protection_service(),
-              MaybeStartProtectedPasswordEntryRequest(_, _, "username", _, _, _,
-                                                      _, true))
+  EXPECT_CALL(
+      *client->password_protection_service(),
+      MaybeStartProtectedPasswordEntryRequest(_, _, "username", _, _, true))
       .Times(4);
   client->CheckProtectedPasswordEntry(
       password_manager::metrics_util::PasswordType::SAVED_PASSWORD, "username",
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 3d4167ff..b54bd72 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -713,6 +713,9 @@
   { key::kCrostiniExportImportUIAllowed,
     crostini::prefs::kUserCrostiniExportImportUIAllowedByPolicy,
     base::Value::Type::BOOLEAN },
+  { key::kVmManagementCliAllowed,
+    crostini::prefs::kVmManagementCliAllowedByPolicy,
+    base::Value::Type::BOOLEAN },
   { key::kCrostiniRootAccessAllowed,
     crostini::prefs::kUserCrostiniRootAccessAllowedByPolicy,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 5a5dc0c..61fb3c9 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -763,6 +763,8 @@
                      safe_browsing::LoginReputationClientRequest::
                          PasswordReuseEvent::SyncAccountType());
 
+  MOCK_CONST_METHOD0(IsPrimaryAccountGmail, bool());
+
   AccountInfo GetAccountInfo() const override {
     AccountInfo info;
     info.email = "user@mycompany.com";
@@ -5109,9 +5111,8 @@
 
   // If user is a Gmail user, |GetPasswordProtectionWarningTriggerPref(...)|
   // should return |PHISHING_REUSE| unless specified by policy.
-  EXPECT_CALL(mock_service, GetSyncAccountType())
-      .WillRepeatedly(Return(safe_browsing::LoginReputationClientRequest::
-                                 PasswordReuseEvent::GMAIL));
+  EXPECT_CALL(mock_service, IsPrimaryAccountGmail())
+      .WillRepeatedly(Return(true));
   const PrefService* const prefs = browser()->profile()->GetPrefs();
   EXPECT_FALSE(prefs->FindPreference(prefs::kPasswordProtectionWarningTrigger)
                    ->IsManaged());
diff --git a/chrome/browser/predictors/OWNERS b/chrome/browser/predictors/OWNERS
index 791f6ad..a450e9e 100644
--- a/chrome/browser/predictors/OWNERS
+++ b/chrome/browser/predictors/OWNERS
@@ -1,3 +1,4 @@
 alexilin@chromium.org
 lizeb@chromium.org
 pasko@chromium.org
+# COMPONENT: Internals>Preload
diff --git a/chrome/browser/prefetch/OWNERS b/chrome/browser/prefetch/OWNERS
index 6ed8b171..da0c4fe 100644
--- a/chrome/browser/prefetch/OWNERS
+++ b/chrome/browser/prefetch/OWNERS
@@ -1,2 +1,3 @@
 gavinp@chromium.org
 pasko@chromium.org
+# COMPONENT: Internals>Preload
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 01b87efa..17f773f 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -285,6 +285,7 @@
 #include "chrome/browser/chromeos/preferences.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager.h"
 #include "chrome/browser/chromeos/printing/synced_printers_manager.h"
+#include "chrome/browser/chromeos/release_notes/release_notes_storage.h"
 #include "chrome/browser/chromeos/resource_reporter/resource_reporter.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
 #include "chrome/browser/chromeos/settings/device_settings_cache.h"
@@ -854,6 +855,7 @@
   chromeos::multidevice_setup::MultiDeviceSetupService::RegisterProfilePrefs(
       registry);
   chromeos::MultiProfileUserController::RegisterProfilePrefs(registry);
+  chromeos::ReleaseNotesStorage::RegisterProfilePrefs(registry);
   chromeos::quick_unlock::FingerprintStorage::RegisterProfilePrefs(registry);
   chromeos::quick_unlock::PinStoragePrefs::RegisterProfilePrefs(registry);
   chromeos::Preferences::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/profile_resetter/OWNERS b/chrome/browser/profile_resetter/OWNERS
index bf6227b8..123f39a 100644
--- a/chrome/browser/profile_resetter/OWNERS
+++ b/chrome/browser/profile_resetter/OWNERS
@@ -1,3 +1,5 @@
 battre@chromium.org
 engedy@chromium.org
 vasilii@chromium.org
+# COMPONENT: UI>Browser>Preferences
+# TEAM: chromium-dev@chromium.org
diff --git a/chrome/browser/resources/app_management/browser_proxy.js b/chrome/browser/resources/app_management/browser_proxy.js
index 548ddee4..f824557 100644
--- a/chrome/browser/resources/app_management/browser_proxy.js
+++ b/chrome/browser/resources/app_management/browser_proxy.js
@@ -8,7 +8,7 @@
       /** @type {appManagement.mojom.PageCallbackRouter} */
       this.callbackRouter = new appManagement.mojom.PageCallbackRouter();
 
-      /** @type {appManagement.mojom.PageHandlerInterface} */
+      /** @type {appManagement.mojom.PageHandlerRemote} */
       this.handler = null;
 
       const urlParams = new URLSearchParams(window.location.search);
@@ -26,8 +26,9 @@
           });
         }
 
-        this.handler = new app_management.FakePageHandler(
-            this.callbackRouter.$.createProxy());
+        this.fakeHandler = new app_management.FakePageHandler(
+            this.callbackRouter.$.bindNewPipeAndPassRemote());
+        this.handler = this.fakeHandler.getRemote();
 
         const permissionOptions = {};
         permissionOptions[PwaPermissionType.CONTENT_SETTINGS_TYPE_GEOLOCATION] =
@@ -106,14 +107,14 @@
               ),
         ];
 
-        this.handler.setApps(appList);
+        this.fakeHandler.setApps(appList);
 
       } else {
-        this.handler = new appManagement.mojom.PageHandlerProxy();
-        const factory = appManagement.mojom.PageHandlerFactory.getProxy();
+        this.handler = new appManagement.mojom.PageHandlerRemote();
+        const factory = appManagement.mojom.PageHandlerFactory.getRemote();
         factory.createPageHandler(
-            this.callbackRouter.$.createProxy(),
-            this.handler.$.createRequest());
+            this.callbackRouter.$.bindNewPipeAndPassRemote(),
+            this.handler.$.bindNewPipeAndPassReceiver());
       }
     }
   }
diff --git a/chrome/browser/resources/app_management/fake_page_handler.js b/chrome/browser/resources/app_management/fake_page_handler.js
index db77640..6c8b2492 100644
--- a/chrome/browser/resources/app_management/fake_page_handler.js
+++ b/chrome/browser/resources/app_management/fake_page_handler.js
@@ -112,25 +112,31 @@
     }
 
     /**
-     * @param {appManagement.mojom.PageProxy} page
+     * @param {appManagement.mojom.PageRemote} page
      */
     constructor(page) {
-      /** @type {appManagement.mojom.PageProxy} */
+      this.receiver_ = new appManagement.mojom.PageHandlerReceiver(this);
+      /** @type {appManagement.mojom.PageRemote} */
       this.page = page;
 
       /** @type {!Array<App>} */
       this.apps_ = [];
 
-      this.$ = {
-        flushForTesting: async () => {
-          await this.page.$.flushForTesting();
-        }
-      };
-
       /** @type {number} */
       this.guid = 0;
     }
 
+    /**
+     * @returns {!appManagement.mojom.PageHandlerRemote}
+     */
+    getRemote() {
+      return this.receiver_.$.bindNewPipeAndPassRemote();
+    }
+
+    async flushPipesForTesting() {
+      await this.page.$.flushForTesting();
+    }
+
     async getApps() {
       return {apps: this.apps_};
     }
@@ -200,7 +206,7 @@
       optId = optId || String(this.guid++);
       const app = FakePageHandler.createApp(optId, optConfig);
       this.page.onAppAdded(app);
-      await this.$.flushForTesting();
+      await this.flushPipesForTesting();
       return app;
     }
 
@@ -213,7 +219,7 @@
      */
     async changeApp(id, changes) {
       this.page.onAppChanged(FakePageHandler.createApp(id, changes));
-      await this.$.flushForTesting();
+      await this.flushPipesForTesting();
     }
   }
 
diff --git a/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js b/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
index c70baf6..914c549 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
@@ -145,6 +145,10 @@
     this.capture_.getPhotoCapabilities(),
     cca.mojo.MojoInterface.getProxy().getCameraInfo(this.deviceId_),
   ]);
+
+  if (cameraInfo === null) {
+    throw new Error('No photo capabilities is found for given device id.');
+  }
   const staticMetadata = cameraInfo.staticCameraCharacteristics;
   let supportedEffects = [cros.mojom.Effect.NO_EFFECT];
   if (cca.mojo.getMetadataData_(staticMetadata, portraitModeTag).length > 0) {
@@ -199,6 +203,10 @@
 
   let {cameraInfo} =
       await cca.mojo.MojoInterface.getProxy().getCameraInfo(deviceId);
+  if (cameraInfo === null) {
+    throw new Error('No photo resolutions is found for given device id.');
+  }
+
   const staticMetadata = cameraInfo.staticCameraCharacteristics;
   const streamConfigs = cca.mojo.getMetadataData_(
       staticMetadata,
@@ -237,6 +245,9 @@
 
   let {cameraInfo} =
       await cca.mojo.MojoInterface.getProxy().getCameraInfo(deviceId);
+  if (cameraInfo === null) {
+    throw new Error('No video configs is found for given device id.');
+  }
   const staticMetadata = cameraInfo.staticCameraCharacteristics;
   const minFrameDurationConfigs = cca.mojo.getMetadataData_(
       staticMetadata,
@@ -271,6 +282,9 @@
 cca.mojo.getCameraFacing = async function(deviceId) {
   let {cameraInfo} =
       await cca.mojo.MojoInterface.getProxy().getCameraInfo(deviceId);
+  if (cameraInfo === null) {
+    throw new Error('No camera facing is found for given device id.');
+  }
   return cameraInfo.facing;
 };
 
@@ -286,6 +300,10 @@
 
   let {cameraInfo} =
       await cca.mojo.MojoInterface.getProxy().getCameraInfo(deviceId);
+  if (cameraInfo === null) {
+    throw new Error('No supported Fps Ranges is found for given device id.');
+  }
+
   const staticMetadata = cameraInfo.staticCameraCharacteristics;
   const availableFpsRanges = cca.mojo.getMetadataData_(
       staticMetadata,
diff --git a/chrome/browser/resources/chromeos/password_change/confirm_password_change.html b/chrome/browser/resources/chromeos/password_change/confirm_password_change.html
index 1c4605a4..96a768e 100644
--- a/chrome/browser/resources/chromeos/password_change/confirm_password_change.html
+++ b/chrome/browser/resources/chromeos/password_change/confirm_password_change.html
@@ -22,15 +22,31 @@
     <template>
       <style>
         ::part(dialog) {
-          /* We don't show the dialogs border using CSS since we show this
-          dialog inside a system dialog - we don't want two borders. */
-          border-radius: 0;
+          /* The HTML dialog should fill the entire system dialog. */
           height: 100%;
           width: 100%;
         }
 
         [slot='title'] {
-          padding-top: 0;
+          color: black;
+          font-family: Roboto, sans-serif;
+          font-size: 15px;
+          padding: 24px 24px 16px;
+        }
+
+        [slot='body'] {
+          color: rgb(20, 21, 24);
+          font-family: Roboto, sans-serif;
+          font-size: 13px;
+          padding: 0 48px 0 24px;
+        }
+
+        [slot='button-container'] {
+          bottom: 16px;
+          box-sizing: border-box;
+          padding: 0 16px;
+          position: fixed;
+          width: 100%;
         }
 
         .label {
diff --git a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html
index 805b2bb..dd539af 100644
--- a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html
+++ b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html
@@ -21,33 +21,37 @@
     <template>
       <style>
         ::part(dialog) {
-          /* We don't show the dialogs border using CSS since we show this
-          dialog inside a system dialog - we don't want two borders. */
-          border-radius: 0;
+          /* The HTML dialog should fill the entire system dialog. */
           height: 100%;
           width: 100%;
         }
 
         [slot='title'] {
-          color: var(--google-grey-800);
-          font-size: 24px;
-          padding: 16px 48px;
+          color: rgb(20, 21, 25);
+          font-family: Google Sans, sans-serif;
+          font-size: 28px;
+          padding: 64px 64px 8px;
         }
 
         #title-icon {
-          --iron-icon-fill-color: var(--google-grey-800);
+          --iron-icon-fill-color: rgb(20, 21, 25);
+          height: 32px;
           padding-bottom: 24px;
+          width: 32px;
         }
 
         [slot='body'] {
-          padding: 0 48px;
+          color: rgb(21, 21, 21);
+          font-family: Roboto, sans-serif;
+          font-size: 13px;
+          padding: 0 64px;
         }
 
         [slot='button-container'] {
-          bottom: 0;
+          bottom: 32px;
           box-sizing: border-box;
-          padding: 32px 48px;
-          position: absolute;
+          padding: 0 32px;
+          position: fixed;
           width: 100%;
         }
       </style>
diff --git a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js b/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js
index f0e93978..5b9f456 100644
--- a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js
+++ b/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js
@@ -84,7 +84,7 @@
 
 document.addEventListener('DOMContentLoaded', function() {
   // Setup backend mojo.
-  pageHandler = exploreSitesInternals.mojom.PageHandler.getProxy();
+  pageHandler = exploreSitesInternals.mojom.PageHandler.getRemote();
   updatePageWithProperties();
 
   // Set up event listeners.
diff --git a/chrome/browser/resources/feed_internals/feed_internals.js b/chrome/browser/resources/feed_internals/feed_internals.js
index 02f22a2..398104bc 100644
--- a/chrome/browser/resources/feed_internals/feed_internals.js
+++ b/chrome/browser/resources/feed_internals/feed_internals.js
@@ -6,7 +6,7 @@
 
 /**
  * Reference to the backend.
- * @type {feedInternals.mojom.PageHandlerProxy}
+ * @type {feedInternals.mojom.PageHandlerRemote}
  */
 let pageHandler = null;
 
@@ -153,7 +153,7 @@
 
 document.addEventListener('DOMContentLoaded', function() {
   // Setup backend mojo.
-  pageHandler = feedInternals.mojom.PageHandler.getProxy();
+  pageHandler = feedInternals.mojom.PageHandler.getRemote();
 
   updatePageWithProperties();
   updatePageWithUserClass();
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 19192d1..0622671 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -249,13 +249,6 @@
 let isDarkModeEnabled = false;
 
 /**
- * True if dark colored chips should be used instead of light mode chips when
- * dark mode is enabled.
- * @type {boolean}
- */
-let useDarkChips = false;
-
-/**
  * Returns a timeout that can be executed early. Calls back true if this was
  * an early execution, false otherwise.
  * @param {!Function} timeout The timeout function. Requires a boolean param.
@@ -353,8 +346,7 @@
 
   // Update dark mode styling.
   isDarkModeEnabled = window.matchMedia('(prefers-color-scheme: dark)').matches;
-  useDarkChips = getUseDarkChips(info);
-  document.body.classList.toggle('light-chip', !useDarkChips);
+  document.body.classList.toggle('light-chip', !getUseDarkChips(info));
 
   const background = [
     convertToRGBAColor(info.backgroundColorRgba), info.imageUrl,
@@ -493,18 +485,9 @@
  * Callback for embeddedSearch.newTabPage.onthemechange.
  */
 function onThemeChange() {
-  // Save the current dark mode state to check if dark mode has changed.
-  const usingDarkChips = useDarkChips;
-
   renderTheme();
   renderOneGoogleBarTheme();
   sendThemeInfoToMostVisitedIframe();
-
-  // If dark mode has been changed, refresh the MV tiles to render the
-  // appropriate icon.
-  if (usingDarkChips != useDarkChips) {
-    reloadTiles();
-  }
 }
 
 /**
diff --git a/chrome/browser/resources/print_preview/cloud_print_interface.js b/chrome/browser/resources/print_preview/cloud_print_interface.js
index 8fb44136..477efe90 100644
--- a/chrome/browser/resources/print_preview/cloud_print_interface.js
+++ b/chrome/browser/resources/print_preview/cloud_print_interface.js
@@ -2,72 +2,70 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('cloudprint');
-
-/**
- * Event types dispatched by the cloudprint interface.
- * @enum {string}
- */
-cloudprint.CloudPrintInterfaceEventType = {
-  INVITES_DONE: 'cloudprint.CloudPrintInterface.INVITES_DONE',
-  INVITES_FAILED: 'cloudprint.CloudPrintInterface.INVITES_FAILED',
-  PRINTER_DONE: 'cloudprint.CloudPrintInterface.PRINTER_DONE',
-  PRINTER_FAILED: 'cloudprint.CloudPrintInterface.PRINTER_FAILED',
-  PROCESS_INVITE_DONE: 'cloudprint.CloudPrintInterface.PROCESS_INVITE_DONE',
-  SEARCH_DONE: 'cloudprint.CloudPrintInterface.SEARCH_DONE',
-  SEARCH_FAILED: 'cloudprint.CloudPrintInterface.SEARCH_FAILED',
-  SUBMIT_DONE: 'cloudprint.CloudPrintInterface.SUBMIT_DONE',
-  SUBMIT_FAILED: 'cloudprint.CloudPrintInterface.SUBMIT_FAILED',
-  UPDATE_USERS: 'cloudprint.CloudPrintInterface.UPDATE_USERS',
-};
-
-/**
- * @typedef {{
- *   status: number,
- *   errorCode: number,
- *   message: string,
- *   origin: !print_preview.DestinationOrigin,
- * }}
- */
-cloudprint.CloudPrintInterfaceErrorEventDetail;
-
-/**
- * @typedef {{
- *   user: string,
- *   origin: !print_preview.DestinationOrigin,
- *   printers: (!Array<!print_preview.Destination>|undefined),
- *   searchDone: boolean,
- * }}
- */
-cloudprint.CloudPrintInterfaceSearchDoneDetail;
-
-/**
- * @typedef {{
- *   destinationId: string,
- *   origin: !print_preview.DestinationOrigin,
- * }}
- */
-cloudprint.CloudPrintInterfacePrinterFailedDetail;
-
-/**
- * @typedef {{
- *   invitations: !Array<!print_preview.Invitation>,
- *   user: string,
- * }}
- */
-cloudprint.CloudPrintInterfaceInvitesDoneDetail;
-
-/**
- * @typedef {{
- *   invitation: !print_preview.Invitation,
- *   printer: ?print_preview.Destination,
- *   accept: boolean,
- *   user: string,
- * }}
- */
-cloudprint.CloudPrintInterfaceProcessInviteDetail;
-
 cr.define('cloudprint', function() {
+  /**
+   * Event types dispatched by the cloudprint interface.
+   * @enum {string}
+   */
+  const CloudPrintInterfaceEventType = {
+    INVITES_DONE: 'cloudprint.CloudPrintInterface.INVITES_DONE',
+    INVITES_FAILED: 'cloudprint.CloudPrintInterface.INVITES_FAILED',
+    PRINTER_DONE: 'cloudprint.CloudPrintInterface.PRINTER_DONE',
+    PRINTER_FAILED: 'cloudprint.CloudPrintInterface.PRINTER_FAILED',
+    PROCESS_INVITE_DONE: 'cloudprint.CloudPrintInterface.PROCESS_INVITE_DONE',
+    SEARCH_DONE: 'cloudprint.CloudPrintInterface.SEARCH_DONE',
+    SEARCH_FAILED: 'cloudprint.CloudPrintInterface.SEARCH_FAILED',
+    SUBMIT_DONE: 'cloudprint.CloudPrintInterface.SUBMIT_DONE',
+    SUBMIT_FAILED: 'cloudprint.CloudPrintInterface.SUBMIT_FAILED',
+    UPDATE_USERS: 'cloudprint.CloudPrintInterface.UPDATE_USERS',
+  };
+
+  /**
+   * @typedef {{
+   *   status: number,
+   *   errorCode: number,
+   *   message: string,
+   *   origin: !print_preview.DestinationOrigin,
+   * }}
+   */
+  let CloudPrintInterfaceErrorEventDetail;
+
+  /**
+   * @typedef {{
+   *   user: string,
+   *   origin: !print_preview.DestinationOrigin,
+   *   printers: (!Array<!print_preview.Destination>|undefined),
+   *   searchDone: boolean,
+   * }}
+   */
+  let CloudPrintInterfaceSearchDoneDetail;
+
+  /**
+   * @typedef {{
+   *   destinationId: string,
+   *   origin: !print_preview.DestinationOrigin,
+   * }}
+   */
+  let CloudPrintInterfacePrinterFailedDetail;
+
+  /**
+   * @typedef {{
+   *   invitations: !Array<!print_preview.Invitation>,
+   *   user: string,
+   * }}
+   */
+  let CloudPrintInterfaceInvitesDoneDetail;
+
+  /**
+   * @typedef {{
+   *   invitation: !print_preview.Invitation,
+   *   printer: ?print_preview.Destination,
+   *   accept: boolean,
+   *   user: string,
+   * }}
+   */
+  let CloudPrintInterfaceProcessInviteDetail;
+
   /** @interface */
   class CloudPrintInterface {
     /**
@@ -133,5 +131,13 @@
   // Export
   return {
     CloudPrintInterface: CloudPrintInterface,
+    CloudPrintInterfaceErrorEventDetail: CloudPrintInterfaceErrorEventDetail,
+    CloudPrintInterfaceEventType: CloudPrintInterfaceEventType,
+    CloudPrintInterfaceInvitesDoneDetail: CloudPrintInterfaceInvitesDoneDetail,
+    CloudPrintInterfacePrinterFailedDetail:
+        CloudPrintInterfacePrinterFailedDetail,
+    CloudPrintInterfaceProcessInviteDetail:
+        CloudPrintInterfaceProcessInviteDetail,
+    CloudPrintInterfaceSearchDoneDetail: CloudPrintInterfaceSearchDoneDetail,
   };
 });
diff --git a/chrome/browser/resources/print_preview/data/destination_store.js b/chrome/browser/resources/print_preview/data/destination_store.js
index 20449f32..61402a25 100644
--- a/chrome/browser/resources/print_preview/data/destination_store.js
+++ b/chrome/browser/resources/print_preview/data/destination_store.js
@@ -818,7 +818,8 @@
 
     /**
      * Initiates loading of destinations.
-     * @param{print_preview.PrinterType} type The type of destinations to load.
+     * @param {!print_preview.PrinterType} type The type of destinations to
+     *     load.
      * @private
      */
     startLoadDestinations_(type) {
@@ -1328,7 +1329,7 @@
     /**
      * Called when a printer or printers are detected after sending getPrinters
      * from the native layer.
-     * @param {print_preview.PrinterType} type The type of printer(s) added.
+     * @param {!print_preview.PrinterType} type The type of printer(s) added.
      * @param {!Array<!print_preview.LocalDestinationInfo |
      *                !print_preview.PrivetPrinterDescription |
      *                !print_preview.ProvisionalDestinationInfo>} printers
diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
index b09c017..fe78ee05 100644
--- a/chrome/browser/resources/print_preview/native_layer.js
+++ b/chrome/browser/resources/print_preview/native_layer.js
@@ -2,116 +2,115 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview');
-
-/**
- * @typedef {{selectSaveAsPdfDestination: boolean,
- *            layoutSettings.portrait: boolean,
- *            pageRange: string,
- *            headersAndFooters: boolean,
- *            backgroundColorsAndImages: boolean,
- *            margins: number}}
- * @see chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
- */
-print_preview.PreviewSettings;
-
-/**
- * @typedef {{
- *   deviceName: string,
- *   printerName: string,
- *   printerDescription: (string | undefined),
- *   cupsEnterprisePrinter: (boolean | undefined),
- *   printerOptions: (Object | undefined),
- *   policies: (print_preview.Policies | undefined),
- * }}
- */
-print_preview.LocalDestinationInfo;
-
-/**
- * @typedef {{
- *   isInKioskAutoPrintMode: boolean,
- *   isInAppKioskMode: boolean,
- *   uiLocale: string,
- *   thousandsDelimeter: string,
- *   decimalDelimeter: string,
- *   unitType: !print_preview.MeasurementSystemUnitType,
- *   previewModifiable: boolean,
- *   documentTitle: string,
- *   documentHasSelection: boolean,
- *   shouldPrintSelectionOnly: boolean,
- *   printerName: string,
- *   headerFooter: (boolean | undefined),
- *   isHeaderFooterManaged: boolean,
- *   serializedAppStateStr: ?string,
- *   serializedDefaultDestinationSelectionRulesStr: ?string,
- *   cloudPrintURL: (string | undefined),
- *   userAccounts: (Array<string> | undefined),
- *   syncAvailable: boolean
- * }}
- * @see corresponding field name definitions in print_preview_handler.cc
- */
-print_preview.NativeInitialSettings;
-
-/**
- * @typedef {{
- *   serviceName: string,
- *   name: string,
- *   hasLocalPrinting: boolean,
- *   isUnregistered: boolean,
- *   cloudID: string,
- * }}
- * @see PrintPreviewHandler::FillPrinterDescription in print_preview_handler.cc
- */
-print_preview.PrivetPrinterDescription;
-
-/**
- * @typedef {{
- *   printer:(print_preview.PrivetPrinterDescription |
- *            print_preview.LocalDestinationInfo |
- *            undefined),
- *   capabilities: !print_preview.Cdd,
- * }}
- */
-print_preview.CapabilitiesResponse;
-
-/**
- * @typedef {{
- *   printerId: string,
- *   success: boolean,
- *   capabilities: !print_preview.Cdd,
- *   policies: (print_preview.Policies | undefined),
- * }}
- */
-print_preview.PrinterSetupResponse;
-
-/**
- * @typedef {{
- *   extensionId: string,
- *   extensionName: string,
- *   id: string,
- *   name: string,
- *   description: (string|undefined),
- * }}
- */
-print_preview.ProvisionalDestinationInfo;
-
-/**
- * Printer types for capabilities and printer list requests.
- * Should match PrinterType in print_preview_handler.h
- * @enum {number}
- */
-print_preview.PrinterType = {
-  PRIVET_PRINTER: 0,
-  EXTENSION_PRINTER: 1,
-  PDF_PRINTER: 2,
-  LOCAL_PRINTER: 3,
-  CLOUD_PRINTER: 4
-};
-
 cr.define('print_preview', function() {
   'use strict';
 
   /**
+   * @typedef {{selectSaveAsPdfDestination: boolean,
+   *            layoutSettings.portrait: boolean,
+   *            pageRange: string,
+   *            headersAndFooters: boolean,
+   *            backgroundColorsAndImages: boolean,
+   *            margins: number}}
+   * @see chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
+   */
+  let PreviewSettings;
+
+  /**
+   * @typedef {{
+   *   deviceName: string,
+   *   printerName: string,
+   *   printerDescription: (string | undefined),
+   *   cupsEnterprisePrinter: (boolean | undefined),
+   *   printerOptions: (Object | undefined),
+   *   policies: (print_preview.Policies | undefined),
+   * }}
+   */
+  let LocalDestinationInfo;
+
+  /**
+   * @typedef {{
+   *   isInKioskAutoPrintMode: boolean,
+   *   isInAppKioskMode: boolean,
+   *   uiLocale: string,
+   *   thousandsDelimeter: string,
+   *   decimalDelimeter: string,
+   *   unitType: !print_preview.MeasurementSystemUnitType,
+   *   previewModifiable: boolean,
+   *   documentTitle: string,
+   *   documentHasSelection: boolean,
+   *   shouldPrintSelectionOnly: boolean,
+   *   printerName: string,
+   *   headerFooter: (boolean | undefined),
+   *   isHeaderFooterManaged: boolean,
+   *   serializedAppStateStr: ?string,
+   *   serializedDefaultDestinationSelectionRulesStr: ?string,
+   *   cloudPrintURL: (string | undefined),
+   *   userAccounts: (Array<string> | undefined),
+   *   syncAvailable: boolean
+   * }}
+   * @see corresponding field name definitions in print_preview_handler.cc
+   */
+  let NativeInitialSettings;
+
+  /**
+   * @typedef {{
+   *   serviceName: string,
+   *   name: string,
+   *   hasLocalPrinting: boolean,
+   *   isUnregistered: boolean,
+   *   cloudID: string,
+   * }}
+   * @see PrintPreviewHandler::FillPrinterDescription in
+   * print_preview_handler.cc
+   */
+  let PrivetPrinterDescription;
+
+  /**
+   * @typedef {{
+   *   printer:(print_preview.PrivetPrinterDescription |
+   *            print_preview.LocalDestinationInfo |
+   *            undefined),
+   *   capabilities: !print_preview.Cdd,
+   * }}
+   */
+  let CapabilitiesResponse;
+
+  /**
+   * @typedef {{
+   *   printerId: string,
+   *   success: boolean,
+   *   capabilities: !print_preview.Cdd,
+   *   policies: (print_preview.Policies | undefined),
+   * }}
+   */
+  let PrinterSetupResponse;
+
+  /**
+   * @typedef {{
+   *   extensionId: string,
+   *   extensionName: string,
+   *   id: string,
+   *   name: string,
+   *   description: (string|undefined),
+   * }}
+   */
+  let ProvisionalDestinationInfo;
+
+  /**
+   * Printer types for capabilities and printer list requests.
+   * Should match PrinterType in print_preview_handler.h
+   * @enum {number}
+   */
+  const PrinterType = {
+    PRIVET_PRINTER: 0,
+    EXTENSION_PRINTER: 1,
+    PDF_PRINTER: 2,
+    LOCAL_PRINTER: 3,
+    CLOUD_PRINTER: 4
+  };
+
+  /**
    * An interface to the native Chromium printing system layer.
    */
   class NativeLayer {
@@ -324,6 +323,14 @@
 
   // Export
   return {
-    NativeLayer: NativeLayer
+    CapabilitiesResponse: CapabilitiesResponse,
+    LocalDestinationInfo: LocalDestinationInfo,
+    NativeInitialSettings: NativeInitialSettings,
+    NativeLayer: NativeLayer,
+    PreviewSettings: PreviewSettings,
+    PrinterSetupResponse: PrinterSetupResponse,
+    PrinterType: PrinterType,
+    PrivetPrinterDescription: PrivetPrinterDescription,
+    ProvisionalDestinationInfo: ProvisionalDestinationInfo,
   };
 });
diff --git a/chrome/browser/resources/settings/about_page/about_page.html b/chrome/browser/resources/settings/about_page/about_page.html
index ebdeb673..18c371c 100644
--- a/chrome/browser/resources/settings/about_page/about_page.html
+++ b/chrome/browser/resources/settings/about_page/about_page.html
@@ -215,6 +215,19 @@
             </div>
           </template>
 </if>
+<if expr="chromeos">
+          <template is="dom-if" if="[[hasReleaseNotes_]]">
+            <cr-link-row class="hr" id="releaseNotesOnline"
+                hidden="[[!hasInternetConnection_]]"
+                on-click="onReleaseNotesTap_"
+                label="$i18n{aboutShowReleaseNotes}" external></cr-link-row>
+            <cr-link-row class="hr" id="releaseNotesOffline"
+                hidden="[[hasInternetConnection_]]"
+                on-click="onReleaseNotesTap_"
+                label="$i18n{aboutShowReleaseNotes}"
+                title="$i18n{aboutReleaseNotesOffline}" external></cr-link-row>
+          </template>
+</if>
           <cr-link-row class="hr" id="help" on-click="onHelpTap_"
               label="$i18n{aboutGetHelpUsingChrome}" external></cr-link-row>
 <if expr="_google_chrome">
diff --git a/chrome/browser/resources/settings/about_page/about_page.js b/chrome/browser/resources/settings/about_page/about_page.js
index 889229d..4899236f 100644
--- a/chrome/browser/resources/settings/about_page/about_page.js
+++ b/chrome/browser/resources/settings/about_page/about_page.js
@@ -63,6 +63,13 @@
       value: false,
     },
 
+    /** @private */
+    hasReleaseNotes_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
     showCrostini: Boolean,
 
     /**
@@ -84,6 +91,12 @@
     },
     // </if>
 
+    /** @private */
+    hasInternetConnection_: {
+      type: Boolean,
+      value: false,
+    },
+
     // <if expr="_google_chrome and is_macosx">
     /** @private {!PromoteUpdaterStatus} */
     promoteUpdaterStatus_: Object,
@@ -224,6 +237,14 @@
       this.hasEndOfLife_ = result;
     });
 
+    this.aboutBrowserProxy_.getEnabledReleaseNotes().then(result => {
+      this.hasReleaseNotes_ = result;
+    });
+
+    this.aboutBrowserProxy_.checkInternetConnection().then(result => {
+      this.hasInternetConnection_ = result;
+    });
+
     // </if>
     // <if expr="not chromeos">
     this.startListening_();
@@ -315,6 +336,11 @@
   },
 
   /** @private */
+  onReleaseNotesTap_: function() {
+    this.aboutBrowserProxy_.launchReleaseNotes();
+  },
+
+  /** @private */
   onHelpTap_: function() {
     this.aboutBrowserProxy_.openHelpPage();
   },
diff --git a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
index 79db3c0b..d1f1373 100644
--- a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
+++ b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
@@ -153,6 +153,12 @@
      */
     refreshUpdateStatus() {}
 
+    // <if expr="chromeos">
+    /** Opens the release notes app. */
+    launchReleaseNotes() {}
+    // </if>
+
+
     /** Opens the help page. */
     openHelpPage() {}
 
@@ -220,6 +226,20 @@
      */
     promoteUpdater() {}
     // </if>
+
+    // <if expr="chromeos">
+    /**
+     * Checks if the device has release notes enabled.
+     * @return {!Promise<boolean>}
+     */
+    getEnabledReleaseNotes() {}
+
+    /**
+     * Checks if the device is connected to the internet.
+     * @return {!Promise<boolean>}
+     */
+    checkInternetConnection() {}
+    // </if>
   }
 
   /**
@@ -245,6 +265,11 @@
     // </if>
 
     /** @override */
+    launchReleaseNotes() {
+      chrome.send('launchReleaseNotes');
+    }
+
+    /** @override */
     openHelpPage() {
       chrome.send('openHelpPage');
     }
@@ -299,6 +324,16 @@
     }
 
     /** @override */
+    getEnabledReleaseNotes() {
+      return cr.sendWithPromise('getEnabledReleaseNotes');
+    }
+
+    /** @override */
+    checkInternetConnection() {
+      return cr.sendWithPromise('checkInternetConnection');
+    }
+
+    /** @override */
     refreshTPMFirmwareUpdateStatus() {
       chrome.send('refreshTPMFirmwareUpdateStatus');
     }
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
index a66a14e..bf62308 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -152,6 +152,17 @@
               </a>
             </div>
           </cr-link-row>
+          <template is="dom-if" if="[[hasReleaseNotes_]]">
+            <cr-link-row class="hr" id="releaseNotesOnline"
+                hidden="[[!hasInternetConnection_]]"
+                on-click="onReleaseNotesTap_"
+                label="$i18n{aboutShowReleaseNotes}" external></cr-link-row>
+            <cr-link-row class="hr" id="releaseNotesOffline"
+                hidden="[[hasInternetConnection_]]"
+                on-click="onReleaseNotesTap_"
+                label="$i18n{aboutShowReleaseNotes}"
+                title="$i18n{aboutReleaseNotesOffline}" external></cr-link-row>
+          </template>
           <cr-link-row class="hr" id="help" on-click="onHelpClick_"
               label="$i18n{aboutGetHelpUsingChromeOs}" external></cr-link-row>
 <if expr="_google_chrome">
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
index a98c7593..85e4b1d9 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -63,6 +63,18 @@
     },
 
     /** @private */
+    hasInternetConnection_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
+    hasReleaseNotes_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private */
     showCrostini: Boolean,
 
     /** @private */
@@ -177,6 +189,14 @@
       this.hasEndOfLife_ = result;
     });
 
+    this.aboutBrowserProxy_.getEnabledReleaseNotes().then(result => {
+      this.hasReleaseNotes_ = result;
+    });
+
+    this.aboutBrowserProxy_.checkInternetConnection().then(result => {
+      this.hasInternetConnection_ = result;
+    });
+
     if (settings.getQueryParameters().get('checkForUpdate') == 'true') {
       this.onCheckUpdatesClick_();
     }
@@ -232,6 +252,11 @@
   },
 
   /** @private */
+  onReleaseNotesTap_: function() {
+    this.aboutBrowserProxy_.showReleaseNotes();
+  },
+
+  /** @private */
   onHelpClick_: function() {
     this.aboutBrowserProxy_.openOsHelpPage();
   },
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index 44885c2..7b37cdf 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -83,6 +83,9 @@
 
 namespace safe_browsing {
 
+using ReusedPasswordAccountType =
+    LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordAccountType;
+
 namespace {
 
 // The number of user gestures we trace back for login event attribution.
@@ -313,6 +316,7 @@
   if (!service)
     return false;
 
+  // TODO(crbug.com/914410): Account for non sync users.
   if (password_type == PasswordType::ENTERPRISE_PASSWORD)
     return service->HasUnhandledEnterprisePasswordReuse(web_contents);
 
@@ -386,8 +390,13 @@
     const std::string& verdict_token,
     PasswordType password_type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  bool enable_warning_for_non_sync_users = base::FeatureList::IsEnabled(
+      safe_browsing::kPasswordProtectionForSignedInUsers);
   DCHECK(password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD ||
-         password_type == PasswordType::ENTERPRISE_PASSWORD);
+         password_type == PasswordType::ENTERPRISE_PASSWORD ||
+         (enable_warning_for_non_sync_users &&
+          password_type == PasswordType::OTHER_GAIA_PASSWORD));
   // Don't show warning again if there is already a modal warning showing.
   if (IsModalWarningShowingInWebContents(web_contents))
     return;
@@ -413,8 +422,7 @@
     const std::string& verdict_token) {
   LogWarningAction(WarningUIType::MODAL_DIALOG, WarningAction::SHOWN,
                    GetPasswordProtectionReusedPasswordAccountType(
-                       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-                       GetAccountInfo().hosted_domain));
+                       PasswordType::PRIMARY_ACCOUNT_PASSWORD));
 
   if (!IsIncognito()) {
     DictionaryPrefUpdate update(
@@ -427,9 +435,11 @@
             base::NumberToString(GetLastCommittedNavigationID(web_contents))));
   }
 
+  // TODO(crbug/914410): Account for non sync users.
   UpdateSecurityState(SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE,
                       PasswordType::PRIMARY_ACCOUNT_PASSWORD, web_contents);
 
+  // TODO(crbug/914410): Account for non sync users.
   // Starts preparing post-warning report.
   MaybeStartThreatDetailsCollection(web_contents, verdict_token,
                                     PasswordType::PRIMARY_ACCOUNT_PASSWORD);
@@ -438,10 +448,9 @@
 void ChromePasswordProtectionService::OnModalWarningShownForEnterprisePassword(
     content::WebContents* web_contents,
     const std::string& verdict_token) {
-  LogWarningAction(
-      WarningUIType::MODAL_DIALOG, WarningAction::SHOWN,
-      GetPasswordProtectionReusedPasswordAccountType(
-          PasswordType::ENTERPRISE_PASSWORD, GetAccountInfo().hosted_domain));
+  LogWarningAction(WarningUIType::MODAL_DIALOG, WarningAction::SHOWN,
+                   GetPasswordProtectionReusedPasswordAccountType(
+                       PasswordType::ENTERPRISE_PASSWORD));
   web_contents_with_unhandled_enterprise_reuses_.insert(web_contents);
   UpdateSecurityState(SB_THREAT_TYPE_ENTERPRISE_PASSWORD_REUSE,
                       PasswordType::ENTERPRISE_PASSWORD, web_contents);
@@ -454,7 +463,8 @@
     content::WebContents* web_contents,
     PasswordType password_type) {
   DCHECK(password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD ||
-         password_type == PasswordType::ENTERPRISE_PASSWORD);
+         password_type == PasswordType::ENTERPRISE_PASSWORD ||
+         password_type == PasswordType::OTHER_GAIA_PASSWORD);
   // Exit fullscreen if this |web_contents| is showing in fullscreen mode.
   if (web_contents->IsFullscreenForCurrentTab())
     web_contents->ExitFullscreen(/*will_cause_resize=*/true);
@@ -471,9 +481,9 @@
       post_data.data(), post_data.size());
   web_contents->OpenURL(params);
 
-  LogWarningAction(WarningUIType::INTERSTITIAL, WarningAction::SHOWN,
-                   GetPasswordProtectionReusedPasswordAccountType(
-                       password_type, GetAccountInfo().hosted_domain));
+  LogWarningAction(
+      WarningUIType::INTERSTITIAL, WarningAction::SHOWN,
+      GetPasswordProtectionReusedPasswordAccountType(password_type));
 }
 
 void ChromePasswordProtectionService::OnUserAction(
@@ -481,9 +491,9 @@
     PasswordType password_type,
     WarningUIType ui_type,
     WarningAction action) {
-  LogWarningAction(ui_type, action,
-                   GetPasswordProtectionReusedPasswordAccountType(
-                       password_type, GetAccountInfo().hosted_domain));
+  LogWarningAction(
+      ui_type, action,
+      GetPasswordProtectionReusedPasswordAccountType(password_type));
 
   switch (ui_type) {
     case WarningUIType::PAGE_INFO:
@@ -521,6 +531,7 @@
   if (!trigger_manager_)
     return;
 
+  // TODO(crbug/914410): Account for non sync users.
   security_interstitials::UnsafeResource resource;
   resource.threat_type = password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD
                              ? SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE
@@ -579,6 +590,7 @@
 bool ChromePasswordProtectionService::IsPingingEnabled(
     LoginReputationClientRequest::TriggerType trigger_type,
     PasswordType password_type,
+    const std::string& username,
     RequestOutcome* reason) {
   if (!IsSafeBrowsingEnabled()) {
     *reason = RequestOutcome::SAFE_BROWSING_DISABLED;
@@ -589,12 +601,6 @@
     if (password_type == PasswordType::SAVED_PASSWORD)
       return true;
 
-    if (password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD &&
-        GetSyncAccountType() == PasswordReuseEvent::NOT_SIGNED_IN) {
-      *reason = RequestOutcome::USER_NOT_SIGNED_IN;
-      return false;
-    }
-
     PasswordProtectionTrigger trigger_level =
         GetPasswordProtectionWarningTriggerPref();
     if (trigger_level == PASSWORD_PROTECTION_OFF) {
@@ -624,10 +630,36 @@
          sync->GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES);
 }
 
-bool ChromePasswordProtectionService::IsAccountSyncing() {
+bool ChromePasswordProtectionService::IsPrimaryAccountSyncing() const {
   syncer::SyncService* sync =
       ProfileSyncServiceFactory::GetForProfile(profile_);
-  return sync && sync->IsSyncFeatureActive();
+  return sync && sync->IsSyncFeatureActive() && !sync->IsLocalSyncEnabled();
+}
+
+bool ChromePasswordProtectionService::IsPrimaryAccountSignedIn() const {
+  return !GetAccountInfo().account_id.empty() &&
+         !GetAccountInfo().hosted_domain.empty();
+}
+
+bool ChromePasswordProtectionService::IsPrimaryAccountGmail() const {
+  return GetAccountInfo().hosted_domain == kNoHostedDomainFound;
+}
+
+bool ChromePasswordProtectionService::IsOtherGaiaAccountSignedIn(
+    const std::string& username) const {
+  auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
+      profile_->GetOriginalProfile());
+
+  if (!identity_manager)
+    return false;
+
+  std::vector<CoreAccountInfo> signed_in_accounts =
+      identity_manager->GetAccountsWithRefreshTokens();
+
+  return std::find_if(signed_in_accounts.begin(), signed_in_accounts.end(),
+                      [username](const auto& account) {
+                        return account.email == username;
+                      }) != signed_in_accounts.end();
 }
 
 void ChromePasswordProtectionService::MaybeLogPasswordReuseDetectedEvent(
@@ -700,7 +732,7 @@
 PasswordReuseEvent::SyncAccountType
 ChromePasswordProtectionService::GetSyncAccountType() const {
   const AccountInfo account_info = GetAccountInfo();
-  if (account_info.account_id.empty() || account_info.hosted_domain.empty()) {
+  if (!IsPrimaryAccountSignedIn()) {
     return PasswordReuseEvent::NOT_SIGNED_IN;
   }
 
@@ -932,6 +964,7 @@
 }
 
 void ChromePasswordProtectionService::CheckGaiaPasswordChange() {
+  // TODO(bdea): Check non-sync accounts.
   std::string new_sync_password_hash = GetSyncPasswordHashFromPrefs();
   if (sync_password_hash_ != new_sync_password_hash) {
     sync_password_hash_ = new_sync_password_hash;
@@ -948,7 +981,8 @@
   MaybeLogPasswordCapture(/*did_log_in=*/true);
   for (auto& observer : observer_list_)
     observer.OnGaiaPasswordChanged();
-  if (GetSyncAccountType() == PasswordReuseEvent::GSUITE)
+
+  if (!IsPrimaryAccountGmail())
     ReportPasswordChanged();
 }
 
@@ -972,7 +1006,6 @@
 AccountInfo ChromePasswordProtectionService::GetAccountInfo() const {
   auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
       profile_->GetOriginalProfile());
-
   if (!identity_manager)
     return AccountInfo();
 
@@ -1162,23 +1195,17 @@
 PasswordProtectionTrigger
 ChromePasswordProtectionService::GetPasswordProtectionWarningTriggerPref()
     const {
-  PasswordReuseEvent::SyncAccountType account_type = GetSyncAccountType();
-  switch (account_type) {
-    case (PasswordReuseEvent::GMAIL):
-      return PHISHING_REUSE;
-    case (PasswordReuseEvent::NOT_SIGNED_IN):
-    case (PasswordReuseEvent::GSUITE): {
-      bool is_policy_managed = profile_->GetPrefs()->HasPrefPath(
-          prefs::kPasswordProtectionWarningTrigger);
-      PasswordProtectionTrigger trigger_level =
-          static_cast<PasswordProtectionTrigger>(
-              profile_->GetPrefs()->GetInteger(
-                  prefs::kPasswordProtectionWarningTrigger));
-      return is_policy_managed ? trigger_level : PHISHING_REUSE;
-    }
+  // For Gmail accounts, we only trigger for reuse on phishing sites.
+  if (IsPrimaryAccountGmail()) {
+    return PHISHING_REUSE;
+  } else {
+    bool is_policy_managed = profile_->GetPrefs()->HasPrefPath(
+        prefs::kPasswordProtectionWarningTrigger);
+    PasswordProtectionTrigger trigger_level =
+        static_cast<PasswordProtectionTrigger>(profile_->GetPrefs()->GetInteger(
+            prefs::kPasswordProtectionWarningTrigger));
+    return is_policy_managed ? trigger_level : PHISHING_REUSE;
   }
-  NOTREACHED();
-  return PASSWORD_PROTECTION_OFF;
 }
 
 bool ChromePasswordProtectionService::IsURLWhitelistedForPasswordEntry(
@@ -1211,17 +1238,22 @@
 
 base::string16 ChromePasswordProtectionService::GetWarningDetailText(
     PasswordType password_type) const {
+  bool enable_warning_for_non_sync_users = base::FeatureList::IsEnabled(
+      safe_browsing::kPasswordProtectionForSignedInUsers);
   DCHECK(password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD ||
-         password_type == PasswordType::ENTERPRISE_PASSWORD);
+         password_type == PasswordType::ENTERPRISE_PASSWORD ||
+         (enable_warning_for_non_sync_users &&
+          password_type == PasswordType::OTHER_GAIA_PASSWORD));
   if (password_type == PasswordType::ENTERPRISE_PASSWORD) {
     return l10n_util::GetStringUTF16(
         IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_ENTERPRISE);
   }
-
-  if (GetSyncAccountType() !=
-      safe_browsing::LoginReputationClientRequest::PasswordReuseEvent::GSUITE) {
+  auto reused_password_account_type =
+      GetPasswordProtectionReusedPasswordAccountType(password_type);
+  if (reused_password_account_type.account_type() !=
+      ReusedPasswordAccountType::GSUITE) {
     return l10n_util::GetStringUTF16(
-        GetSyncAccountType() == PasswordReuseEvent::NOT_SIGNED_IN
+        password_type == PasswordType::OTHER_GAIA_PASSWORD
             ? IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SIGNED_IN_NON_SYNC
             : IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SYNC);
   }
@@ -1238,7 +1270,11 @@
 
 std::string ChromePasswordProtectionService::GetOrganizationName(
     PasswordType password_type) const {
-  if (GetSyncAccountType() != PasswordReuseEvent::GSUITE ||
+  auto reused_password_account_type =
+      GetPasswordProtectionReusedPasswordAccountType(password_type);
+
+  if (reused_password_account_type.account_type() ==
+          ReusedPasswordAccountType::GMAIL ||
       password_type != PasswordType::PRIMARY_ACCOUNT_PASSWORD) {
     return std::string();
   }
@@ -1252,9 +1288,8 @@
     const std::string& username,
     PasswordType password_type,
     bool is_phishing_url) {
-  if (password_type == PasswordType::PASSWORD_TYPE_UNKNOWN) {
-    return;
-  }
+  auto reused_password_account_type =
+      GetPasswordProtectionReusedPasswordAccountType(password_type);
 
   // When a PasswordFieldFocus event is sent, a PasswordProtectionRequest is
   // sent which means the password reuse type is unknown. We do not want to
@@ -1262,7 +1297,9 @@
   // Gmail accounts.
   bool can_log_password_reuse_event =
       (password_type == PasswordType::ENTERPRISE_PASSWORD ||
-       GetSyncAccountType() == PasswordReuseEvent::GSUITE);
+       reused_password_account_type.account_type() ==
+           ReusedPasswordAccountType::GSUITE) &&
+      (password_type != PasswordType::PASSWORD_TYPE_UNKNOWN);
   if (!IsIncognito() && can_log_password_reuse_event) {
     // User name should only be empty when MaybeStartPasswordFieldOnFocusRequest
     // is called.
@@ -1333,9 +1370,8 @@
       PasswordStoreFactory::GetForProfile(profile_,
                                           ServiceAccessType::EXPLICIT_ACCESS);
 
-  if (GetSyncAccountType() == PasswordReuseEvent::GSUITE) {
+  if (!IsPrimaryAccountGmail())
     password_store->ClearGaiaPasswordHash(GetAccountInfo().email);
-  }
   password_store->ClearAllEnterprisePasswordHash();
 }
 
@@ -1349,18 +1385,21 @@
     RequestOutcome reason,
     PasswordType password_type,
     const GURL& main_frame_url) {
+  bool enable_warning_for_non_sync_users = base::FeatureList::IsEnabled(
+      safe_browsing::kPasswordProtectionForSignedInUsers);
   // If it's not password alert mode, no need to log any metric.
   if (reason != RequestOutcome::PASSWORD_ALERT_MODE ||
-      (password_type != PasswordType::PRIMARY_ACCOUNT_PASSWORD &&
-       password_type != PasswordType::ENTERPRISE_PASSWORD)) {
+      password_type == PasswordType::SAVED_PASSWORD ||
+      password_type == PasswordType::PASSWORD_TYPE_UNKNOWN ||
+      (!enable_warning_for_non_sync_users &&
+       password_type == PasswordType::OTHER_GAIA_PASSWORD)) {
     return false;
   }
 
   if (!IsURLWhitelistedForPasswordEntry(main_frame_url, &reason))
     reason = RequestOutcome::SUCCEEDED;
   LogPasswordAlertModeOutcome(
-      reason, GetPasswordProtectionReusedPasswordAccountType(
-                  password_type, GetAccountInfo().hosted_domain));
+      reason, GetPasswordProtectionReusedPasswordAccountType(password_type));
   return reason == RequestOutcome::SUCCEEDED;
 }
 
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index ec9f6952..94e5cb73 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -234,16 +234,29 @@
   bool IsIncognito() override;
 
   // Checks if pinging should be enabled based on the |trigger_type|,
-  // |password_type| and user state, updates |reason| accordingly.
+  // |password_type| and |username|, updates |reason| accordingly.
+  // The |username| can be an email or a username for a non-GAIA or
+  // saved-password reuse. No validation has been done on it.
   bool IsPingingEnabled(LoginReputationClientRequest::TriggerType trigger_type,
                         PasswordType password_type,
+                        const std::string& username,
                         RequestOutcome* reason) override;
 
-  // If user enabled history syncing.
+  // If current profile has enabled history syncing.
   bool IsHistorySyncEnabled() override;
 
-  // If current user account is syncing.
-  bool IsAccountSyncing() override;
+  // If primary account is syncing.
+  bool IsPrimaryAccountSyncing() const override;
+
+  // If primary account is signed in.
+  bool IsPrimaryAccountSignedIn() const override;
+
+  // If a domain is not defined for the primary account. This means the primary
+  // account is a Gmail account.
+  bool IsPrimaryAccountGmail() const override;
+
+  // If non sync account is currently still signed in.
+  bool IsOtherGaiaAccountSignedIn(const std::string& username) const override;
 
   // If user is under advanced protection.
   bool IsUnderAdvancedProtection() override;
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
index 3662de8..173624b 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -151,6 +151,8 @@
   std::unique_ptr<
       base::CallbackList<void(content::BrowserContext*)>::Subscription>
       will_create_browser_context_services_subscription_;
+
+  DISALLOW_COPY_AND_ASSIGN(ChromePasswordProtectionServiceBrowserTest);
 };
 
 IN_PROC_BROWSER_TEST_F(ChromePasswordProtectionServiceBrowserTest,
@@ -512,52 +514,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ChromePasswordProtectionServiceBrowserTest,
-                       GSuitePasswordAlertMode) {
-  ConfigureEnterprisePasswordProtection(
-      /*is_gsuite=*/true, PasswordProtectionTrigger::PASSWORD_REUSE);
-  ChromePasswordProtectionService* service = GetService(/*is_incognito=*/false);
-  ui_test_utils::NavigateToURL(browser(),
-                               embedded_test_server()->GetURL(kLoginPageUrl));
-
-  base::HistogramTester histograms;
-  // Shows interstitial on current web_contents.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  service->ShowInterstitial(web_contents,
-                            PasswordType::PRIMARY_ACCOUNT_PASSWORD);
-  content::WebContents* new_web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  content::TestNavigationObserver observer(new_web_contents,
-                                           /*number_of_navigations=*/1);
-  observer.Wait();
-  // chrome://reset-password page should be opened in a new foreground tab.
-  ASSERT_EQ(2, browser()->tab_strip_model()->count());
-  ASSERT_EQ(GURL(chrome::kChromeUIResetPasswordURL),
-            new_web_contents->GetVisibleURL());
-  EXPECT_THAT(histograms.GetAllSamples("PasswordProtection.InterstitialString"),
-              testing::ElementsAre(base::Bucket(3, 1)));
-
-  // Clicks on "Reset Password" button.
-  std::string script =
-      "var node = document.getElementById('reset-password-button'); \n"
-      "node.click();";
-  ASSERT_TRUE(content::ExecuteScript(new_web_contents, script));
-  content::TestNavigationObserver observer1(new_web_contents,
-                                            /*number_of_navigations=*/1);
-  observer1.Wait();
-  EXPECT_EQ(2, browser()->tab_strip_model()->count());
-  EXPECT_EQ(browser()
-                ->tab_strip_model()
-                ->GetActiveWebContents()
-                ->GetLastCommittedURL(),
-            embedded_test_server()->GetURL(kChangePasswordUrl));
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PasswordProtection.InterstitialAction.GSuiteSyncPasswordEntry"),
-      testing::ElementsAre(base::Bucket(0, 1), base::Bucket(1, 1)));
-}
-
-IN_PROC_BROWSER_TEST_F(ChromePasswordProtectionServiceBrowserTest,
                        ChromeEnterprisePasswordAlertMode) {
   ConfigureEnterprisePasswordProtection(
       /*is_gsuite=*/false, PasswordProtectionTrigger::PASSWORD_REUSE);
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc
new file mode 100644
index 0000000..80ba4494
--- /dev/null
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc
@@ -0,0 +1,177 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ssl/security_state_tab_helper.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
+#include "chrome/browser/sync/test/integration/sync_test.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/pref_names.h"
+#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/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/password_manager/core/browser/hash_password_manager.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
+#include "components/password_manager/core/common/password_manager_pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
+#include "components/safe_browsing/password_protection/password_protection_request.h"
+#include "components/security_state/core/security_state.h"
+#include "components/signin/public/base/signin_pref_names.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_user_settings.h"
+#include "components/sync/test/fake_server/fake_server_network_resources.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace {
+
+const char kLoginPageUrl[] = "/safe_browsing/login_page.html";
+const char kChangePasswordUrl[] = "/safe_browsing/change_password_page.html";
+
+}  // namespace
+
+using ChromePasswordProtectionService =
+    safe_browsing::ChromePasswordProtectionService;
+using PasswordProtectionTrigger = safe_browsing::PasswordProtectionTrigger;
+using password_manager::metrics_util::PasswordType;
+using WarningUIType = safe_browsing::WarningUIType;
+using WarningAction = safe_browsing::WarningAction;
+
+// This test suite tests functionality that requires Sync to be active.
+class ChromePasswordProtectionServiceSyncBrowserTest : public SyncTest {
+ public:
+  ChromePasswordProtectionServiceSyncBrowserTest() : SyncTest(SINGLE_CLIENT) {}
+
+  void SetUpOnMainThread() override {
+    SyncTest::SetUpOnMainThread();
+
+    ASSERT_TRUE(embedded_test_server()->Start());
+
+    syncer::ProfileSyncService* sync_service =
+        ProfileSyncServiceFactory::GetAsProfileSyncServiceForProfile(
+            browser()->profile());
+
+    sync_service->OverrideNetworkResourcesForTest(
+        std::make_unique<fake_server::FakeServerNetworkResources>(
+            GetFakeServer()->AsWeakPtr()));
+
+    std::string username;
+#if defined(OS_CHROMEOS)
+    // In browser tests, the profile may already by authenticated with stub
+    // account |user_manager::kStubUserEmail|.
+    CoreAccountInfo info =
+        IdentityManagerFactory::GetForProfile(browser()->profile())
+            ->GetPrimaryAccountInfo();
+    username = info.email;
+#endif
+    if (username.empty()) {
+      username = "user@example.com";
+    }
+
+    std::unique_ptr<ProfileSyncServiceHarness> harness =
+        ProfileSyncServiceHarness::Create(
+            browser()->profile(), username, "password",
+            ProfileSyncServiceHarness::SigninType::FAKE_SIGNIN);
+
+#if !defined(OS_CHROMEOS)
+    // Sign the profile in.
+    ASSERT_TRUE(harness->SignInPrimaryAccount());
+#endif
+
+    CoreAccountInfo current_info =
+        IdentityManagerFactory::GetForProfile(browser()->profile())
+            ->GetPrimaryAccountInfo();
+    // Need to update hosted domain since it is not populated.
+    AccountInfo account_info;
+    account_info.account_id = current_info.account_id;
+    account_info.gaia = current_info.gaia;
+    account_info.email = current_info.email;
+    account_info.hosted_domain = "domain.com";
+    signin::UpdateAccountInfoForAccount(
+        IdentityManagerFactory::GetForProfile(browser()->profile()),
+        account_info);
+
+    ASSERT_TRUE(harness->SetupSync());
+  }
+
+  safe_browsing::ChromePasswordProtectionService* GetService(
+      bool is_incognito) {
+    return ChromePasswordProtectionService::GetPasswordProtectionService(
+        is_incognito ? browser()->profile()->GetOffTheRecordProfile()
+                     : browser()->profile());
+  }
+
+  void ConfigureEnterprisePasswordProtection(
+      PasswordProtectionTrigger trigger_type) {
+    browser()->profile()->GetPrefs()->SetInteger(
+        prefs::kPasswordProtectionWarningTrigger, trigger_type);
+    browser()->profile()->GetPrefs()->SetString(
+        prefs::kPasswordProtectionChangePasswordURL,
+        embedded_test_server()->GetURL(kChangePasswordUrl).spec());
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ChromePasswordProtectionServiceSyncBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(ChromePasswordProtectionServiceSyncBrowserTest,
+                       GSuitePasswordAlertMode) {
+  ConfigureEnterprisePasswordProtection(
+      PasswordProtectionTrigger::PASSWORD_REUSE);
+  ChromePasswordProtectionService* service = GetService(/*is_incognito=*/false);
+  ui_test_utils::NavigateToURL(browser(),
+                               embedded_test_server()->GetURL(kLoginPageUrl));
+  base::HistogramTester histograms;
+  // Shows interstitial on current web_contents.
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  service->ShowInterstitial(web_contents,
+                            PasswordType::PRIMARY_ACCOUNT_PASSWORD);
+  content::WebContents* interstitial_web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::TestNavigationObserver observer(interstitial_web_contents,
+                                           /*number_of_navigations=*/1);
+  observer.Wait();
+  // chrome://reset-password page should be opened in a new foreground tab.
+  ASSERT_EQ(2, browser()->tab_strip_model()->count());
+  ASSERT_EQ(GURL(chrome::kChromeUIResetPasswordURL),
+            interstitial_web_contents->GetVisibleURL());
+  EXPECT_THAT(histograms.GetAllSamples("PasswordProtection.InterstitialString"),
+              testing::ElementsAre(base::Bucket(3, 1)));
+
+  // Clicks on "Reset Password" button.
+  std::string script =
+      "var node = document.getElementById('reset-password-button'); \n"
+      "node.click();";
+  ASSERT_TRUE(content::ExecuteScript(interstitial_web_contents, script));
+  content::TestNavigationObserver observer1(interstitial_web_contents,
+                                            /*number_of_navigations=*/1);
+  observer1.Wait();
+  EXPECT_EQ(2, browser()->tab_strip_model()->count());
+  EXPECT_EQ(browser()
+                ->tab_strip_model()
+                ->GetActiveWebContents()
+                ->GetLastCommittedURL(),
+            embedded_test_server()->GetURL(kChangePasswordUrl));
+  EXPECT_THAT(
+      histograms.GetAllSamples(
+          "PasswordProtection.InterstitialAction.GSuiteSyncPasswordEntry"),
+      testing::ElementsAre(base::Bucket(0, 1), base::Bucket(1, 1)));
+}
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index 9eaf553..48652b2 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/safe_browsing/test_extension_event_observer.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
@@ -28,6 +29,7 @@
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/safe_browsing/common/utils.h"
 #include "components/safe_browsing/db/v4_protocol_manager_util.h"
+#include "components/safe_browsing/features.h"
 #include "components/safe_browsing/password_protection/password_protection_navigation_throttle.h"
 #include "components/safe_browsing/password_protection/password_protection_request.h"
 #include "components/safe_browsing/verdict_cache_manager.h"
@@ -221,7 +223,7 @@
     if (trigger_type == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) {
       request_ = new PasswordProtectionRequest(
           web_contents(), GURL(kPhishingURL), GURL(), GURL(), kUserName,
-          PasswordType::PASSWORD_TYPE_UNKNOWN, /* is_account_syncing */ false,
+          PasswordType::PASSWORD_TYPE_UNKNOWN,
           std::vector<std::string>({"somedomain.com"}), trigger_type, true,
           service_.get(), 0);
     } else {
@@ -229,10 +231,9 @@
                 trigger_type);
       request_ = new PasswordProtectionRequest(
           web_contents(), GURL(kPhishingURL), GURL(), GURL(), kUserName,
-          reused_password_type,
-          reused_password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-          std::vector<std::string>(), trigger_type,
-          /* is_account_syncing */ true, service_.get(), 0);
+          reused_password_type, std::vector<std::string>(), trigger_type,
+          /* password_field_exists*/ true, service_.get(),
+          /*request_timeout_in_ms=*/0);
     }
   }
 
@@ -306,24 +307,25 @@
   service_->ConfigService(false /*incognito*/, false /*SBER*/);
   EXPECT_FALSE(service_->IsPingingEnabled(
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
-      PasswordType::PASSWORD_TYPE_UNKNOWN, &reason));
+      PasswordType::PASSWORD_TYPE_UNKNOWN,
+      /*username=*/"", &reason));
   EXPECT_EQ(RequestOutcome::DISABLED_DUE_TO_USER_POPULATION, reason);
 
   service_->ConfigService(false /*incognito*/, true /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
-      PasswordType::PASSWORD_TYPE_UNKNOWN, &reason));
+      PasswordType::PASSWORD_TYPE_UNKNOWN, /*username=*/"", &reason));
 
   service_->ConfigService(true /*incognito*/, false /*SBER*/);
   EXPECT_FALSE(service_->IsPingingEnabled(
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
-      PasswordType::PASSWORD_TYPE_UNKNOWN, &reason));
+      PasswordType::PASSWORD_TYPE_UNKNOWN, /*username=*/"", &reason));
   EXPECT_EQ(RequestOutcome::DISABLED_DUE_TO_INCOGNITO, reason);
 
   service_->ConfigService(true /*incognito*/, true /*SBER*/);
   EXPECT_FALSE(service_->IsPingingEnabled(
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
-      PasswordType::PASSWORD_TYPE_UNKNOWN, &reason));
+      PasswordType::PASSWORD_TYPE_UNKNOWN, /*username=*/"", &reason));
   EXPECT_EQ(RequestOutcome::DISABLED_DUE_TO_INCOGNITO, reason);
 }
 
@@ -333,52 +335,27 @@
   service_->ConfigService(false /*incognito*/, false /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::SAVED_PASSWORD, &reason));
+      PasswordType::SAVED_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(false /*incognito*/, true /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::SAVED_PASSWORD, &reason));
+      PasswordType::SAVED_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(true /*incognito*/, false /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::SAVED_PASSWORD, &reason));
+      PasswordType::SAVED_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(true /*incognito*/, true /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::SAVED_PASSWORD, &reason));
+      PasswordType::SAVED_PASSWORD, /*username=*/"", &reason));
 }
 
 TEST_F(ChromePasswordProtectionServiceTest,
        VerifyUserPopulationForSyncPasswordEntryPing) {
-  // If user is not signed in, no ping should be sent.
   RequestOutcome reason;
-  service_->ConfigService(false /*incognito*/, false /*SBER*/);
-  EXPECT_FALSE(service_->IsPingingEnabled(
-      LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
-  EXPECT_EQ(RequestOutcome::USER_NOT_SIGNED_IN, reason);
-
-  service_->ConfigService(false /*incognito*/, true /*SBER*/);
-  EXPECT_FALSE(service_->IsPingingEnabled(
-      LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
-  EXPECT_EQ(RequestOutcome::USER_NOT_SIGNED_IN, reason);
-
-  service_->ConfigService(true /*incognito*/, false /*SBER*/);
-  EXPECT_FALSE(service_->IsPingingEnabled(
-      LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
-  EXPECT_EQ(RequestOutcome::USER_NOT_SIGNED_IN, reason);
-
-  service_->ConfigService(true /*incognito*/, true /*SBER*/);
-  EXPECT_FALSE(service_->IsPingingEnabled(
-      LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
-  EXPECT_EQ(RequestOutcome::USER_NOT_SIGNED_IN, reason);
-
   // Sets up the account as a gmail account as there is no hosted domain.
   CoreAccountInfo account_info = SetPrimaryAccount(kTestEmail);
   SetUpSyncAccount(kNoHostedDomainFound, account_info);
@@ -387,22 +364,22 @@
   service_->ConfigService(false /*incognito*/, false /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(false /*incognito*/, true /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(true /*incognito*/, false /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 
   service_->ConfigService(true /*incognito*/, true /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 
   // Even if sync password entry pinging is disabled by policy,
   // |IsPingingEnabled(..)| should still default to true if the
@@ -412,13 +389,13 @@
   service_->ConfigService(false /*incognito*/, false /*SBER*/);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 
   profile()->GetPrefs()->SetInteger(prefs::kPasswordProtectionWarningTrigger,
                                     PASSWORD_REUSE);
   EXPECT_TRUE(service_->IsPingingEnabled(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD, &reason));
+      PasswordType::PRIMARY_ACCOUNT_PASSWORD, /*username=*/"", &reason));
 }
 
 TEST_F(ChromePasswordProtectionServiceTest,
@@ -523,6 +500,7 @@
   verdict_proto.set_verdict_type(LoginReputationClientResponse::PHISHING);
   verdict_proto.set_cache_duration_sec(600);
   verdict_proto.set_cache_expression("password_reuse_url.com/");
+
   service_->CacheVerdict(
       url, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD, verdict_proto, base::Time::Now());
@@ -1101,11 +1079,20 @@
   base::string16 warning_text_with_org_name = l10n_util::GetStringFUTF16(
       IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_ENTERPRISE_WITH_ORG_NAME,
       base::UTF8ToUTF16("example.com"));
+  base::string16 warning_text_sync =
+      l10n_util::GetStringUTF16(IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SYNC);
 
-  EXPECT_EQ(warning_text_non_sync, service_->GetWarningDetailText(
-                                       PasswordType::PRIMARY_ACCOUNT_PASSWORD));
+  EXPECT_EQ(warning_text_sync, service_->GetWarningDetailText(
+                                   PasswordType::PRIMARY_ACCOUNT_PASSWORD));
   EXPECT_EQ(generic_enterprise_warning_text,
             service_->GetWarningDetailText(PasswordType::ENTERPRISE_PASSWORD));
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures(
+        {safe_browsing::kPasswordProtectionForSignedInUsers}, {});
+    EXPECT_EQ(warning_text_non_sync, service_->GetWarningDetailText(
+                                         PasswordType::OTHER_GAIA_PASSWORD));
+  }
 
   // Signs in as a GSuite user.
   CoreAccountInfo account_info = SetPrimaryAccount(kTestEmail);
@@ -1126,8 +1113,8 @@
   base::string16 generic_enterprise_warning_text = l10n_util::GetStringUTF16(
       IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_ENTERPRISE);
 
-  EXPECT_EQ(warning_text_non_sync, service_->GetWarningDetailText(
-                                       PasswordType::PRIMARY_ACCOUNT_PASSWORD));
+  EXPECT_EQ(warning_text_sync, service_->GetWarningDetailText(
+                                   PasswordType::PRIMARY_ACCOUNT_PASSWORD));
   EXPECT_EQ(generic_enterprise_warning_text,
             service_->GetWarningDetailText(PasswordType::ENTERPRISE_PASSWORD));
 
@@ -1151,21 +1138,36 @@
   EXPECT_FALSE(service_->CanShowInterstitial(
       RequestOutcome::TURNED_OFF_BY_ADMIN,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD, trigger_url));
-  EXPECT_FALSE(service_->CanShowInterstitial(
-      RequestOutcome::TURNED_OFF_BY_ADMIN, PasswordType::OTHER_GAIA_PASSWORD,
-      trigger_url));
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures(
+        {safe_browsing::kPasswordProtectionForSignedInUsers}, {});
+
+    EXPECT_FALSE(service_->CanShowInterstitial(
+        RequestOutcome::TURNED_OFF_BY_ADMIN, PasswordType::OTHER_GAIA_PASSWORD,
+        trigger_url));
+  }
+
   EXPECT_FALSE(service_->CanShowInterstitial(
       RequestOutcome::TURNED_OFF_BY_ADMIN, PasswordType::ENTERPRISE_PASSWORD,
       trigger_url));
   EXPECT_FALSE(
       service_->CanShowInterstitial(RequestOutcome::PASSWORD_ALERT_MODE,
                                     PasswordType::SAVED_PASSWORD, trigger_url));
+
   EXPECT_TRUE(service_->CanShowInterstitial(
       RequestOutcome::PASSWORD_ALERT_MODE,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD, trigger_url));
-  EXPECT_FALSE(service_->CanShowInterstitial(
-      RequestOutcome::PASSWORD_ALERT_MODE, PasswordType::OTHER_GAIA_PASSWORD,
-      trigger_url));
+  {
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures(
+        {safe_browsing::kPasswordProtectionForSignedInUsers}, {});
+
+    EXPECT_TRUE(service_->CanShowInterstitial(
+        RequestOutcome::PASSWORD_ALERT_MODE, PasswordType::OTHER_GAIA_PASSWORD,
+        trigger_url));
+  }
+
   EXPECT_TRUE(service_->CanShowInterstitial(RequestOutcome::PASSWORD_ALERT_MODE,
                                             PasswordType::ENTERPRISE_PASSWORD,
                                             trigger_url));
@@ -1193,7 +1195,7 @@
   RequestOutcome reason;
   EXPECT_TRUE(service_->CanSendPing(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT, GURL("about:blank"),
-      PasswordType::SAVED_PASSWORD, /* hosted_domain */ "", &reason));
+      PasswordType::SAVED_PASSWORD, /*username=*/"", &reason));
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/sharing/sharing_fcm_sender.cc b/chrome/browser/sharing/sharing_fcm_sender.cc
index 58a418b..42a41bc 100644
--- a/chrome/browser/sharing/sharing_fcm_sender.cc
+++ b/chrome/browser/sharing/sharing_fcm_sender.cc
@@ -74,6 +74,7 @@
 
   gcm::WebPushMessage web_push_message;
   web_push_message.time_to_live = time_to_live.InSeconds();
+  web_push_message.urgency = gcm::WebPushMessage::Urgency::kHigh;
   message.SerializeToString(&web_push_message.payload);
 
   gcm_driver_->SendWebPushMessage(
diff --git a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
index d57bbcc..9ab543e7 100644
--- a/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
+++ b/chrome/browser/sharing/sharing_fcm_sender_unittest.cc
@@ -133,7 +133,8 @@
   SharingMessage sharing_message;
   sharing_message.ParseFromString(arg.payload);
   return sharing_message.sender_guid() == kSenderGuid &&
-         arg.time_to_live == kTtlSeconds;
+         arg.time_to_live == kTtlSeconds &&
+         arg.urgency == gcm::WebPushMessage::Urgency::kHigh;
 }
 
 TEST_F(SharingFCMSenderTest, SendMessageToDevice) {
diff --git a/chrome/browser/signin/identity_services_provider_android.cc b/chrome/browser/signin/identity_services_provider_android.cc
index 2e6c3ed..e80e11f 100644
--- a/chrome/browser/signin/identity_services_provider_android.cc
+++ b/chrome/browser/signin/identity_services_provider_android.cc
@@ -6,7 +6,7 @@
 #include "chrome/android/chrome_jni_headers/IdentityServicesProvider_jni.h"
 #include "chrome/browser/profiles/profile_android.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/signin/signin_manager_android_wrapper_factory.h"
+#include "chrome/browser/signin/signin_manager_android_factory.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 
 using base::android::JavaParamRef;
@@ -37,5 +37,5 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& j_profile_android) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile_android);
-  return SigninManagerAndroidWrapperFactory::GetJavaObjectForProfile(profile);
+  return SigninManagerAndroidFactory::GetJavaObjectForProfile(profile);
 }
diff --git a/chrome/browser/signin/signin_manager_android_wrapper_factory.cc b/chrome/browser/signin/signin_manager_android_factory.cc
similarity index 64%
rename from chrome/browser/signin/signin_manager_android_wrapper_factory.cc
rename to chrome/browser/signin/signin_manager_android_factory.cc
index a7a90339..984ab92 100644
--- a/chrome/browser/signin/signin_manager_android_wrapper_factory.cc
+++ b/chrome/browser/signin/signin_manager_android_factory.cc
@@ -2,42 +2,40 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/signin/signin_manager_android_wrapper_factory.h"
+#include "chrome/browser/signin/signin_manager_android_factory.h"
 
 #include "chrome/browser/android/signin/chrome_signin_manager_delegate.h"
+#include "chrome/browser/android/signin/signin_manager_android.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
-#include "chrome/browser/browser_process.h"
-
-SigninManagerAndroidWrapperFactory::SigninManagerAndroidWrapperFactory()
+SigninManagerAndroidFactory::SigninManagerAndroidFactory()
     : BrowserContextKeyedServiceFactory(
-          "SigninManagerAndroidWrapper",
+          "SigninManagerAndroid",
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(IdentityManagerFactory::GetInstance());
-  DependsOn(ChromeSigninClientFactory::GetInstance());
 }
 
-SigninManagerAndroidWrapperFactory::~SigninManagerAndroidWrapperFactory() {}
+SigninManagerAndroidFactory::~SigninManagerAndroidFactory() {}
 
 // static
 base::android::ScopedJavaLocalRef<jobject>
-SigninManagerAndroidWrapperFactory::GetJavaObjectForProfile(Profile* profile) {
-  return static_cast<SigninManagerAndroidWrapper*>(
+SigninManagerAndroidFactory::GetJavaObjectForProfile(Profile* profile) {
+  return static_cast<SigninManagerAndroid*>(
              GetInstance()->GetServiceForBrowserContext(profile, true))
       ->GetJavaObject();
 }
 
 // static
-SigninManagerAndroidWrapperFactory*
-SigninManagerAndroidWrapperFactory::GetInstance() {
-  static base::NoDestructor<SigninManagerAndroidWrapperFactory> instance;
+SigninManagerAndroidFactory* SigninManagerAndroidFactory::GetInstance() {
+  static base::NoDestructor<SigninManagerAndroidFactory> instance;
   return instance.get();
 }
 
-KeyedService* SigninManagerAndroidWrapperFactory::BuildServiceInstanceFor(
+KeyedService* SigninManagerAndroidFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
   auto* signin_client = ChromeSigninClientFactory::GetForProfile(profile);
@@ -45,7 +43,7 @@
   auto signin_manager_delegate =
       std::make_unique<ChromeSigninManagerDelegate>();
 
-  return new SigninManagerAndroidWrapper(
+  return new SigninManagerAndroid(
       signin_client, g_browser_process->local_state(), identity_manager,
       std::move(signin_manager_delegate));
 }
diff --git a/chrome/browser/signin/signin_manager_android_factory.h b/chrome/browser/signin/signin_manager_android_factory.h
new file mode 100644
index 0000000..5eabc40
--- /dev/null
+++ b/chrome/browser/signin/signin_manager_android_factory.h
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_FACTORY_H_
+#define CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_FACTORY_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class Profile;
+
+class SigninManagerAndroidFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static base::android::ScopedJavaLocalRef<jobject> GetJavaObjectForProfile(
+      Profile* profile);
+
+  // Returns an instance of the SigninManagerAndroidFactory singleton.
+  static SigninManagerAndroidFactory* GetInstance();
+
+ private:
+  friend class base::NoDestructor<SigninManagerAndroidFactory>;
+  SigninManagerAndroidFactory();
+
+  ~SigninManagerAndroidFactory() override;
+
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+};
+
+#endif  // CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_FACTORY_H_
diff --git a/chrome/browser/signin/signin_manager_android_wrapper.cc b/chrome/browser/signin/signin_manager_android_wrapper.cc
deleted file mode 100644
index 8d2bdf39..0000000
--- a/chrome/browser/signin/signin_manager_android_wrapper.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/signin/signin_manager_android_wrapper.h"
-
-SigninManagerAndroidWrapper::SigninManagerAndroidWrapper(
-    SigninClient* signin_client,
-    PrefService* local_state_prefs_service,
-    signin::IdentityManager* identity_manager,
-    std::unique_ptr<SigninManagerDelegate> signin_manager_delegate)
-    : signin_manager_android_(signin_client,
-                              local_state_prefs_service,
-                              identity_manager,
-                              std::move(signin_manager_delegate)) {}
-
-SigninManagerAndroidWrapper::~SigninManagerAndroidWrapper() {}
-
-void SigninManagerAndroidWrapper::Shutdown() {
-  signin_manager_android_.Shutdown();
-}
-
-base::android::ScopedJavaLocalRef<jobject>
-SigninManagerAndroidWrapper::GetJavaObject() {
-  return signin_manager_android_.GetJavaObject();
-}
diff --git a/chrome/browser/signin/signin_manager_android_wrapper.h b/chrome/browser/signin/signin_manager_android_wrapper.h
deleted file mode 100644
index 285ce56..0000000
--- a/chrome/browser/signin/signin_manager_android_wrapper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_H_
-#define CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_H_
-
-#include "base/android/scoped_java_ref.h"
-#include "chrome/browser/android/signin/signin_manager_android.h"
-#include "components/keyed_service/core/keyed_service.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
-
-class SigninManagerAndroidWrapper : public KeyedService {
- public:
-  // initializes the member signin_manager_android_ and keeps ownership.
-  SigninManagerAndroidWrapper(
-      SigninClient* signin_client,
-      PrefService* local_state_prefs_service,
-      signin::IdentityManager* identity_manager,
-      std::unique_ptr<SigninManagerDelegate> signin_manager_delegate);
-
-  ~SigninManagerAndroidWrapper() override;
-
-  void Shutdown() override;
-
-  // Returns the reference on SigninManager.java owned by
-  // signin_manager_android_
-  base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
-
- private:
-  SigninManagerAndroid signin_manager_android_;
-};
-
-#endif  // CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_H_
diff --git a/chrome/browser/signin/signin_manager_android_wrapper_factory.h b/chrome/browser/signin/signin_manager_android_wrapper_factory.h
deleted file mode 100644
index 1c488775b..0000000
--- a/chrome/browser/signin/signin_manager_android_wrapper_factory.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_FACTORY_H_
-#define CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_FACTORY_H_
-
-#include "base/no_destructor.h"
-#include "chrome/browser/signin/signin_manager_android_wrapper.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-class Profile;
-
-class SigninManagerAndroidWrapperFactory
-    : public BrowserContextKeyedServiceFactory {
- public:
-  static base::android::ScopedJavaLocalRef<jobject> GetJavaObjectForProfile(
-      Profile* profile);
-
-  // Returns an instance of the SigninManagerAndroidWrapperFactory singleton.
-  static SigninManagerAndroidWrapperFactory* GetInstance();
-
- private:
-  friend class base::NoDestructor<SigninManagerAndroidWrapperFactory>;
-  SigninManagerAndroidWrapperFactory();
-
-  ~SigninManagerAndroidWrapperFactory() override;
-
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
-};
-
-#endif  // CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_ANDROID_WRAPPER_FACTORY_H_
diff --git a/chrome/browser/sync/test/integration/apps_helper.cc b/chrome/browser/sync/test/integration/apps_helper.cc
index c88d6fd..ab95d85b 100644
--- a/chrome/browser/sync/test/integration/apps_helper.cc
+++ b/chrome/browser/sync/test/integration/apps_helper.cc
@@ -7,12 +7,14 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_impl.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/test/integration/sync_app_helper.h"
 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
 #include "chrome/browser/sync/test/integration/sync_extension_helper.h"
 #include "chrome/browser/sync/test/integration/sync_extension_installer.h"
+#include "chrome/common/chrome_features.h"
 #include "content/public/browser/notification_service.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
@@ -105,6 +107,19 @@
 
 void InstallAppsPendingForSync(Profile* profile) {
   SyncExtensionHelper::GetInstance()->InstallExtensionsPendingForSync(profile);
+  WaitForAppService(profile);
+}
+
+void WaitForAppService(Profile* profile) {
+  // The App Service is a Mojo service, and Mojo calls are asynchronous
+  // (because they are potentially IPC calls). When the tests install and
+  // uninstall apps, they may need to pump the run loop so that those async
+  // calls settle.
+  if (!base::FeatureList::IsEnabled(features::kAppServiceAsh))
+    return;
+
+  apps::AppServiceProxyImpl::GetImplForTesting(profile)
+      ->FlushMojoCallsForTesting();
 }
 
 syncer::StringOrdinal GetPageOrdinalForApp(Profile* profile,
diff --git a/chrome/browser/sync/test/integration/apps_helper.h b/chrome/browser/sync/test/integration/apps_helper.h
index c4b6179..9a88466 100644
--- a/chrome/browser/sync/test/integration/apps_helper.h
+++ b/chrome/browser/sync/test/integration/apps_helper.h
@@ -48,9 +48,13 @@
 // previously installed.
 void UninstallApp(Profile* profile, int index);
 
-// Installs all pending synced apps for |profile|.
+// Installs all pending synced apps for |profile|, including waiting for the
+// App Service to settle.
 void InstallAppsPendingForSync(Profile* profile);
 
+// Waits for the App Service state for |profile| to settle.
+void WaitForAppService(Profile* profile);
+
 // Enables the app for the given index on |profile|.
 void EnableApp(Profile* profile, int index);
 
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index d8080196..f3d05260 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3341,8 +3341,6 @@
       "app_list/app_context_menu.cc",
       "app_list/app_context_menu.h",
       "app_list/app_context_menu_delegate.h",
-      "app_list/app_launch_event_logger.cc",
-      "app_list/app_launch_event_logger.h",
       "app_list/app_list_client_impl.cc",
       "app_list/app_list_client_impl.h",
       "app_list/app_list_controller_delegate.cc",
@@ -3420,6 +3418,8 @@
       "app_list/search/search_resource_manager.h",
       "app_list/search/search_result_ranker/app_launch_data.cc",
       "app_list/search/search_result_ranker/app_launch_data.h",
+      "app_list/search/search_result_ranker/app_launch_event_logger.cc",
+      "app_list/search/search_result_ranker/app_launch_event_logger.h",
       "app_list/search/search_result_ranker/app_launch_predictor.cc",
       "app_list/search/search_result_ranker/app_launch_predictor.h",
       "app_list/search/search_result_ranker/app_list_launch_metrics_provider.cc",
@@ -3457,8 +3457,8 @@
       "//ash/app_list",
       "//ash/public/cpp/app_list/vector_icons",
       "//ash/resources/vector_icons",
-      "//chrome/browser/ui:app_launch_event_logger_proto",
       "//chrome/browser/ui/app_list/search/logging:search_ranking_event_proto",
+      "//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_event_logger_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_predictor_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:app_list_launch_recorder_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:recurrence_ranker_proto",
@@ -4013,9 +4013,3 @@
     ]
   }
 }
-
-proto_library("app_launch_event_logger_proto") {
-  sources = [
-    "app_list/app_launch_event_logger.proto",
-  ]
-}
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.cc b/chrome/browser/ui/app_list/app_list_client_impl.cc
index 09aaa7cc..f099320 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl.cc
@@ -111,16 +111,11 @@
   app_launch_data.id = result_id;
   app_launch_data.ranking_item_type =
       app_list::RankingItemTypeFromSearchResult(*result);
+  app_launch_data.launch_type = launch_type;
+  app_launch_data.launched_from = launched_from;
   // Send training signal to search controller.
   search_controller_->Train(std::move(app_launch_data));
 
-  if (launch_type == ash::AppListLaunchType::kAppSearchResult) {
-    // Log the AppResult (either in the search result page, or in chip form in
-    // AppsGridView) to the UKM system.
-    app_launch_event_logger_.OnSuggestionChipOrSearchBoxClicked(
-        result_id, suggestion_index, static_cast<int>(launched_from));
-  }
-
   RecordSearchResultOpenTypeHistogram(
       launched_from, result->GetSearchResultType(), IsTabletMode());
 
@@ -198,11 +193,10 @@
     app_launch_data.id = id;
     app_launch_data.ranking_item_type =
         app_list::RankingItemTypeFromChromeAppListItem(*item);
+    app_launch_data.launched_from = ash::AppListLaunchedFrom::kLaunchedFromGrid;
     search_controller_->Train(std::move(app_launch_data));
   }
 
-  app_launch_event_logger_.OnGridClicked(id);
-
   requested_model_updater->ActivateChromeItem(id, event_flags);
 
   // Suspect that |id| may be destructed after calling ActivateChromeItem. Add
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.h b/chrome/browser/ui/app_list/app_list_client_impl.h
index cc463bd..bd2d157 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.h
+++ b/chrome/browser/ui/app_list/app_list_client_impl.h
@@ -20,7 +20,6 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/ui/app_list/app_launch_event_logger.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h"
 #include "components/search_engines/template_url_service.h"
@@ -192,7 +191,6 @@
   bool app_list_target_visibility_ = false;
   bool app_list_visible_ = false;
 
-  app_list::AppLaunchEventLogger app_launch_event_logger_;
   app_list::SearchRankingEventLogger search_ranking_event_logger_;
 
   base::WeakPtrFactory<AppListClientImpl> weak_ptr_factory_{this};
diff --git a/chrome/browser/ui/app_list/extension_app_utils.cc b/chrome/browser/ui/app_list/extension_app_utils.cc
index 9affea2..3a53078 100644
--- a/chrome/browser/ui/app_list/extension_app_utils.cc
+++ b/chrome/browser/ui/app_list/extension_app_utils.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/app_list/extension_app_utils.h"
 
+#include "chrome/browser/chromeos/extensions/default_web_app_ids.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/extensions/extension_ui_util.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -21,7 +22,8 @@
 namespace {
 
 constexpr char const* kAppIdsHiddenInLauncher[] = {
-    extension_misc::kChromeCameraAppId};
+    extension_misc::kChromeCameraAppId,
+    chromeos::default_web_apps::kReleaseNotesAppId};
 
 }  // namespace
 
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn b/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
index 6e811a3..d23cd7b 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/BUILD.gn
@@ -4,6 +4,12 @@
 
 import("//third_party/protobuf/proto_library.gni")
 
+proto_library("app_launch_event_logger_proto") {
+  sources = [
+    "app_launch_event_logger.proto",
+  ]
+}
+
 proto_library("app_launch_predictor_proto") {
   sources = [
     "app_launch_predictor.proto",
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_data.h b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_data.h
index 63da4db..88faaaa6 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_data.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_data.h
@@ -25,7 +25,7 @@
   ash::AppListLaunchedFrom launched_from =
       ash::AppListLaunchedFrom::kLaunchedFromShelf;
   // The type of app launched.
-  ash::AppListLaunchType launched_type = ash::AppListLaunchType::kSearchResult;
+  ash::AppListLaunchType launch_type = ash::AppListLaunchType::kSearchResult;
   // The index of the suggested app launched, if applicable.
   int suggestion_index = 0;
   // User's search query string, if relevant.
diff --git a/chrome/browser/ui/app_list/app_launch_event_logger.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
similarity index 99%
rename from chrome/browser/ui/app_list/app_launch_event_logger.cc
rename to chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
index 01ca7a7..cd3edd5 100644
--- a/chrome/browser/ui/app_list/app_launch_event_logger.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.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/ui/app_list/app_launch_event_logger.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h"
 
 #include <cmath>
 #include <utility>
diff --git a/chrome/browser/ui/app_list/app_launch_event_logger.h b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h
similarity index 94%
rename from chrome/browser/ui/app_list/app_launch_event_logger.h
rename to chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h
index b479bfd5..86620c8 100644
--- a/chrome/browser/ui/app_list/app_launch_event_logger.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.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_UI_APP_LIST_APP_LAUNCH_EVENT_LOGGER_H_
-#define CHROME_BROWSER_UI_APP_LIST_APP_LAUNCH_EVENT_LOGGER_H_
+#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_APP_LAUNCH_EVENT_LOGGER_H_
+#define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_APP_LAUNCH_EVENT_LOGGER_H_
 
 #include <memory>
 #include <string>
@@ -14,7 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/values.h"
-#include "chrome/browser/ui/app_list/app_launch_event_logger.pb.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.pb.h"
 #include "extensions/browser/extension_registry.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 
@@ -150,4 +150,4 @@
 
 }  // namespace app_list
 
-#endif  // CHROME_BROWSER_UI_APP_LIST_APP_LAUNCH_EVENT_LOGGER_H_
+#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_APP_LAUNCH_EVENT_LOGGER_H_
diff --git a/chrome/browser/ui/app_list/app_launch_event_logger.proto b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.proto
similarity index 100%
rename from chrome/browser/ui/app_list/app_launch_event_logger.proto
rename to chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.proto
diff --git a/chrome/browser/ui/app_list/app_launch_event_logger_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
similarity index 99%
rename from chrome/browser/ui/app_list/app_launch_event_logger_unittest.cc
rename to chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
index df8b0896..a07bdcac 100644
--- a/chrome/browser/ui/app_list/app_launch_event_logger_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/app_list/app_launch_event_logger.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h"
 
 #include <memory>
 
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.cc b/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.cc
index 8cc3cc1..03f476e2 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.cc
@@ -4,20 +4,38 @@
 
 #include "chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h"
 
-#include "base/metrics/histogram_macros.h"
+#include "base/metrics/histogram_functions.h"
 
 namespace app_list {
 
-void LogConfigurationError(ConfigurationError error) {
-  UMA_HISTOGRAM_ENUMERATION("RecurrenceRanker.ConfigurationError", error);
+void LogInitializationStatus(const std::string& suffix,
+                             InitializationStatus status) {
+  if (suffix.empty())
+    return;
+  base::UmaHistogramEnumeration(
+      "RecurrenceRanker.InitializationStatus." + suffix, status);
 }
 
-void LogSerializationError(SerializationError error) {
-  UMA_HISTOGRAM_ENUMERATION("RecurrenceRanker.SerializationError", error);
+void LogSerializationStatus(const std::string& suffix,
+                            SerializationStatus status) {
+  if (suffix.empty())
+    return;
+  base::UmaHistogramEnumeration(
+      "RecurrenceRanker.SerializationStatus." + suffix, status);
 }
 
-void LogUsageError(UsageError error) {
-  UMA_HISTOGRAM_ENUMERATION("RecurrenceRanker.UsageError", error);
+void LogUsage(const std::string& suffix, Usage usage) {
+  if (suffix.empty())
+    return;
+  base::UmaHistogramEnumeration("RecurrenceRanker.Usage." + suffix, usage);
+}
+
+void LogJsonConfigConversionStatus(const std::string& suffix,
+                                   JsonConfigConversionStatus status) {
+  if (suffix.empty())
+    return;
+  base::UmaHistogramEnumeration(
+      "RecurrenceRanker.JsonConfigConversion." + suffix, status);
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h b/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h
index 5007fc9..a0b0cc5d 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h
@@ -5,52 +5,77 @@
 #ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_HISTOGRAM_UTIL_H_
 #define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_HISTOGRAM_UTIL_H_
 
+#include <string>
+
 namespace app_list {
 
-// Represents various model configuration errors that could occur. These values
-// persist to logs. Entries should not be renumbered and numeric values should
-// never be reused.
-enum class ConfigurationError {
-  kHashMismatch = 0,
-  kInvalidParameter = 1,
-  kInvalidPredictor = 2,
-  kFakePredictorUsed = 3,
+// Represents situations that can occur during model configuration and
+// initialization. These values persist to logs. Entries should not be
+// renumbered and numeric values should never be reused.
+enum class InitializationStatus {
+  kInitialized = 0,
+  kEphemeralUser = 1,
+  kHashMismatch = 2,
+  kInvalidConfigParameter = 3,
+  kInvalidConfigPredictor = 4,
+  kFakePredictorUsed = 5,
   kMaxValue = kFakePredictorUsed,
 };
 
-// Represents errors in saving or loading models. These values persist to logs.
+// Represents the status during a save or load of a model. These values persist
+// to logs. Entries should not be renumbered and numeric values should never be
+// reused.
+enum class SerializationStatus {
+  kSaveOk = 0,
+  kLoadOk = 1,
+  kModelReadError = 2,
+  kModelWriteError = 3,
+  kFromProtoError = 4,
+  kToProtoError = 5,
+  kPredictorMissingError = 6,
+  kTargetsMissingError = 7,
+  kConditionsMissingError = 8,
+  kFakePredictorLoadingError = 9,
+  kConditionalFrequencyPredictorLoadingError = 10,
+  kFrecencyPredictorLoadingError = 11,
+  kHourBinPredictorLoadingError = 12,
+  kMarkovPredictorLoadingError = 13,
+  kExponentialWeightsEnsembleLoadingError = 14,
+  kMaxValue = kExponentialWeightsEnsembleLoadingError,
+};
+
+// Represents various uses of a RecurrenceRanker. These values persist to logs.
 // Entries should not be renumbered and numeric values should never be reused.
-enum class SerializationError {
-  kModelReadError = 0,
-  kModelWriteError = 1,
-  kFromProtoError = 2,
-  kToProtoError = 3,
-  kPredictorMissingError = 4,
-  kTargetsMissingError = 5,
-  kConditionsMissingError = 6,
-  kFakePredictorLoadingError = 7,
-  kFrecencyPredictorLoadingError = 8,
-  kHourBinnedPredictorLoadingError = 9,
-  kMaxValue = kHourBinnedPredictorLoadingError,
+enum class Usage {
+  kRecord = 0,
+  kRank = 1,
+  kRemoveCondition = 2,
+  kRenameCondition = 3,
+  kRemoveTarget = 4,
+  kRenameTarget = 5,
+  kMaxValue = kRenameTarget,
 };
 
-// Represents errors where a RecurrenceRanker is used in a way not supported by
-// the configured predictor. These values persist to logs. Entries should not be
-// renumbered and numeric values should never be reused.
-enum class UsageError {
-  kInvalidTrainCall = 0,
-  kInvalidRankCall = 1,
-  kMaxValue = kInvalidRankCall,
+// Represents whether an attempt to parse and convert a JSON configuration
+// string into a RecurrenceRankerConfigProto succeeded or not. These values
+// persist to logs. Entries should not be renumbered and numeric values should
+// never be reused.
+enum class JsonConfigConversionStatus {
+  kFailure = 0,
+  kSuccess = 1,
+  kMaxValue = kSuccess,
 };
 
-// Log a configuration error to UMA.
-void LogConfigurationError(ConfigurationError error);
+void LogInitializationStatus(const std::string& suffix,
+                             InitializationStatus status);
 
-// Log a serialisation error to UMA.
-void LogSerializationError(SerializationError error);
+void LogSerializationStatus(const std::string& suffix,
+                            SerializationStatus status);
 
-// Log a usage error to UMA.
-void LogUsageError(UsageError error);
+void LogUsage(const std::string& suffix, Usage usage);
+
+void LogJsonConfigConversionStatus(const std::string& suffix,
+                                   JsonConfigConversionStatus status);
 
 }  // namespace app_list
 
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.cc
index 36baf5ae..fcb05ac 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.cc
@@ -20,16 +20,24 @@
 
 }  // namespace
 
-FakePredictor::FakePredictor() {
+RecurrencePredictor::RecurrencePredictor(const std::string& model_identifier)
+    : model_identifier_(model_identifier) {}
+
+FakePredictor::FakePredictor(const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {
   // The fake predictor should only be used for testing, not in production.
   // Record an error so we know if it is being used.
-  LogConfigurationError(ConfigurationError::kFakePredictorUsed);
+  LogInitializationStatus(model_identifier_,
+                          InitializationStatus::kFakePredictorUsed);
 }
 
-FakePredictor::FakePredictor(const FakePredictorConfig& config) {
+FakePredictor::FakePredictor(const FakePredictorConfig& config,
+                             const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {
   // The fake predictor should only be used for testing, not in production.
   // Record an error so we know if it is being used.
-  LogConfigurationError(ConfigurationError::kFakePredictorUsed);
+  LogInitializationStatus(model_identifier_,
+                          InitializationStatus::kFakePredictorUsed);
 }
 
 FakePredictor::~FakePredictor() = default;
@@ -67,7 +75,8 @@
 
 void FakePredictor::FromProto(const RecurrencePredictorProto& proto) {
   if (!proto.has_fake_predictor()) {
-    LogSerializationError(SerializationError::kFakePredictorLoadingError);
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kFakePredictorLoadingError);
     return;
   }
 
@@ -75,13 +84,14 @@
     counts_[pair.first] = pair.second;
 }
 
-DefaultPredictor::DefaultPredictor(const DefaultPredictorConfig& config) {}
+DefaultPredictor::DefaultPredictor(const DefaultPredictorConfig& config,
+                                   const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {}
 DefaultPredictor::~DefaultPredictor() {}
 
 void DefaultPredictor::Train(unsigned int target, unsigned int condition) {}
 
 std::map<unsigned int, float> DefaultPredictor::Rank(unsigned int condition) {
-  LogUsageError(UsageError::kInvalidRankCall);
   NOTREACHED();
   return {};
 }
@@ -95,9 +105,13 @@
 
 void DefaultPredictor::FromProto(const RecurrencePredictorProto& proto) {}
 
-ConditionalFrequencyPredictor::ConditionalFrequencyPredictor() = default;
 ConditionalFrequencyPredictor::ConditionalFrequencyPredictor(
-    const ConditionalFrequencyPredictorConfig& config) {}
+    const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {}
+ConditionalFrequencyPredictor::ConditionalFrequencyPredictor(
+    const ConditionalFrequencyPredictorConfig& config,
+    const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {}
 ConditionalFrequencyPredictor::~ConditionalFrequencyPredictor() = default;
 
 ConditionalFrequencyPredictor::Events::Events() = default;
@@ -198,7 +212,9 @@
 void ConditionalFrequencyPredictor::FromProto(
     const RecurrencePredictorProto& proto) {
   if (!proto.has_conditional_frequency_predictor()) {
-    // TODO(921444): Add error metrics for new predictors.
+    LogSerializationStatus(
+        model_identifier_,
+        SerializationStatus::kConditionalFrequencyPredictorLoadingError);
     return;
   }
 
@@ -209,8 +225,10 @@
   }
 }
 
-FrecencyPredictor::FrecencyPredictor(const FrecencyPredictorConfig& config)
-    : decay_coeff_(config.decay_coeff()) {}
+FrecencyPredictor::FrecencyPredictor(const FrecencyPredictorConfig& config,
+                                     const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier),
+      decay_coeff_(config.decay_coeff()) {}
 FrecencyPredictor::~FrecencyPredictor() = default;
 
 const char FrecencyPredictor::kPredictorName[] = "FrecencyPredictor";
@@ -262,7 +280,8 @@
 
 void FrecencyPredictor::FromProto(const RecurrencePredictorProto& proto) {
   if (!proto.has_frecency_predictor()) {
-    LogSerializationError(SerializationError::kFrecencyPredictorLoadingError);
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kFrecencyPredictorLoadingError);
     return;
   }
   const auto& predictor = proto.frecency_predictor();
@@ -286,8 +305,10 @@
   }
 }
 
-HourBinPredictor::HourBinPredictor(const HourBinPredictorConfig& config)
-    : weekly_decay_coeff_(config.weekly_decay_coeff()) {
+HourBinPredictor::HourBinPredictor(const HourBinPredictorConfig& config,
+                                   const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier),
+      weekly_decay_coeff_(config.weekly_decay_coeff()) {
   for (const auto& pair : config.bin_weights())
     bin_weights_[pair.bin()] = pair.weight();
 
@@ -367,8 +388,11 @@
 }
 
 void HourBinPredictor::FromProto(const RecurrencePredictorProto& proto) {
-  if (!proto.has_hour_bin_predictor())
+  if (!proto.has_hour_bin_predictor()) {
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kHourBinPredictorLoadingError);
     return;
+  }
 
   proto_ = proto.hour_bin_predictor();
   if (ShouldDecay())
@@ -411,7 +435,12 @@
   }
 }
 
-MarkovPredictor::MarkovPredictor(const MarkovPredictorConfig& config) {}
+MarkovPredictor::MarkovPredictor(const MarkovPredictorConfig& config,
+                                 const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier) {
+  frequencies_ =
+      std::make_unique<ConditionalFrequencyPredictor>(model_identifier);
+}
 MarkovPredictor::~MarkovPredictor() = default;
 
 const char MarkovPredictor::kPredictorName[] = "MarkovPredictor";
@@ -421,42 +450,45 @@
 
 void MarkovPredictor::Train(unsigned int target, unsigned int condition) {
   if (previous_target_)
-    frequencies_.Train(target, previous_target_.value());
+    frequencies_->Train(target, previous_target_.value());
   previous_target_ = target;
 }
 
 std::map<unsigned int, float> MarkovPredictor::Rank(unsigned int condition) {
   if (previous_target_)
-    return frequencies_.Rank(previous_target_.value());
+    return frequencies_->Rank(previous_target_.value());
   return std::map<unsigned int, float>();
 }
 
 void MarkovPredictor::Cleanup(const std::vector<unsigned int>& valid_targets) {
-  frequencies_.CleanupConditions(valid_targets);
-  frequencies_.Cleanup(valid_targets);
+  frequencies_->CleanupConditions(valid_targets);
+  frequencies_->Cleanup(valid_targets);
 }
 
 void MarkovPredictor::ToProto(RecurrencePredictorProto* proto) const {
   auto* predictor = proto->mutable_markov_predictor();
-  frequencies_.ToProto(predictor->mutable_frequencies());
+  frequencies_->ToProto(predictor->mutable_frequencies());
 }
 
 void MarkovPredictor::FromProto(const RecurrencePredictorProto& proto) {
   if (!proto.has_markov_predictor()) {
-    // TODO(921444): Update error metrics for new predictors and add reporting
-    // here.
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kMarkovPredictorLoadingError);
     return;
   }
 
-  frequencies_.FromProto(proto.markov_predictor().frequencies());
+  frequencies_->FromProto(proto.markov_predictor().frequencies());
 }
 
 ExponentialWeightsEnsemble::ExponentialWeightsEnsemble(
-    const ExponentialWeightsEnsembleConfig& config)
-    : learning_rate_(config.learning_rate()) {
+    const ExponentialWeightsEnsembleConfig& config,
+    const std::string& model_identifier)
+    : RecurrencePredictor(model_identifier),
+      learning_rate_(config.learning_rate()) {
   for (int i = 0; i < config.predictors_size(); ++i) {
     predictors_.push_back(
-        {MakePredictor(config.predictors(i)), 1.0f / config.predictors_size()});
+        {MakePredictor(config.predictors(i), model_identifier_),
+         1.0f / config.predictors_size()});
   }
 }
 
@@ -529,7 +561,9 @@
 void ExponentialWeightsEnsemble::FromProto(
     const RecurrencePredictorProto& proto) {
   if (!proto.has_exponential_weights_ensemble()) {
-    // TODO(921444): Add error metrics for new predictors.
+    LogSerializationStatus(
+        model_identifier_,
+        SerializationStatus::kExponentialWeightsEnsembleLoadingError);
     return;
   }
   const auto& ensemble = proto.exponential_weights_ensemble();
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.h b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.h
index 7486fe46..e0e77bb3 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor.h
@@ -7,6 +7,7 @@
 
 #include <map>
 #include <memory>
+#include <string>
 #include <utility>
 #include <vector>
 
@@ -38,6 +39,7 @@
 // |recurrence_predictor.proto|.
 class RecurrencePredictor {
  public:
+  explicit RecurrencePredictor(const std::string& model_identifier);
   virtual ~RecurrencePredictor() = default;
 
   // Train the predictor on an occurrence of |target| coinciding with
@@ -59,6 +61,11 @@
   virtual void ToProto(RecurrencePredictorProto* proto) const = 0;
   virtual void FromProto(const RecurrencePredictorProto& proto) = 0;
   virtual const char* GetPredictorName() const = 0;
+
+ protected:
+  // The name of the model which this predictor belongs to. Used for metrics
+  // reporting.
+  std::string model_identifier_;
 };
 
 // FakePredictor is a simple 'predictor' used for testing. Rank() returns the
@@ -69,8 +76,9 @@
 // so should not be used for anything except testing.
 class FakePredictor : public RecurrencePredictor {
  public:
-  FakePredictor();
-  explicit FakePredictor(const FakePredictorConfig& config);
+  explicit FakePredictor(const std::string& model_identifier);
+  FakePredictor(const FakePredictorConfig& config,
+                const std::string& model_identifier);
   ~FakePredictor() override;
 
   // RecurrencePredictor:
@@ -94,7 +102,8 @@
 // predictor.
 class DefaultPredictor : public RecurrencePredictor {
  public:
-  explicit DefaultPredictor(const DefaultPredictorConfig& config);
+  DefaultPredictor(const DefaultPredictorConfig& config,
+                   const std::string& model_identifier);
   ~DefaultPredictor() override;
 
   // RecurrencePredictor:
@@ -119,9 +128,10 @@
   // The predictor doesn't use any configuration values, so a zero-argument
   // constructor is also provided for convenience when this is used within other
   // predictors.
-  explicit ConditionalFrequencyPredictor(
-      const ConditionalFrequencyPredictorConfig& config);
-  ConditionalFrequencyPredictor();
+  ConditionalFrequencyPredictor(
+      const ConditionalFrequencyPredictorConfig& config,
+      const std::string& model_identifier);
+  explicit ConditionalFrequencyPredictor(const std::string& model_identifier);
   ~ConditionalFrequencyPredictor() override;
 
   // Stores a mapping from events to frequencies, along with the total frequency
@@ -171,7 +181,8 @@
 // store are needed, the DefaultPredictor should be used instead.
 class FrecencyPredictor : public RecurrencePredictor {
  public:
-  explicit FrecencyPredictor(const FrecencyPredictorConfig& config);
+  FrecencyPredictor(const FrecencyPredictorConfig& config,
+                    const std::string& model_identifier);
   ~FrecencyPredictor() override;
 
   // Records all information about a target: its id and score, along with the
@@ -217,7 +228,8 @@
 // predictions.
 class HourBinPredictor : public RecurrencePredictor {
  public:
-  explicit HourBinPredictor(const HourBinPredictorConfig& config);
+  HourBinPredictor(const HourBinPredictorConfig& config,
+                   const std::string& model_identifier);
   ~HourBinPredictor() override;
 
   // RecurrencePredictor:
@@ -265,7 +277,8 @@
 // It does not use the condition.
 class MarkovPredictor : public RecurrencePredictor {
  public:
-  explicit MarkovPredictor(const MarkovPredictorConfig& config);
+  MarkovPredictor(const MarkovPredictorConfig& config,
+                  const std::string& model_identifier);
   ~MarkovPredictor() override;
 
   // RecurrencePredictor:
@@ -283,7 +296,7 @@
   FRIEND_TEST_ALL_PREFIXES(MarkovPredictorTest, ToAndFromProto);
 
   // Stores transition probabilities: P(target | previous_target).
-  ConditionalFrequencyPredictor frequencies_;
+  std::unique_ptr<ConditionalFrequencyPredictor> frequencies_;
 
   // The most recently observed target.
   base::Optional<unsigned int> previous_target_;
@@ -305,8 +318,8 @@
 // predictor i. Weights are kept normalized to sum to 1.
 class ExponentialWeightsEnsemble : public RecurrencePredictor {
  public:
-  explicit ExponentialWeightsEnsemble(
-      const ExponentialWeightsEnsembleConfig& config);
+  ExponentialWeightsEnsemble(const ExponentialWeightsEnsembleConfig& config,
+                             const std::string& model_identifier);
   ~ExponentialWeightsEnsemble() override;
 
   // RecurrencePredictor:
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor_unittest.cc
index 94a7de9..73002b3b 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_predictor_unittest.cc
@@ -35,7 +35,7 @@
     Test::SetUp();
 
     config_.set_decay_coeff(0.5f);
-    predictor_ = std::make_unique<FrecencyPredictor>(config_);
+    predictor_ = std::make_unique<FrecencyPredictor>(config_, "model");
   }
 
   FrecencyPredictorConfig config_;
@@ -90,7 +90,7 @@
   RecurrencePredictorProto proto;
   predictor_->ToProto(&proto);
 
-  FrecencyPredictor new_predictor(config_);
+  FrecencyPredictor new_predictor(config_, "model");
   new_predictor.FromProto(proto);
 
   EXPECT_TRUE(proto.has_frecency_predictor());
@@ -101,7 +101,7 @@
 class ConditionalFrequencyPredictorTest : public testing::Test {};
 
 TEST_F(ConditionalFrequencyPredictorTest, TrainAndRank) {
-  ConditionalFrequencyPredictor cfp;
+  ConditionalFrequencyPredictor cfp("model");
 
   cfp.TrainWithDelta(0u, 1u, 5.0f);
   cfp.TrainWithDelta(1u, 1u, 1.0f);
@@ -120,7 +120,7 @@
 }
 
 TEST_F(ConditionalFrequencyPredictorTest, Cleanup) {
-  ConditionalFrequencyPredictor cfp;
+  ConditionalFrequencyPredictor cfp("model");
 
   cfp.Train(0u, 0u);
   for (int i = 0; i < 6; ++i) {
@@ -141,7 +141,7 @@
 }
 
 TEST_F(ConditionalFrequencyPredictorTest, ToFromProto) {
-  ConditionalFrequencyPredictor cfp1;
+  ConditionalFrequencyPredictor cfp1("model");
 
   cfp1.Train(1u, 1u);
   cfp1.Train(2u, 1u);
@@ -155,7 +155,7 @@
   RecurrencePredictorProto proto;
   cfp1.ToProto(&proto);
 
-  ConditionalFrequencyPredictor cfp2;
+  ConditionalFrequencyPredictor cfp2("model");
   cfp2.FromProto(proto);
 
   EXPECT_THAT(
@@ -182,7 +182,7 @@
       config_pair->set_weight(pair.second);
     }
 
-    predictor_ = std::make_unique<HourBinPredictor>(config_);
+    predictor_ = std::make_unique<HourBinPredictor>(config_, "model");
   }
 
   // Sets local time according to |day_of_week| and |hour_of_day|.
@@ -406,7 +406,7 @@
 class MarkovPredictorTest : public testing::Test {
  protected:
   void SetUp() override {
-    predictor_ = std::make_unique<MarkovPredictor>(config_);
+    predictor_ = std::make_unique<MarkovPredictor>(config_, "model");
   }
 
   MarkovPredictorConfig config_;
@@ -491,7 +491,7 @@
   RecurrencePredictorProto proto;
   predictor_->ToProto(&proto);
 
-  MarkovPredictor new_predictor(config_);
+  MarkovPredictor new_predictor(config_, "model");
   new_predictor.FromProto(proto);
 
   EXPECT_TRUE(proto.has_markov_predictor());
@@ -522,13 +522,15 @@
 
   std::unique_ptr<ExponentialWeightsEnsemble> MakeEnsemble(
       const ExponentialWeightsEnsembleConfig& config) {
-    return std::make_unique<ExponentialWeightsEnsemble>(config);
+    return std::make_unique<ExponentialWeightsEnsemble>(config, "model");
   }
 
   // A predictor that always returns the same prediction, whose weight is
   // expected to decay in an ensemble.
   class BadPredictor : public FakePredictor {
    public:
+    BadPredictor() : FakePredictor("model") {}
+
     // FakePredictor:
     std::map<unsigned int, float> Rank(unsigned int condition) override {
       return {{417u, 1.0f}};
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.cc
index 6e956a8..9cdcbfb 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.cc
@@ -39,10 +39,12 @@
 constexpr float kMinValidTargetProportionBeforeCleanup = 0.5f;
 
 void SaveProtoToDisk(const base::FilePath& filepath,
+                     const std::string& model_identifier,
                      const RecurrenceRankerProto& proto) {
   std::string proto_str;
   if (!proto.SerializeToString(&proto_str)) {
-    LogSerializationError(SerializationError::kToProtoError);
+    LogSerializationStatus(model_identifier,
+                           SerializationStatus::kToProtoError);
     return;
   }
 
@@ -54,28 +56,37 @@
         filepath, proto_str, "RecurrenceRanker");
   }
   if (!write_result) {
-    LogSerializationError(SerializationError::kModelWriteError);
+    LogSerializationStatus(model_identifier,
+                           SerializationStatus::kModelWriteError);
+    return;
   }
+
+  LogSerializationStatus(model_identifier, SerializationStatus::kSaveOk);
 }
 
 // Try to load a |RecurrenceRankerProto| from the given filepath. If it fails,
 // it returns nullptr.
 std::unique_ptr<RecurrenceRankerProto> LoadProtoFromDisk(
-    const base::FilePath& filepath) {
+    const base::FilePath& filepath,
+    const std::string& model_identifier) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::MAY_BLOCK);
 
   std::string proto_str;
   if (!base::ReadFileToString(filepath, &proto_str)) {
-    LogSerializationError(SerializationError::kModelReadError);
+    LogSerializationStatus(model_identifier,
+                           SerializationStatus::kModelReadError);
     return nullptr;
   }
 
   auto proto = std::make_unique<RecurrenceRankerProto>();
   if (!proto->ParseFromString(proto_str)) {
-    LogSerializationError(SerializationError::kFromProtoError);
+    LogSerializationStatus(model_identifier,
+                           SerializationStatus::kFromProtoError);
     return nullptr;
   }
+
+  LogSerializationStatus(model_identifier, SerializationStatus::kLoadOk);
   return proto;
 }
 
@@ -143,10 +154,12 @@
 
 }  // namespace
 
-RecurrenceRanker::RecurrenceRanker(const base::FilePath& filepath,
+RecurrenceRanker::RecurrenceRanker(const std::string& model_identifier,
+                                   const base::FilePath& filepath,
                                    const RecurrenceRankerConfigProto& config,
                                    bool is_ephemeral_user)
-    : proto_filepath_(filepath),
+    : model_identifier_(model_identifier),
+      proto_filepath_(filepath),
       config_hash_(base::PersistentHash(config.SerializeAsString())),
       is_ephemeral_user_(is_ephemeral_user),
       min_seconds_between_saves_(
@@ -166,16 +179,19 @@
     // Ephemeral users have no persistent storage, so we don't try and load the
     // proto from disk. Instead, we fall back on using a default (frecency)
     // predictor, which is still useful with only data from the current session.
+    LogInitializationStatus(model_identifier_,
+                            InitializationStatus::kEphemeralUser);
     predictor_ = std::make_unique<DefaultPredictor>(
-        RecurrencePredictorConfigProto::DefaultPredictorConfig());
+        RecurrencePredictorConfigProto::DefaultPredictorConfig(),
+        model_identifier_);
   } else {
-    predictor_ = MakePredictor(config.predictor());
+    predictor_ = MakePredictor(config.predictor(), model_identifier_);
 
     // Load the proto from disk and finish initialisation in
     // |OnLoadProtoFromDiskComplete|.
     base::PostTaskAndReplyWithResult(
         task_runner_.get(), FROM_HERE,
-        base::BindOnce(&LoadProtoFromDisk, proto_filepath_),
+        base::BindOnce(&LoadProtoFromDisk, proto_filepath_, model_identifier_),
         base::BindOnce(&RecurrenceRanker::OnLoadProtoFromDiskComplete,
                        weak_factory_.GetWeakPtr()));
   }
@@ -186,12 +202,13 @@
 void RecurrenceRanker::OnLoadProtoFromDiskComplete(
     std::unique_ptr<RecurrenceRankerProto> proto) {
   load_from_disk_completed_ = true;
+  LogInitializationStatus(model_identifier_,
+                          InitializationStatus::kInitialized);
 
   // If OnLoadFromDisk returned nullptr, no saved ranker proto was available on
   // disk, and there is nothing to load.
-  if (!proto) {
+  if (!proto)
     return;
-  }
 
   if (!proto->has_config_hash() || proto->config_hash() != config_hash_) {
     // The configuration of the saved ranker doesn't match the configuration for
@@ -199,30 +216,35 @@
     // clean slate. This is not always an error: it is expected if, for example,
     // a RecurrenceRanker instance is rolled out in one release, and then
     // reconfigured in the next.
-    LogConfigurationError(ConfigurationError::kHashMismatch);
+    LogInitializationStatus(model_identifier_,
+                            InitializationStatus::kHashMismatch);
     return;
   }
 
   if (proto->has_predictor())
     predictor_->FromProto(proto->predictor());
   else
-    LogSerializationError(SerializationError::kPredictorMissingError);
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kPredictorMissingError);
 
   if (proto->has_targets())
     targets_->FromProto(proto->targets());
   else
-    LogSerializationError(SerializationError::kTargetsMissingError);
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kTargetsMissingError);
 
   if (proto->has_conditions())
     conditions_->FromProto(proto->conditions());
   else
-    LogSerializationError(SerializationError::kConditionsMissingError);
+    LogSerializationStatus(model_identifier_,
+                           SerializationStatus::kConditionsMissingError);
 }
 
 void RecurrenceRanker::Record(const std::string& target,
                               const std::string& condition) {
   if (!load_from_disk_completed_)
     return;
+  LogUsage(model_identifier_, Usage::kRecord);
 
   predictor_->Train(targets_->Update(target), conditions_->Update(condition));
   MaybeSave();
@@ -232,6 +254,7 @@
                                     const std::string& new_target) {
   if (!load_from_disk_completed_)
     return;
+  LogUsage(model_identifier_, Usage::kRenameTarget);
 
   targets_->Rename(target, new_target);
   MaybeSave();
@@ -242,6 +265,7 @@
   // loading is complete, resulting in the remove getting dropped.
   if (!load_from_disk_completed_)
     return;
+  LogUsage(model_identifier_, Usage::kRemoveTarget);
 
   targets_->Remove(target);
   MaybeSave();
@@ -251,6 +275,7 @@
                                        const std::string& new_condition) {
   if (!load_from_disk_completed_)
     return;
+  LogUsage(model_identifier_, Usage::kRenameCondition);
 
   conditions_->Rename(condition, new_condition);
   MaybeSave();
@@ -259,6 +284,7 @@
 void RecurrenceRanker::RemoveCondition(const std::string& condition) {
   if (!load_from_disk_completed_)
     return;
+  LogUsage(model_identifier_, Usage::kRemoveCondition);
 
   conditions_->Remove(condition);
   MaybeSave();
@@ -268,6 +294,7 @@
     const std::string& condition) {
   if (!load_from_disk_completed_)
     return {};
+  LogUsage(model_identifier_, Usage::kRank);
   // Special case the default predictor, and return the scores from the target
   // frecency store.
   if (predictor_->GetPredictorName() == DefaultPredictor::kPredictorName)
@@ -321,8 +348,9 @@
   time_of_last_save_ = Time::Now();
   RecurrenceRankerProto proto;
   ToProto(&proto);
-  task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&SaveProtoToDisk, proto_filepath_, proto));
+  task_runner_->PostTask(FROM_HERE,
+                         base::BindOnce(&SaveProtoToDisk, proto_filepath_,
+                                        model_identifier_, proto));
 }
 
 void RecurrenceRanker::MaybeSave() {
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.h b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.h
index f32a558..2de2262 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.h
@@ -29,7 +29,11 @@
 // |RecurrenceRanker| is the public interface of the ranking system.
 class RecurrenceRanker {
  public:
-  RecurrenceRanker(const base::FilePath& filepath,
+  // |model_identifier| is used for UMA metrics reporting. If it is empty,
+  // reporting is disabled. If it is non-empty, an entry should be added to the
+  // RecurrenceRankerModel histogram_suffixes entry in the UMA histograms.xml.
+  RecurrenceRanker(const std::string& model_identifier,
+                   const base::FilePath& filepath,
                    const RecurrenceRankerConfigProto& config,
                    bool is_ephemeral_user);
   ~RecurrenceRanker();
@@ -120,6 +124,9 @@
   // Storage for condition strings, which maps them to IDs.
   std::unique_ptr<FrecencyStore> conditions_;
 
+  // Name used for histogram suffixes.
+  const std::string model_identifier_;
+
   // Where to save the ranker.
   const base::FilePath proto_filepath_;
   // Hash of client-supplied config, used for associating a serialised ranker
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_unittest.cc
index 3dc6fca2..6ce9c7c 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_unittest.cc
@@ -67,8 +67,8 @@
 
   // Returns a ranker using a fake predictor.
   std::unique_ptr<RecurrenceRanker> MakeSimpleRanker() {
-    auto ranker = std::make_unique<RecurrenceRanker>(ranker_filepath_,
-                                                     MakeSimpleConfig(), false);
+    auto ranker = std::make_unique<RecurrenceRanker>(
+        "MyModel", ranker_filepath_, MakeSimpleConfig(), false);
     Wait();
     return ranker;
   }
@@ -128,28 +128,48 @@
     return proto;
   }
 
-  void ExpectErrors(bool fresh_model_created, bool using_fake_predictor) {
-    histogram_tester_.ExpectTotalCount("RecurrenceRanker.UsageError", 0);
+  void ExpectErrors(bool fresh_model_created = true,
+                    bool using_fake_predictor = true,
+                    bool has_saved = false) {
+    // Total count of serialization reports:
+    //  - one for either a kLoadOk or kModelReadError
+    //  - one if has_saved is true
+    histogram_tester_.ExpectTotalCount(
+        "RecurrenceRanker.SerializationStatus.MyModel",
+        static_cast<int>(has_saved) + 1);
 
     // If a model doesn't already exist, a read error is logged.
     if (fresh_model_created) {
-      histogram_tester_.ExpectUniqueSample(
-          "RecurrenceRanker.SerializationError",
-          SerializationError::kModelReadError, 1);
+      histogram_tester_.ExpectBucketCount(
+          "RecurrenceRanker.SerializationStatus.MyModel",
+          SerializationStatus::kModelReadError, 1);
     } else {
-      histogram_tester_.ExpectTotalCount("RecurrenceRanker.SerializationError",
-                                         0);
+      histogram_tester_.ExpectBucketCount(
+          "RecurrenceRanker.SerializationStatus.MyModel",
+          SerializationStatus::kLoadOk, 1);
+    }
+
+    if (has_saved) {
+      histogram_tester_.ExpectBucketCount(
+          "RecurrenceRanker.SerializationStatus.MyModel",
+          SerializationStatus::kSaveOk, 1);
     }
 
     // Initialising with the fake predictor logs an UMA error, because it should
     // be used only in tests and not in production.
     if (using_fake_predictor) {
-      histogram_tester_.ExpectUniqueSample(
-          "RecurrenceRanker.ConfigurationError",
-          ConfigurationError::kFakePredictorUsed, 1);
+      histogram_tester_.ExpectTotalCount(
+          "RecurrenceRanker.InitializationStatus.MyModel", 2);
+      histogram_tester_.ExpectBucketCount(
+          "RecurrenceRanker.InitializationStatus.MyModel",
+          InitializationStatus::kFakePredictorUsed, 1);
+      histogram_tester_.ExpectBucketCount(
+          "RecurrenceRanker.InitializationStatus.MyModel",
+          InitializationStatus::kInitialized, 1);
     } else {
-      histogram_tester_.ExpectTotalCount("RecurrenceRanker.ConfigurationError",
-                                         0);
+      histogram_tester_.ExpectUniqueSample(
+          "RecurrenceRanker.InitializationStatus.MyModel",
+          InitializationStatus::kInitialized, 1);
     }
   }
 
@@ -172,8 +192,8 @@
 
   EXPECT_THAT(ranker->Rank(), UnorderedElementsAre(Pair("A", FloatEq(1.0f)),
                                                    Pair("B", FloatEq(2.0f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, RenameTarget) {
@@ -185,8 +205,8 @@
   ranker->RenameTarget("B", "A");
 
   EXPECT_THAT(ranker->Rank(), ElementsAre(Pair("A", FloatEq(2.0f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, RemoveTarget) {
@@ -198,8 +218,8 @@
   ranker->RemoveTarget("A");
 
   EXPECT_THAT(ranker->Rank(), ElementsAre(Pair("B", FloatEq(2.0f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, ComplexRecordAndRank) {
@@ -219,8 +239,8 @@
   EXPECT_THAT(ranker->Rank(), UnorderedElementsAre(Pair("A", FloatEq(1.0f)),
                                                    Pair("B", FloatEq(2.0f)),
                                                    Pair("F", FloatEq(1.0f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, RankTopN) {
@@ -236,8 +256,8 @@
   EXPECT_THAT(ranker->RankTopN(100),
               ElementsAre(Pair("A", FloatEq(4.0f)), Pair("B", FloatEq(3.0f)),
                           Pair("C", FloatEq(2.0f)), Pair("D", FloatEq(1.0f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, LoadFromDisk) {
@@ -249,7 +269,8 @@
       -1);
 
   // Make a ranker.
-  RecurrenceRanker ranker(ranker_filepath_, MakeSimpleConfig(), false);
+  RecurrenceRanker ranker("MyModel", ranker_filepath_, MakeSimpleConfig(),
+                          false);
 
   // Check that the file loading is executed in non-blocking way.
   EXPECT_FALSE(ranker.load_from_disk_completed_);
@@ -260,8 +281,8 @@
   EXPECT_THAT(ranker.Rank(), UnorderedElementsAre(Pair("A", FloatEq(1.0f)),
                                                   Pair("B", FloatEq(2.0f)),
                                                   Pair("C", FloatEq(1.0f))));
-  ExpectErrors(/*fresh_model_created = */ false,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ false,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, InitializeIfNoFileExists) {
@@ -271,14 +292,14 @@
   base::FilePath filepath =
       temp_dir.GetPath().AppendASCII("recurrence_ranker_invalid");
 
-  RecurrenceRanker ranker(filepath, MakeSimpleConfig(), false);
+  RecurrenceRanker ranker("MyModel", filepath, MakeSimpleConfig(), false);
   Wait();
 
   EXPECT_TRUE(ranker.load_from_disk_completed_);
   EXPECT_TRUE(ranker.Rank().empty());
 
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, SaveToDisk) {
@@ -311,8 +332,9 @@
   // Expect the content to be proto_.
   EXPECT_TRUE(EquivToProtoLite(proto_written, MakeTestingProto()));
 
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ true);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ true,
+               /* has_saved = */ true);
 }
 
 TEST_F(RecurrenceRankerTest, SavedRankerRejectedIfConfigMismatched) {
@@ -329,7 +351,8 @@
   other_config.mutable_predictor()->mutable_fake_predictor();
   other_config.set_min_seconds_between_saves(1234);
 
-  RecurrenceRanker other_ranker(ranker_filepath_, other_config, false);
+  RecurrenceRanker other_ranker("MyModel", ranker_filepath_, other_config,
+                                false);
   Wait();
 
   // Expect that the second ranker doesn't return any rankings, because it
@@ -339,8 +362,9 @@
   // For comparison:
   EXPECT_THAT(ranker->Rank(), UnorderedElementsAre(Pair("A", FloatEq(1.0f))));
   // Should also log an error to UMA.
-  histogram_tester_.ExpectBucketCount("RecurrenceRanker.ConfigurationError",
-                                      ConfigurationError::kHashMismatch, 1);
+  histogram_tester_.ExpectBucketCount(
+      "RecurrenceRanker.InitializationStatus.MyModel",
+      InitializationStatus::kHashMismatch, 1);
 }
 
 TEST_F(RecurrenceRankerTest, Cleanup) {
@@ -380,12 +404,14 @@
 }
 
 TEST_F(RecurrenceRankerTest, EphemeralUsersUseDefaultPredictor) {
-  RecurrenceRanker ephemeral_ranker(ranker_filepath_, MakeSimpleConfig(), true);
+  RecurrenceRanker ephemeral_ranker("MyModel", ranker_filepath_,
+                                    MakeSimpleConfig(), true);
   Wait();
   EXPECT_THAT(ephemeral_ranker.GetPredictorNameForTesting(),
               StrEq(DefaultPredictor::kPredictorName));
-  ExpectErrors(/*fresh_model_created = */ false,
-               /*using_fake_predictor = */ false);
+  histogram_tester_.ExpectBucketCount(
+      "RecurrenceRanker.InitializationStatus.MyModel",
+      InitializationStatus::kEphemeralUser, 1);
 }
 
 TEST_F(RecurrenceRankerTest, IntegrationWithDefaultPredictor) {
@@ -393,7 +419,7 @@
   PartiallyPopulateConfig(&config);
   config.mutable_predictor()->mutable_default_predictor();
 
-  RecurrenceRanker ranker(ranker_filepath_, config, false);
+  RecurrenceRanker ranker("MyModel", ranker_filepath_, config, false);
   Wait();
 
   ranker.Record("A");
@@ -404,8 +430,8 @@
   EXPECT_THAT(ranker.Rank(), UnorderedElementsAre(Pair("A", FloatEq(0.2304f)),
                                                   Pair("B", FloatEq(0.16f)),
                                                   Pair("C", FloatEq(0.2f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ false);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ false);
 }
 
 TEST_F(RecurrenceRankerTest, IntegrationWithZeroStateFrecencyPredictor) {
@@ -414,7 +440,7 @@
   auto* predictor = config.mutable_predictor()->mutable_frecency_predictor();
   predictor->set_decay_coeff(0.5f);
 
-  RecurrenceRanker ranker(ranker_filepath_, config, false);
+  RecurrenceRanker ranker("MyModel", ranker_filepath_, config, false);
   Wait();
 
   ranker.Record("A");
@@ -429,8 +455,8 @@
   EXPECT_THAT(ranker.Rank(), UnorderedElementsAre(Pair("A", FloatEq(0.09375f)),
                                                   Pair("B", FloatEq(0.125f)),
                                                   Pair("C", FloatEq(0.25f))));
-  ExpectErrors(/*fresh_model_created = */ true,
-               /*using_fake_predictor = */ false);
+  ExpectErrors(/* fresh_model_created = */ true,
+               /* using_fake_predictor = */ false);
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
index 4f23051..bf196d93 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
@@ -205,25 +205,33 @@
 }  // namespace
 
 std::unique_ptr<RecurrencePredictor> MakePredictor(
-    const RecurrencePredictorConfigProto& config) {
+    const RecurrencePredictorConfigProto& config,
+    const std::string& model_identifier) {
   if (config.has_fake_predictor())
-    return std::make_unique<FakePredictor>(config.fake_predictor());
+    return std::make_unique<FakePredictor>(config.fake_predictor(),
+                                           model_identifier);
   if (config.has_default_predictor())
-    return std::make_unique<DefaultPredictor>(config.default_predictor());
+    return std::make_unique<DefaultPredictor>(config.default_predictor(),
+                                              model_identifier);
   if (config.has_conditional_frequency_predictor())
     return std::make_unique<ConditionalFrequencyPredictor>(
-        config.conditional_frequency_predictor());
+
+        config.conditional_frequency_predictor(), model_identifier);
   if (config.has_frecency_predictor())
-    return std::make_unique<FrecencyPredictor>(config.frecency_predictor());
+    return std::make_unique<FrecencyPredictor>(config.frecency_predictor(),
+                                               model_identifier);
   if (config.has_hour_bin_predictor())
-    return std::make_unique<HourBinPredictor>(config.hour_bin_predictor());
+    return std::make_unique<HourBinPredictor>(config.hour_bin_predictor(),
+                                              model_identifier);
   if (config.has_markov_predictor())
-    return std::make_unique<MarkovPredictor>(config.markov_predictor());
+    return std::make_unique<MarkovPredictor>(config.markov_predictor(),
+                                             model_identifier);
   if (config.has_exponential_weights_ensemble())
     return std::make_unique<ExponentialWeightsEnsemble>(
-        config.exponential_weights_ensemble());
+        config.exponential_weights_ensemble(), model_identifier);
 
-  LogConfigurationError(ConfigurationError::kInvalidPredictor);
+  LogInitializationStatus(model_identifier,
+                          InitializationStatus::kInvalidConfigPredictor);
   NOTREACHED();
   return nullptr;
 }
@@ -235,20 +243,27 @@
 JsonConfigConverter::~JsonConfigConverter() {}
 
 void JsonConfigConverter::Convert(const std::string& json_string,
+                                  const std::string& model_identifier,
                                   OnConfigLoadedCallback callback) {
   GetJsonParser().Parse(
-      json_string, base::BindOnce(&JsonConfigConverter::OnJsonParsed,
-                                  base::Unretained(this), std::move(callback)));
+      json_string,
+      base::BindOnce(&JsonConfigConverter::OnJsonParsed, base::Unretained(this),
+                     std::move(callback), model_identifier));
 }
 
 void JsonConfigConverter::OnJsonParsed(
     OnConfigLoadedCallback callback,
+    const std::string& model_identifier,
     const base::Optional<base::Value> json_data,
     const base::Optional<std::string>& error) {
   RecurrenceRankerConfigProto proto;
   if (json_data && ConvertRecurrenceRanker(&json_data.value(), &proto)) {
+    LogJsonConfigConversionStatus(model_identifier,
+                                  JsonConfigConversionStatus::kSuccess);
     std::move(callback).Run(std::move(proto));
   } else {
+    LogJsonConfigConversionStatus(model_identifier,
+                                  JsonConfigConversionStatus::kFailure);
     std::move(callback).Run(base::nullopt);
   }
 }
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.h b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.h
index 2553543..c746ceb 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.h
@@ -26,7 +26,8 @@
 
 // Returns a new, configured instance of the predictor defined in |config|.
 std::unique_ptr<RecurrencePredictor> MakePredictor(
-    const RecurrencePredictorConfigProto& config);
+    const RecurrencePredictorConfigProto& config,
+    const std::string& model_identifier);
 
 // A utility class for converting a JSON configuration for a RecurrenceRanker
 // into a RecurrenceRankerConfigProto that can be used to construct the ranker.
@@ -47,8 +48,12 @@
 
   // Performs a conversion. The provided |callback| will be called with the
   // resulting proto if the conversion succeeded, or base::nullopt if the
-  // parsing or conversion failed.
-  void Convert(const std::string& json_string, OnConfigLoadedCallback callback);
+  // parsing or conversion failed. |model_identifier| is used for metrics
+  // reporting in the same way as the RecurrenceRanker's |model_identifier|
+  // parameter.
+  void Convert(const std::string& json_string,
+               const std::string& model_identifier,
+               OnConfigLoadedCallback callback);
 
  private:
   // Create or reuse a connection to the data decoder service for safe JSON
@@ -57,9 +62,12 @@
 
   // Callback for parser.
   void OnJsonParsed(OnConfigLoadedCallback callback,
+                    const std::string& model_identifier,
                     const base::Optional<base::Value> json_data,
                     const base::Optional<std::string>& error);
 
+  std::string model_identifier_;
+
   service_manager::Connector* connector_;
   data_decoder::mojom::JsonParserPtr json_parser_;
 };
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util_unittest.cc
index 1d47dca..3f9e362 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util_unittest.cc
@@ -34,13 +34,14 @@
     base::RunLoop run_loop;
     done_callback_ = run_loop.QuitClosure();
     converter_->Convert(
-        json, base::BindOnce(
-                  [](RecurrenceRankerJsonConfigConverterTest* fixture,
-                     base::Optional<RecurrenceRankerConfigProto> config) {
-                    fixture->config_ = config;
-                    fixture->done_callback_.Run();
-                  },
-                  base::Unretained(this)));
+        json, "",
+        base::BindOnce(
+            [](RecurrenceRankerJsonConfigConverterTest* fixture,
+               base::Optional<RecurrenceRankerConfigProto> config) {
+              fixture->config_ = config;
+              fixture->done_callback_.Run();
+            },
+            base::Unretained(this)));
     run_loop.Run();
     return config_;
   }
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
index 0a9023d..4be36f9 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
@@ -148,6 +148,7 @@
             "use_category_model", false)) {
       // Group ranker model.
       results_list_group_ranker_ = std::make_unique<RecurrenceRanker>(
+          "QueryBasedMixedTypesGroup",
           profile_->GetPath().AppendASCII("results_list_group_ranker.pb"),
           config, chromeos::ProfileHelper::IsEphemeralUserProfile(profile_));
 
@@ -156,7 +157,7 @@
       const std::string config_json = GetFieldTrialParamValueByFeature(
           app_list_features::kEnableQueryBasedMixedTypesRanker, "config");
       config_converter_.Convert(
-          config_json,
+          config_json, "QueryBasedMixedTypes",
           base::BindOnce(
               [](SearchResultRanker* ranker,
                  const RecurrenceRankerConfigProto& default_config,
@@ -165,6 +166,7 @@
                   std::move(ranker->json_config_parsed_for_testing_).Run();
                 ranker->query_based_mixed_types_ranker_ =
                     std::make_unique<RecurrenceRanker>(
+                        "QueryBasedMixedTypes",
                         ranker->profile_->GetPath().AppendASCII(
                             "query_based_mixed_types_ranker.pb"),
                         parsed_config ? parsed_config.value() : default_config,
@@ -193,6 +195,7 @@
     config.mutable_predictor()->mutable_default_predictor();
 
     zero_state_mixed_types_ranker_ = std::make_unique<RecurrenceRanker>(
+        "ZeroStateMixedTypes",
         profile_->GetPath().AppendASCII("zero_state_mixed_types_ranker.proto"),
         config, chromeos::ProfileHelper::IsEphemeralUserProfile(profile_));
   }
@@ -254,6 +257,19 @@
 }
 
 void SearchResultRanker::Train(const AppLaunchData& app_launch_data) {
+  if (app_launch_data.launched_from ==
+      ash::AppListLaunchedFrom::kLaunchedFromGrid) {
+    // Log the AppResult from the grid to the UKM system.
+    app_launch_event_logger_.OnGridClicked(app_launch_data.id);
+  } else if (app_launch_data.launch_type ==
+             ash::AppListLaunchType::kAppSearchResult) {
+    // Log the AppResult (either in the search result page, or in chip form in
+    // AppsGridView) to the UKM system.
+    app_launch_event_logger_.OnSuggestionChipOrSearchBoxClicked(
+        app_launch_data.id, app_launch_data.suggestion_index,
+        static_cast<int>(app_launch_data.launched_from));
+  }
+
   if (ModelForType(app_launch_data.ranking_item_type) == Model::MIXED_TYPES) {
     if (results_list_group_ranker_) {
       results_list_group_ranker_->Record(base::NumberToString(
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
index cc55b31..8b1f09ef 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/search/mixer.h"
 #include "chrome/browser/ui/app_list/search/search_result_ranker/app_launch_data.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h"
 #include "chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.h"
 
 namespace app_list {
@@ -108,6 +109,9 @@
   // Testing-only closure to inform tests once a JSON config has been parsed.
   base::OnceClosure json_config_parsed_for_testing_;
 
+  // Logs launch events and stores feature data for aggregated model.
+  app_list::AppLaunchEventLogger app_launch_event_logger_;
+
   // TODO(931149): Move the AppSearchResultRanker instance and associated logic
   // to here.
 
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc
index ea48376c..181f4c6 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -6,6 +6,8 @@
 
 #include <utility>
 
+#include "apps/launcher.h"
+#include "ash/public/cpp/app_list/internal_app_id_constants.h"
 #include "ash/public/cpp/arc_custom_tab.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/keyboard_shortcut_viewer.h"
@@ -38,6 +40,7 @@
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
+#include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/arc/arc_util.h"
@@ -55,6 +58,7 @@
 #include "content/public/common/service_manager_connection.h"
 #include "content/public/common/user_agent.h"
 #include "content/public/common/was_activated_option.h"
+#include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
@@ -480,6 +484,23 @@
   chrome::OpenFeedbackDialog(chrome::FindBrowserWithActiveWindow(), source);
 }
 
+void ChromeNewWindowClient::LaunchCameraApp(const std::string& queries) {
+  Profile* const profile = ProfileManager::GetActiveUserProfile();
+  const extensions::ExtensionRegistry* registry =
+      extensions::ExtensionRegistry::Get(profile);
+  const extensions::Extension* extension =
+      registry->GetInstalledExtension(extension_misc::kChromeCameraAppId);
+
+  auto url = GURL(extensions::Extension::GetBaseURLFromExtensionId(
+                      extension_misc::kChromeCameraAppId)
+                      .spec() +
+                  queries);
+
+  apps::LaunchPlatformAppWithUrl(profile, extension,
+                                 /*handler_id=*/std::string(), url,
+                                 /*referrer_url=*/GURL());
+}
+
 void ChromeNewWindowClient::OpenUrlFromArc(const GURL& url) {
   if (!url.is_valid())
     return;
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.h b/chrome/browser/ui/ash/chrome_new_window_client.h
index 6a64de5..baaf0c3 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.h
+++ b/chrome/browser/ui/ash/chrome_new_window_client.h
@@ -46,6 +46,7 @@
   void ShowKeyboardShortcutViewer() override;
   void ShowTaskManager() override;
   void OpenFeedbackPage(bool from_assistant) override;
+  void LaunchCameraApp(const std::string& queries) override;
 
   // arc::OpenUrlDelegate:
   void OpenUrlFromArc(const GURL& url) override;
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index 51348c1f..4c817cbcc 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -13,12 +13,16 @@
 #include "base/macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/no_destructor.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
+#include "base/system/sys_info.h"
 #include "build/build_config.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/chromeos/extensions/default_web_app_ids.h"
 #include "chrome/browser/download/download_shelf.h"
 #include "chrome/browser/extensions/launch_util.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
@@ -33,21 +37,28 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h"
 #include "chrome/browser/ui/webui/site_settings_helper.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/url_constants.h"
+#include "chromeos/login/login_state/login_state.h"
+#include "chromeos/system/statistics_provider.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
 #include "extensions/common/constants.h"
 #include "google_apis/gaia/gaia_urls.h"
 #include "net/base/url_util.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/window_open_disposition.h"
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chromeos/constants/chromeos_features.h"
+#include "components/version_info/version_info.h"
 #include "extensions/browser/extension_registry.h"
 #else
 #include "chrome/browser/ui/signin_view_controller.h"
@@ -81,6 +92,64 @@
   ShowSingletonTabOverwritingNTP(browser, std::move(params));
 }
 
+#if defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD)
+void LaunchReleaseNotesInTab(Profile* profile) {
+  GURL url(kChromeReleaseNotesURL);
+  auto displayer = std::make_unique<ScopedTabbedBrowserDisplayer>(profile);
+  ShowSingletonTab(displayer->browser(), url);
+}
+
+const std::string BuildQueryString(Profile* profile) {
+  const std::string board_name = base::SysInfo::GetLsbReleaseBoard();
+  std::string region;
+  chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic(
+      "region", &region);
+  const std::string language = l10n_util::GetApplicationLocale(std::string());
+  const std::string version = version_info::GetVersionNumber();
+  const std::string milestone = version_info::GetMajorVersionNumber();
+  std::string channel_name =
+      chrome::GetChannelName();  // beta, dev, canary, unknown, or empty string
+                                 // for stable
+  if (channel_name.empty())
+    channel_name = "stable";
+  const std::string username = profile->GetProfileUserName();
+  std::string user_type;
+  if (base::EndsWith(username, "@google.com",
+                     base::CompareCase::INSENSITIVE_ASCII)) {
+    user_type = "googler";
+  } else if (profile->GetProfilePolicyConnector()->IsManaged()) {
+    user_type = "managed";
+  } else {
+    user_type = "general";
+  }
+
+  const std::string query_string = base::StrCat(
+      {kChromeReleaseNotesURL, "version=", milestone, "&tags=", board_name, ",",
+       region, ",", language, ",", channel_name, ",", user_type});
+  return query_string;
+}
+#endif
+
+#if defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD)
+void LaunchReleaseNotesImpl(Profile* profile) {
+  base::RecordAction(UserMetricsAction("ReleaseNotes.ShowReleaseNotes"));
+  const extensions::Extension* extension =
+      extensions::ExtensionRegistry::Get(profile)->GetExtensionById(
+          chromeos::default_web_apps::kReleaseNotesAppId,
+          extensions::ExtensionRegistry::EVERYTHING);
+  if (extension) {
+    AppLaunchParams params = CreateAppLaunchParamsWithEventFlags(
+        profile, extension, 0, extensions::AppLaunchSource::kSourceUntracked,
+        -1);
+    params.override_url = GURL(BuildQueryString(profile));
+    OpenApplication(params);
+    return;
+  }
+  DVLOG(1) << "ReleaseNotes App Not Found";
+  LaunchReleaseNotesInTab(profile);
+}
+#endif
+
 // Shows either the help app or the appropriate help page for |source|. If
 // |browser| is NULL and the help page is used (vs the app), the help page is
 // shown in the last active browser. If there is no such browser, a new browser
@@ -264,6 +333,12 @@
   ShowHelpImpl(NULL, profile, source);
 }
 
+void LaunchReleaseNotes(Profile* profile) {
+#if defined(OS_CHROMEOS) && defined(GOOGLE_CHROME_BUILD)
+  LaunchReleaseNotesImpl(profile);
+#endif
+}
+
 void ShowBetaForum(Browser* browser) {
   ShowSingletonTab(browser, GURL(kChromeBetaForumURL));
 }
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index 3e62f250..696d3066 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -77,6 +77,7 @@
 
 void ShowHelp(Browser* browser, HelpSource source);
 void ShowHelpForProfile(Profile* profile, HelpSource source);
+void LaunchReleaseNotes(Profile* profile);
 void ShowBetaForum(Browser* browser);
 void ShowPolicy(Browser* browser);
 void ShowSlow(Browser* browser);
diff --git a/chrome/browser/ui/extensions/application_launch.cc b/chrome/browser/ui/extensions/application_launch.cc
index e94fad3f..8598e59 100644
--- a/chrome/browser/ui/extensions/application_launch.cc
+++ b/chrome/browser/ui/extensions/application_launch.cc
@@ -35,6 +35,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_tab_helper_base.h"
+#include "chrome/browser/web_launch/web_launch_files_helper.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/url_constants.h"
@@ -427,6 +428,10 @@
   // TODO(jcampan): http://crbug.com/8123 we should not need to set the initial
   //                focus explicitly.
   web_contents->SetInitialFocus();
+
+  web_launch::WebLaunchFilesHelper::SetLaunchPaths(web_contents, url,
+                                                   params.launch_files);
+
   return web_contents;
 }
 
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index e8dea896..103a456 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -874,50 +874,85 @@
         {});
   }
 
+  base::FilePath NewTestFilePath() {
+    // CreateTemporaryFile blocks, temporarily allow blocking.
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    base::FilePath test_file_path;
+    base::CreateTemporaryFile(&test_file_path);
+    return test_file_path;
+  }
+
+  std::string InstallFileHandlingPWA() {
+    DCHECK_EQ(web_app_info_.app_url, GURL());
+    GURL url = GetSecureAppURL();
+
+    web_app_info_.app_url = url;
+    web_app_info_.scope = url.GetWithoutFilename();
+    web_app_info_.title = base::ASCIIToUTF16("A Hosted App");
+    web_app_info_.file_handler = blink::Manifest::FileHandler();
+    web_app_info_.file_handler->action =
+        https_server()->GetURL("app.com", "/ssl/blank_page.html");
+
+    {
+      std::vector<blink::Manifest::FileFilter> filters;
+      blink::Manifest::FileFilter text = {
+          base::ASCIIToUTF16("text"),
+          {base::ASCIIToUTF16(".txt"), base::ASCIIToUTF16("text/*")}};
+      filters.push_back(text);
+      web_app_info_.file_handler->files = std::move(filters);
+    }
+
+    app_ = InstallBookmarkApp(web_app_info_);
+    return app_->id();
+  }
+
+  content::WebContents* LaunchWithFiles(
+      const std::string& app_id,
+      const std::vector<base::FilePath>& files) {
+    AppLaunchParams params(browser()->profile(), app_id,
+                           extensions::LaunchContainer::kLaunchContainerWindow,
+                           WindowOpenDisposition::NEW_WINDOW,
+                           extensions::AppLaunchSource::kSourceFileHandler);
+    params.launch_files = files;
+
+    content::TestNavigationObserver navigation_observer(
+        web_app_info_.file_handler->action);
+    navigation_observer.StartWatchingNewWebContents();
+
+    content::WebContents* web_contents =
+        OpenApplicationWindow(params, web_app_info_.file_handler->action);
+    navigation_observer.Wait();
+    return web_contents;
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
+  WebApplicationInfo web_app_info_;
 };
 
 IN_PROC_BROWSER_TEST_P(HostedAppFileHandlingTest, PWAsCanViewLaunchParams) {
   ASSERT_TRUE(https_server()->Start());
 
-  GURL url = GetSecureAppURL();
-
-  WebApplicationInfo web_app_info;
-  web_app_info.app_url = url;
-  web_app_info.scope = url.GetWithoutFilename();
-  web_app_info.title = base::ASCIIToUTF16("A Hosted App");
-  web_app_info.file_handler = blink::Manifest::FileHandler();
-  web_app_info.file_handler->action =
-      GURL(https_server()->GetURL("app.com", "/ssl/blank_page.html"));
-
-  {
-    std::vector<blink::Manifest::FileFilter> filters;
-    blink::Manifest::FileFilter text = {
-        base::ASCIIToUTF16("text"),
-        {base::ASCIIToUTF16(".txt"), base::ASCIIToUTF16("text/*")}};
-    filters.push_back(text);
-    web_app_info.file_handler->files = std::move(filters);
-  }
-
-  const extensions::Extension* app = InstallBookmarkApp(web_app_info);
-
-  AppLaunchParams params(browser()->profile(), app->id(),
-                         extensions::LaunchContainer::kLaunchContainerWindow,
-                         WindowOpenDisposition::NEW_WINDOW,
-                         extensions::AppLaunchSource::kSourceFileHandler);
-
-  content::TestNavigationObserver navigation_observer(
-      web_app_info.file_handler->action);
-  navigation_observer.StartWatchingNewWebContents();
-
-  content::WebContents* web_contents =
-      OpenApplicationWindow(params, web_app_info.file_handler->action);
-  navigation_observer.Wait();
-
+  const std::string app_id = InstallFileHandlingPWA();
+  content::WebContents* web_contents = LaunchWithFiles(app_id, {});
   EXPECT_EQ(0, content::EvalJs(web_contents, "launchParams.files.length"));
 }
 
+IN_PROC_BROWSER_TEST_P(HostedAppFileHandlingTest,
+                       PWAsCanReceiveFileLaunchParams) {
+  ASSERT_TRUE(https_server()->Start());
+
+  const std::string app_id = InstallFileHandlingPWA();
+  base::FilePath test_file_path = NewTestFilePath();
+  content::WebContents* web_contents =
+      LaunchWithFiles(app_id, {test_file_path});
+
+  EXPECT_EQ(1, content::EvalJs(web_contents, "launchParams.files.length"));
+  EXPECT_EQ(test_file_path.BaseName().value(),
+            content::EvalJs(web_contents, "launchParams.files[0].name"));
+}
+
 #if !defined(OS_ANDROID)
 class HostedAppBadgingTest : public HostedAppTest {
  public:
diff --git a/chrome/browser/ui/page_info/page_info.cc b/chrome/browser/ui/page_info/page_info.cc
index bba1d27..649078d6 100644
--- a/chrome/browser/ui/page_info/page_info.cc
+++ b/chrome/browser/ui/page_info/page_info.cc
@@ -987,18 +987,14 @@
         safe_browsing::WarningAction::SHOWN,
         password_protection_service_
             ->GetPasswordProtectionReusedPasswordAccountType(
-                PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-                (password_protection_service_->GetAccountInfo())
-                    .hosted_domain));
+                PasswordType::PRIMARY_ACCOUNT_PASSWORD));
   } else {
     safe_browsing::LogWarningAction(
         safe_browsing::WarningUIType::PAGE_INFO,
         safe_browsing::WarningAction::SHOWN,
         password_protection_service_
             ->GetPasswordProtectionReusedPasswordAccountType(
-                PasswordType::ENTERPRISE_PASSWORD,
-                (password_protection_service_->GetAccountInfo())
-                    .hosted_domain));
+                PasswordType::ENTERPRISE_PASSWORD));
   }
 }
 #endif
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index ed0add4b..9b2ead0b 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -995,11 +995,8 @@
   ASSERT_TRUE(GetIsLightChipsApplied(active_tab));
 
   // Enable dark mode and wait until the MV tiles have updated.
-  content::DOMMessageQueue msg_queue(active_tab);
   theme()->SetDarkMode(true);
   theme()->NotifyObservers();
-  local_ntp_test_utils::WaitUntilTilesLoaded(active_tab, &msg_queue,
-                                             /*delay=*/0);
 
   // Check that dark mode has been properly applied.
   EXPECT_TRUE(GetIsDarkModeApplied(active_tab));
@@ -1008,11 +1005,8 @@
   EXPECT_FALSE(GetIsLightChipsApplied(active_tab));
 
   // Disable dark mode and wait until the MV tiles have updated.
-  msg_queue.ClearQueue();
   theme()->SetDarkMode(false);
   theme()->NotifyObservers();
-  local_ntp_test_utils::WaitUntilTilesLoaded(active_tab, &msg_queue,
-                                             /*delay=*/0);
 
   // Check that dark mode has been removed.
   EXPECT_FALSE(GetIsDarkModeApplied(active_tab));
diff --git a/chrome/browser/ui/views/crostini/crostini_installer_view.cc b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
index 48b8756a..1bf519b 100644
--- a/chrome/browser/ui/views/crostini/crostini_installer_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
@@ -268,13 +268,15 @@
 
 bool CrostiniInstallerView::Cancel() {
   if (!has_logged_timing_result_ &&
-      restart_id_ == crostini::CrostiniManager::kUninitializedRestartId) {
+      (restart_id_ != crostini::CrostiniManager::kUninitializedRestartId ||
+       state_ == State::INSTALL_START)) {
     UMA_HISTOGRAM_LONG_TIMES(kCrostiniTimeToInstallCancel,
                              base::TimeTicks::Now() - install_start_time_);
     has_logged_timing_result_ = true;
   }
   if (!has_logged_free_disk_result_ &&
-      restart_id_ == crostini::CrostiniManager::kUninitializedRestartId &&
+      (restart_id_ != crostini::CrostiniManager::kUninitializedRestartId ||
+       state_ == State::INSTALL_START) &&
       free_disk_space_ != kUninitializedDiskSpace) {
     base::UmaHistogramCounts1M(kCrostiniAvailableDiskCancel,
                                free_disk_space_ >> 20);
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc
index d4c186e..6a00a9f 100644
--- a/chrome/browser/ui/views/external_protocol_dialog.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -42,7 +42,9 @@
   new ExternalProtocolDialog(std::move(delegate), web_contents);
 }
 
-ExternalProtocolDialog::~ExternalProtocolDialog() {}
+ExternalProtocolDialog::~ExternalProtocolDialog() {
+  delete remember_decision_checkbox_;
+}
 
 gfx::Size ExternalProtocolDialog::CalculatePreferredSize() const {
   constexpr int kDialogContentWidth = 400;
@@ -108,7 +110,11 @@
   DCHECK(delegate_->GetMessageText().empty());
   remember_decision_checkbox_ =
       new views::Checkbox(delegate_->GetCheckboxText());
-  AddChildView(remember_decision_checkbox_);
+  remember_decision_checkbox_->SetChecked(false);
+
+  // TODO(982341): We intentionally don't add |remember_decision_checkbox_| to
+  // the dialog, as we're reevaluating whether we actually want persistence
+  // for this mechanism going forward.
 
   constrained_window::ShowWebModalDialogViews(this, web_contents);
   chrome::RecordDialogCreation(chrome::DialogIdentifier::EXTERNAL_PROTOCOL);
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
index 6f43a6e..5dd61ff5bd 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
@@ -445,73 +445,6 @@
 }
 
 // Test opening page info bubble that matches
-// SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE threat type.
-IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
-                       VerifySignInPasswordReusePageInfoBubble) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  base::HistogramTester histograms;
-  histograms.ExpectTotalCount(safe_browsing::kSyncPasswordPageInfoHistogram, 0);
-  ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL("/"));
-
-  // Update security state of the current page to match
-  // SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE.
-  safe_browsing::ChromePasswordProtectionService* service =
-      safe_browsing::ChromePasswordProtectionService::
-          GetPasswordProtectionService(browser()->profile());
-  content::WebContents* contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  service->ShowModalWarning(contents, "token",
-                            PasswordType::PRIMARY_ACCOUNT_PASSWORD);
-
-  OpenPageInfoBubble(browser());
-  views::View* change_password_button = GetView(
-      browser(), PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_CHANGE_PASSWORD);
-  views::View* whitelist_password_reuse_button = GetView(
-      browser(),
-      PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_WHITELIST_PASSWORD_REUSE);
-
-  SecurityStateTabHelper* helper =
-      SecurityStateTabHelper::FromWebContents(contents);
-  std::unique_ptr<security_state::VisibleSecurityState> visible_security_state =
-      helper->GetVisibleSecurityState();
-  ASSERT_EQ(security_state::MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE,
-            visible_security_state->malicious_content_status);
-
-  // Verify these two buttons are showing.
-  EXPECT_TRUE(change_password_button->GetVisible());
-  EXPECT_TRUE(whitelist_password_reuse_button->GetVisible());
-
-  // Verify clicking on button will increment corresponding bucket of
-  // PasswordProtection.PageInfoAction.SyncPasswordEntry histogram.
-  PerformMouseClickOnView(change_password_button);
-  EXPECT_THAT(
-      histograms.GetAllSamples(safe_browsing::kSyncPasswordPageInfoHistogram),
-      testing::ElementsAre(
-          base::Bucket(static_cast<int>(safe_browsing::WarningAction::SHOWN),
-                       1),
-          base::Bucket(
-              static_cast<int>(safe_browsing::WarningAction::CHANGE_PASSWORD),
-              1)));
-
-  PerformMouseClickOnView(whitelist_password_reuse_button);
-  EXPECT_THAT(
-      histograms.GetAllSamples(safe_browsing::kSyncPasswordPageInfoHistogram),
-      testing::ElementsAre(
-          base::Bucket(static_cast<int>(safe_browsing::WarningAction::SHOWN),
-                       1),
-          base::Bucket(
-              static_cast<int>(safe_browsing::WarningAction::CHANGE_PASSWORD),
-              1),
-          base::Bucket(static_cast<int>(
-                           safe_browsing::WarningAction::MARK_AS_LEGITIMATE),
-                       1)));
-  // Security state will change after whitelisting.
-  visible_security_state = helper->GetVisibleSecurityState();
-  EXPECT_EQ(security_state::MALICIOUS_CONTENT_STATUS_NONE,
-            visible_security_state->malicious_content_status);
-}
-
-// Test opening page info bubble that matches
 // SB_THREAT_TYPE_ENTERPRISE_PASSWORD_REUSE threat type.
 IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
                        VerifyEnterprisePasswordReusePageInfoBubble) {
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc
new file mode 100644
index 0000000..a6513eb
--- /dev/null
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc
@@ -0,0 +1,185 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/page_info/page_info_bubble_view.h"
+
+#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ssl/security_state_tab_helper.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
+#include "chrome/browser/sync/test/integration/sync_test.h"
+#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
+#include "chrome/browser/ui/views/location_bar/location_icon_view.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
+#include "components/signin/public/base/signin_pref_names.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_user_settings.h"
+#include "components/sync/test/fake_server/fake_server_network_resources.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/events/event_constants.h"
+#include "ui/views/test/widget_test.h"
+
+namespace {
+
+using password_manager::metrics_util::PasswordType;
+
+// The ClickEvent class is copied from the PageInfoBubbleViewBrowserTest.iden
+class ClickEvent : public ui::Event {
+ public:
+  ClickEvent() : ui::Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
+};
+
+void PerformMouseClickOnView(views::View* view) {
+  ui::AXActionData data;
+  data.action = ax::mojom::Action::kDoDefault;
+  view->HandleAccessibleAction(data);
+}
+
+// Clicks the location icon to open the page info bubble.
+void OpenPageInfoBubble(Browser* browser) {
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
+  LocationIconView* location_icon_view =
+      browser_view->toolbar()->location_bar()->location_icon_view();
+  ASSERT_TRUE(location_icon_view);
+  ClickEvent event;
+  location_icon_view->ShowBubble(event);
+  views::BubbleDialogDelegateView* page_info =
+      PageInfoBubbleView::GetPageInfoBubble();
+  EXPECT_NE(nullptr, page_info);
+  page_info->set_close_on_deactivate(false);
+}
+
+// Opens the Page Info bubble and retrieves the UI view identified by
+// |view_id|.
+views::View* GetView(Browser* browser, int view_id) {
+  views::Widget* page_info_bubble =
+      PageInfoBubbleView::GetPageInfoBubble()->GetWidget();
+  EXPECT_TRUE(page_info_bubble);
+
+  views::View* view = page_info_bubble->GetRootView()->GetViewByID(view_id);
+  EXPECT_TRUE(view);
+  return view;
+}
+
+}  // namespace
+
+// This test suite tests functionality that requires Sync to be active.
+class PageInfoBubbleViewSyncBrowserTest : public SyncTest {
+ public:
+  PageInfoBubbleViewSyncBrowserTest() : SyncTest(SINGLE_CLIENT) {}
+
+ protected:
+  void SetupSyncForAccount(Profile* profile) {
+    syncer::ProfileSyncService* sync_service =
+        ProfileSyncServiceFactory::GetAsProfileSyncServiceForProfile(profile);
+
+    sync_service->OverrideNetworkResourcesForTest(
+        std::make_unique<fake_server::FakeServerNetworkResources>(
+            GetFakeServer()->AsWeakPtr()));
+
+    std::string username;
+#if defined(OS_CHROMEOS)
+    // In browser tests, the profile may already by authenticated with stub
+    // account |user_manager::kStubUserEmail|.
+    CoreAccountInfo info =
+        IdentityManagerFactory::GetForProfile(profile)->GetPrimaryAccountInfo();
+    username = info.email;
+#endif
+    if (username.empty()) {
+      browser()->profile()->GetPrefs()->SetString(
+          prefs::kGoogleServicesUsername, "user@domain.com");
+      username = "user@domain.com";
+    }
+
+    std::unique_ptr<ProfileSyncServiceHarness> harness =
+        ProfileSyncServiceHarness::Create(
+            profile, username, "password",
+            ProfileSyncServiceHarness::SigninType::FAKE_SIGNIN);
+    EXPECT_TRUE(harness->SetupSync());
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(PageInfoBubbleViewSyncBrowserTest);
+};
+
+// Test opening page info bubble that matches
+// SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE threat type.
+IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewSyncBrowserTest,
+                       VerifySignInPasswordReusePageInfoBubble) {
+  Profile* profile = browser()->profile();
+  SetupSyncForAccount(profile);
+
+  ASSERT_TRUE(embedded_test_server()->Start());
+  base::HistogramTester histograms;
+  histograms.ExpectTotalCount(safe_browsing::kSyncPasswordPageInfoHistogram, 0);
+  ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL("/"));
+  // Update security state of the current page to match
+  // SB_THREAT_TYPE_SIGN_IN_PASSWORD_REUSE.
+  safe_browsing::ChromePasswordProtectionService* service = safe_browsing::
+      ChromePasswordProtectionService::GetPasswordProtectionService(profile);
+  content::WebContents* contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  service->ShowModalWarning(contents, "token",
+                            PasswordType::PRIMARY_ACCOUNT_PASSWORD);
+
+  OpenPageInfoBubble(browser());
+  views::View* change_password_button = GetView(
+      browser(), PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_CHANGE_PASSWORD);
+  views::View* safelist_password_reuse_button = GetView(
+      browser(),
+      PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_WHITELIST_PASSWORD_REUSE);
+
+  SecurityStateTabHelper* helper =
+      SecurityStateTabHelper::FromWebContents(contents);
+  std::unique_ptr<security_state::VisibleSecurityState> visible_security_state =
+      helper->GetVisibleSecurityState();
+  ASSERT_EQ(security_state::MALICIOUS_CONTENT_STATUS_SIGN_IN_PASSWORD_REUSE,
+            visible_security_state->malicious_content_status);
+
+  // Verify these two buttons are showing.
+  EXPECT_TRUE(change_password_button->GetVisible());
+  EXPECT_TRUE(safelist_password_reuse_button->GetVisible());
+
+  // Verify clicking on button will increment corresponding bucket of
+  // PasswordProtection.PageInfoAction.SyncPasswordEntry histogram.
+  PerformMouseClickOnView(change_password_button);
+  EXPECT_THAT(
+      histograms.GetAllSamples(safe_browsing::kSyncPasswordPageInfoHistogram),
+      testing::ElementsAre(
+          base::Bucket(static_cast<int>(safe_browsing::WarningAction::SHOWN),
+                       1),
+          base::Bucket(
+              static_cast<int>(safe_browsing::WarningAction::CHANGE_PASSWORD),
+              1)));
+
+  PerformMouseClickOnView(safelist_password_reuse_button);
+  EXPECT_THAT(
+      histograms.GetAllSamples(safe_browsing::kSyncPasswordPageInfoHistogram),
+      testing::ElementsAre(
+          base::Bucket(static_cast<int>(safe_browsing::WarningAction::SHOWN),
+                       1),
+          base::Bucket(
+              static_cast<int>(safe_browsing::WarningAction::CHANGE_PASSWORD),
+              1),
+          base::Bucket(static_cast<int>(
+                           safe_browsing::WarningAction::MARK_AS_LEGITIMATE),
+                       1)));
+  // Security state will change after whitelisting.
+  visible_security_state = helper->GetVisibleSecurityState();
+  EXPECT_EQ(security_state::MALICIOUS_CONTENT_STATUS_NONE,
+            visible_security_state->malicious_content_status);
+}
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
index 0465e66..65b3eee0 100644
--- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
@@ -52,7 +52,6 @@
   // |service| maybe NULL in tests.
   if (service_)
     service_->AddObserver(this);
-
   const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
   set_margins(
       provider->GetDialogInsetsForContentType(views::TEXT, views::TEXT));
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index d392ad70..8cc3756aa 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -296,7 +296,7 @@
 }
 
 bool AuthenticatorNotRegisteredErrorModel::IsAcceptButtonVisible() const {
-  return true;
+  return dialog_model()->request_may_start_over();
 }
 
 bool AuthenticatorNotRegisteredErrorModel::IsAcceptButtonEnabled() const {
@@ -341,7 +341,7 @@
 }
 
 bool AuthenticatorAlreadyRegisteredErrorModel::IsAcceptButtonVisible() const {
-  return true;
+  return dialog_model()->request_may_start_over();
 }
 
 bool AuthenticatorAlreadyRegisteredErrorModel::IsAcceptButtonEnabled() const {
@@ -376,9 +376,14 @@
 
 // AuthenticatorInternalUnrecognizedErrorSheetModel
 // -----------------------------------
+bool AuthenticatorInternalUnrecognizedErrorSheetModel::IsBackButtonVisible()
+    const {
+  return dialog_model()->request_may_start_over();
+}
+
 bool AuthenticatorInternalUnrecognizedErrorSheetModel::IsAcceptButtonVisible()
     const {
-  return true;
+  return dialog_model()->request_may_start_over();
 }
 
 bool AuthenticatorInternalUnrecognizedErrorSheetModel::IsAcceptButtonEnabled()
diff --git a/chrome/browser/ui/webauthn/sheet_models.h b/chrome/browser/ui/webauthn/sheet_models.h
index 568f4131..762ba13 100644
--- a/chrome/browser/ui/webauthn/sheet_models.h
+++ b/chrome/browser/ui/webauthn/sheet_models.h
@@ -191,6 +191,7 @@
 
  private:
   // AuthenticatorSheetModelBase:
+  bool IsBackButtonVisible() const override;
   bool IsAcceptButtonVisible() const override;
   bool IsAcceptButtonEnabled() const override;
   base::string16 GetAcceptButtonLabel() const override;
diff --git a/chrome/browser/ui/webui/app_management/BUILD.gn b/chrome/browser/ui/webui/app_management/BUILD.gn
index 24b1347..4395a4ca 100644
--- a/chrome/browser/ui/webui/app_management/BUILD.gn
+++ b/chrome/browser/ui/webui/app_management/BUILD.gn
@@ -12,7 +12,4 @@
   public_deps = [
     "//chrome/services/app_service/public/mojom",
   ]
-
-  # TODO(https://crbug.com/968369): Change to use new names.
-  use_old_js_lite_bindings_names = true
 }
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
index b886b0e..08cc40a 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.cc
@@ -79,7 +79,7 @@
 // TODO(https://crbug.com/930109): Change these numbers depending on what is
 // shown in the dialog.
 constexpr int kMaxConfirmPasswordChangeDialogWidth = 520;
-constexpr int kMaxConfirmPasswordChangeDialogHeight = 390;
+constexpr int kMaxConfirmPasswordChangeDialogHeight = 380;
 
 constexpr int kMaxNotificationDialogWidth = 768;
 constexpr int kMaxNotificationDialogHeight = 640;
@@ -119,6 +119,10 @@
                            kMaxPasswordChangeDialogHeight);
 }
 
+ui::ModalType PasswordChangeDialog::GetDialogModalType() const {
+  return ui::ModalType::MODAL_TYPE_SYSTEM;
+}
+
 // static
 void PasswordChangeDialog::Show(Profile* profile) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -213,6 +217,15 @@
   return data;
 }
 
+void ConfirmPasswordChangeDialog::AdjustWidgetInitParams(
+    views::Widget::InitParams* params) {
+  params->type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+}
+
+ui::ModalType ConfirmPasswordChangeDialog::GetDialogModalType() const {
+  return ui::ModalType::MODAL_TYPE_SYSTEM;
+}
+
 ConfirmPasswordChangeUI::ConfirmPasswordChangeUI(content::WebUI* web_ui)
     : ui::WebDialogUI(web_ui) {
   Profile* profile = Profile::FromWebUI(web_ui);
@@ -267,6 +280,16 @@
                            kMaxNotificationDialogHeight);
 }
 
+void UrgentPasswordExpiryNotificationDialog::AdjustWidgetInitParams(
+    views::Widget::InitParams* params) {
+  params->type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+}
+
+ui::ModalType UrgentPasswordExpiryNotificationDialog::GetDialogModalType()
+    const {
+  return ui::ModalType::MODAL_TYPE_SYSTEM;
+}
+
 // static
 void UrgentPasswordExpiryNotificationDialog::Show() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
index 8cdaf94..f05b607 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_ui.h
@@ -26,6 +26,7 @@
 
   // ui::WebDialogDelegate:
   void GetDialogSize(gfx::Size* size) const override;
+  ui::ModalType GetDialogModalType() const override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(PasswordChangeDialog);
@@ -58,6 +59,8 @@
   // ui::WebDialogDelegate:
   void GetDialogSize(gfx::Size* size) const override;
   std::string GetDialogArgs() const override;
+  void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
+  ui::ModalType GetDialogModalType() const override;
 
  private:
   std::string scraped_old_password_;
@@ -89,6 +92,8 @@
 
   // ui::WebDialogDelegate:
   void GetDialogSize(gfx::Size* size) const override;
+  void AdjustWidgetInitParams(views::Widget::InitParams* params) override;
+  ui::ModalType GetDialogModalType() const override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(UrgentPasswordExpiryNotificationDialog);
diff --git a/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn b/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn
index efe9618a..2278f17 100644
--- a/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn
@@ -8,7 +8,4 @@
   sources = [
     "explore_sites_internals.mojom",
   ]
-
-  # TODO(https://crbug.com/968369): Change to use new names.
-  use_old_js_lite_bindings_names = true
 }
diff --git a/chrome/browser/ui/webui/feed_internals/BUILD.gn b/chrome/browser/ui/webui/feed_internals/BUILD.gn
index ee4c07c2..846c29a 100644
--- a/chrome/browser/ui/webui/feed_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/feed_internals/BUILD.gn
@@ -12,7 +12,4 @@
   public_deps = [
     "//url/mojom:url_mojom_gurl",
   ]
-
-  # TODO(https://crbug.com/968369): Change to use new names.
-  use_old_js_lite_bindings_names = true
 }
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 3c5033f..c3c1c47 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -16,6 +16,8 @@
 #include "base/i18n/message_formatter.h"
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -60,9 +62,11 @@
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/chromeos/tpm_firmware_update.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/image_source.h"
 #include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
 #include "chrome/browser/ui/webui/help/version_updater_chromeos.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/util/version_loader.h"
@@ -416,6 +420,18 @@
       "getHasEndOfLife",
       base::BindRepeating(&AboutHandler::HandleGetHasEndOfLife,
                           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "getEnabledReleaseNotes",
+      base::BindRepeating(&AboutHandler::HandleGetEnabledReleaseNotes,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "launchReleaseNotes",
+      base::BindRepeating(&AboutHandler::HandleLaunchReleaseNotes,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "checkInternetConnection",
+      base::BindRepeating(&AboutHandler::HandleCheckInternetConnection,
+                          base::Unretained(this)));
 #endif
 #if defined(OS_MACOSX)
   web_ui()->RegisterMessageCallback(
@@ -514,6 +530,40 @@
 }
 
 #if defined(OS_CHROMEOS)
+void AboutHandler::HandleGetEnabledReleaseNotes(const base::ListValue* args) {
+  CHECK_EQ(1U, args->GetSize());
+  std::string callback_id;
+  CHECK(args->GetString(0, &callback_id));
+  ResolveJavascriptCallback(base::Value(callback_id),
+                            base::Value(base::FeatureList::IsEnabled(
+                                chromeos::features::kReleaseNotes)));
+}
+
+void AboutHandler::HandleCheckInternetConnection(const base::ListValue* args) {
+  CHECK_EQ(1U, args->GetSize());
+  std::string callback_id;
+  CHECK(args->GetString(0, &callback_id));
+
+  chromeos::NetworkStateHandler* network_state_handler =
+      chromeos::NetworkHandler::Get()->network_state_handler();
+  const chromeos::NetworkState* network =
+      network_state_handler->DefaultNetwork();
+  ResolveJavascriptCallback(base::Value(callback_id),
+                            base::Value(network && network->IsOnline()));
+}
+
+void AboutHandler::HandleLaunchReleaseNotes(const base::ListValue* args) {
+  DCHECK(args->empty());
+  chromeos::NetworkStateHandler* network_state_handler =
+      chromeos::NetworkHandler::Get()->network_state_handler();
+  const chromeos::NetworkState* network =
+      network_state_handler->DefaultNetwork();
+  if (network && network->IsOnline()) {
+    base::RecordAction(
+        base::UserMetricsAction("ReleaseNotes.LaunchedAboutPage"));
+    chrome::LaunchReleaseNotes(Profile::FromWebUI(web_ui()));
+  }
+}
 
 void AboutHandler::HandleOpenOsHelpPage(const base::ListValue* args) {
   DCHECK(args->empty());
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index 3e8af449f..0c9d0b8 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -85,6 +85,15 @@
   void HandleOpenHelpPage(const base::ListValue* args);
 
 #if defined(OS_CHROMEOS)
+  // Checks if ReleaseNotes is enabled.
+  void HandleGetEnabledReleaseNotes(const base::ListValue* args);
+
+  // Checks if system is connected to internet.
+  void HandleCheckInternetConnection(const base::ListValue* args);
+
+  // Opens the release notes app. |args| must be empty.
+  void HandleLaunchReleaseNotes(const base::ListValue* args);
+
   // Opens the help page. |args| must be empty.
   void HandleOpenOsHelpPage(const base::ListValue* args);
 
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 1d3ae01..b6705b3 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -475,6 +475,10 @@
   html_source->AddLocalizedString("aboutGetHelpUsingChromeOs",
                                   IDS_SETTINGS_GET_HELP_USING_CHROME_OS);
   html_source->AddLocalizedString("aboutOsProductTitle", IDS_PRODUCT_OS_NAME);
+  html_source->AddLocalizedString("aboutReleaseNotesOffline",
+                                  IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES);
+  html_source->AddLocalizedString("aboutShowReleaseNotes",
+                                  IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES);
   if (base::FeatureList::IsEnabled(chromeos::features::kSplitSettings)) {
     html_source->AddLocalizedString("aboutGetHelpUsingChrome",
                                     IDS_SETTINGS_GET_HELP_USING_CHROME);
diff --git a/chrome/browser/web_launch/OWNERS b/chrome/browser/web_launch/OWNERS
new file mode 100644
index 0000000..bdeb672
--- /dev/null
+++ b/chrome/browser/web_launch/OWNERS
@@ -0,0 +1 @@
+file://third_party/blink/renderer/modules/launch/OWNERS
diff --git a/chrome/browser/web_launch/web_launch_files_helper.cc b/chrome/browser/web_launch/web_launch_files_helper.cc
new file mode 100644
index 0000000..452fc4d
--- /dev/null
+++ b/chrome/browser/web_launch/web_launch_files_helper.cc
@@ -0,0 +1,130 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_launch/web_launch_files_helper.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/task/post_task.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/storage_partition.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_user_data.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom.h"
+#include "url/origin.h"
+
+namespace {
+
+// Converts |paths| to |NativeFileSystemEntries|, which can be manipulated by
+// |context|. Must be called on IO thread.
+std::vector<blink::mojom::NativeFileSystemEntryPtr> GetEntries(
+    scoped_refptr<content::NativeFileSystemEntryFactory> entry_factory,
+    content::NativeFileSystemEntryFactory::BindingContext context,
+    std::vector<base::FilePath> paths) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+  DCHECK(entry_factory);
+
+  std::vector<blink::mojom::NativeFileSystemEntryPtr> launch_entries;
+  launch_entries.reserve(paths.size());
+
+  for (const auto& path : paths) {
+    launch_entries.push_back(
+        entry_factory->CreateFileEntryFromPath(context, path));
+  }
+
+  return launch_entries;
+}
+
+}  // namespace
+
+namespace web_launch {
+
+WEB_CONTENTS_USER_DATA_KEY_IMPL(WebLaunchFilesHelper)
+
+// static
+void WebLaunchFilesHelper::SetLaunchPaths(
+    content::WebContents* web_contents,
+    const GURL& launch_url,
+    std::vector<base::FilePath> launch_paths) {
+  if (launch_paths.size() == 0)
+    return;
+
+  web_contents->SetUserData(
+      UserDataKey(), std::make_unique<WebLaunchFilesHelper>(
+                         web_contents, launch_url, std::move(launch_paths)));
+}
+
+void WebLaunchFilesHelper::DidFinishNavigation(
+    content::NavigationHandle* handle) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  // Currently, launch data is only sent for the main frame.
+  if (!handle->IsInMainFrame())
+    return;
+
+  MaybeSendLaunchEntries();
+}
+
+WebLaunchFilesHelper::WebLaunchFilesHelper(
+    content::WebContents* web_contents,
+    const GURL& launch_url,
+    std::vector<base::FilePath> launch_paths)
+    : content::WebContentsObserver(web_contents), launch_url_(launch_url) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(launch_paths.size());
+
+  scoped_refptr<content::NativeFileSystemEntryFactory> entry_factory =
+      web_contents->GetMainFrame()
+          ->GetProcess()
+          ->GetStoragePartition()
+          ->GetNativeFileSystemEntryFactory();
+
+  content::NativeFileSystemEntryFactory::BindingContext context(
+      url::Origin::Create(launch_url),
+      web_contents->GetMainFrame()->GetProcess()->GetID(),
+      web_contents->GetMainFrame()->GetRoutingID());
+
+  base::PostTaskWithTraitsAndReplyWithResult(
+      FROM_HERE, {content::BrowserThread::IO},
+      base::BindOnce(&GetEntries, std::move(entry_factory), std::move(context),
+                     std::move(launch_paths)),
+      base::BindOnce(&WebLaunchFilesHelper::SetLaunchEntries,
+                     weak_ptr_factory.GetWeakPtr()));
+}
+WebLaunchFilesHelper::~WebLaunchFilesHelper() = default;
+
+void WebLaunchFilesHelper::SetLaunchEntries(
+    std::vector<blink::mojom::NativeFileSystemEntryPtr> launch_entries) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  launch_entries_ = std::move(launch_entries);
+  MaybeSendLaunchEntries();
+}
+
+void WebLaunchFilesHelper::MaybeSendLaunchEntries() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (launch_entries_.size() == 0)
+    return;
+  if (launch_url_ != web_contents()->GetLastCommittedURL())
+    return;
+
+  blink::mojom::WebLaunchServiceAssociatedPtr launch_service;
+  web_contents()->GetMainFrame()->GetRemoteAssociatedInterfaces()->GetInterface(
+      &launch_service);
+  DCHECK(launch_service);
+  launch_service->SetLaunchFiles(std::move(launch_entries_));
+
+  // LaunchParams are sent, clean up.
+  web_contents()->RemoveUserData(UserDataKey());
+}
+
+}  // namespace web_launch
diff --git a/chrome/browser/web_launch/web_launch_files_helper.h b/chrome/browser/web_launch/web_launch_files_helper.h
new file mode 100644
index 0000000..454b8f0
--- /dev/null
+++ b/chrome/browser/web_launch/web_launch_files_helper.h
@@ -0,0 +1,77 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_LAUNCH_WEB_LAUNCH_FILES_HELPER_H_
+#define CHROME_BROWSER_WEB_LAUNCH_WEB_LAUNCH_FILES_HELPER_H_
+
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/native_file_system_entry_factory.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-forward.h"
+#include "third_party/blink/public/mojom/web_launch/web_launch.mojom.h"
+#include "url/gurl.h"
+
+namespace content {
+
+class WebContents;
+class NavigationHandle;
+
+}  // namespace content
+
+namespace web_launch {
+
+// A helper for sending launch paths to the renderer process.
+// Launch files cannot be sent immediately for two reasons:
+// 1) Creating NativeFileSystemFileEntries has to happen on the IO thread.
+// 2) The data is stored on a document for |launch_url_|, which is not created
+// until |launch_url_| is committed.
+//
+// Note: The lifetime of this class is tied to the WebContents it is attached
+// to. However, in general it will be destroyed before the WebContents, when the
+// helper sends the NativeFileSystemEntries to the renderer.
+class WebLaunchFilesHelper
+    : public content::WebContentsObserver,
+      public content::WebContentsUserData<WebLaunchFilesHelper> {
+ public:
+  WEB_CONTENTS_USER_DATA_KEY_DECL();
+  static void SetLaunchPaths(content::WebContents* web_contents,
+                             const GURL& launch_url,
+                             std::vector<base::FilePath> launch_paths);
+
+  WebLaunchFilesHelper(content::WebContents* web_contents,
+                       const GURL& launch_url,
+                       std::vector<base::FilePath> launch_paths);
+  ~WebLaunchFilesHelper() override;
+
+  // content::WebContentsObserver:
+  void DidFinishNavigation(content::NavigationHandle* handle) override;
+
+ private:
+  // Callback which fires when launch entries have been created.
+  void SetLaunchEntries(
+      std::vector<blink::mojom::NativeFileSystemEntryPtr> launch_entries);
+
+  // Sends the launch entries to the renderer if they have been created and the
+  // renderer is ready to receive them.
+  void MaybeSendLaunchEntries();
+
+  // The entries causing the launch (may be empty).
+  std::vector<blink::mojom::NativeFileSystemEntryPtr> launch_entries_;
+
+  // The url the launch entries are for.
+  GURL launch_url_;
+
+  base::WeakPtrFactory<WebLaunchFilesHelper> weak_ptr_factory{this};
+  DISALLOW_COPY_AND_ASSIGN(WebLaunchFilesHelper);
+};
+
+}  // namespace web_launch
+
+#endif  // CHROME_BROWSER_WEB_LAUNCH_WEB_LAUNCH_FILES_HELPER_H_
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index 9c40a2ec..a26e26a 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -131,6 +131,10 @@
 }
 
 void AuthenticatorRequestDialogModel::StartOver() {
+  if (!request_may_start_over_) {
+    NOTREACHED();
+    return;
+  }
   ephemeral_state_.Reset();
 
   for (auto& observer : observers_)
@@ -215,8 +219,13 @@
     return;
   }
 
-  // There is no AuthenticatorReference for the Windows authenticator,
-  // hence directly call DispatchRequestAsyncInternal here.
+  // The StartOver() logic does not work in combination with the Windows API.
+  // Therefore do not show a retry button on any error sheet shown after the
+  // Windows API call returns.
+  request_may_start_over_ = false;
+
+  // There is no AuthenticatorReference for the Windows authenticator, hence
+  // directly call DispatchRequestAsyncInternal here.
   DispatchRequestAsyncInternal(
       transport_availability()->win_native_api_authenticator_id);
 
@@ -585,9 +594,10 @@
 
 void AuthenticatorRequestDialogModel::UpdateAuthenticatorReferencePairingMode(
     base::StringPiece authenticator_id,
-    bool is_in_pairing_mode) {
+    bool is_in_pairing_mode,
+    base::string16 display_name) {
   ephemeral_state_.saved_authenticators_.ChangeAuthenticatorPairingMode(
-      authenticator_id, is_in_pairing_mode);
+      authenticator_id, is_in_pairing_mode, display_name);
 }
 
 // SelectAccount is called to trigger an account selection dialog.
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h
index 83f67e16..572e639 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -367,7 +367,8 @@
 
   void UpdateAuthenticatorReferencePairingMode(
       base::StringPiece authenticator_id,
-      bool is_in_pairing_mode);
+      bool is_in_pairing_mode,
+      base::string16 display_name);
 
   // SelectAccount is called to trigger an account selection dialog.
   void SelectAccount(
@@ -421,6 +422,8 @@
 
   const std::string& relying_party_id() const { return relying_party_id_; }
 
+  bool request_may_start_over() const { return request_may_start_over_; }
+
  private:
   // Contains the state that will be reset when calling StartOver(). StartOver()
   // might be called at an arbitrary point of execution.
@@ -494,6 +497,11 @@
 
   bool incognito_mode_ = false;
 
+  // request_may_start_over_ indicates whether a button to retry the request
+  // should be included on the dialog sheet shown when encountering certain
+  // errors.
+  bool request_may_start_over_ = true;
+
   base::WeakPtrFactory<AuthenticatorRequestDialogModel> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(AuthenticatorRequestDialogModel);
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index 6944e1f..76a6bc64 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -125,12 +125,24 @@
 }
 
 bool ChromeAuthenticatorRequestDelegate::DoesBlockRequestOnFailure(
+    const ::device::FidoAuthenticator* authenticator,
     InterestingFailureReason reason) {
   if (!IsWebAuthnUIEnabled())
     return false;
   if (!weak_dialog_model_)
     return false;
 
+  DCHECK(authenticator || reason == InterestingFailureReason::kTimeout);
+
+#if defined(OS_WIN)
+  if (authenticator && authenticator->IsWinNativeApiAuthenticator()) {
+    // Do not display a Chrome error dialog if the user cancels out of the
+    // Windows UI. No other errors are reachable.
+    DCHECK(reason == InterestingFailureReason::kUserConsentDenied);
+    return false;
+  }
+#endif  // defined(OS_WIN)
+
   switch (reason) {
     case InterestingFailureReason::kTimeout:
       weak_dialog_model_->OnRequestTimeout();
@@ -230,7 +242,6 @@
     std::move(callback).Run(true);
     return;
   }
-
 #endif  // defined(OS_WIN)
 
   weak_dialog_model_->RequestAttestationPermission(std::move(callback));
@@ -422,12 +433,13 @@
 
 void ChromeAuthenticatorRequestDelegate::FidoAuthenticatorPairingModeChanged(
     base::StringPiece authenticator_id,
-    bool is_in_pairing_mode) {
+    bool is_in_pairing_mode,
+    base::string16 display_name) {
   if (!weak_dialog_model_)
     return;
 
   weak_dialog_model_->UpdateAuthenticatorReferencePairingMode(
-      authenticator_id, is_in_pairing_mode);
+      authenticator_id, is_in_pairing_mode, display_name);
 }
 
 void ChromeAuthenticatorRequestDelegate::BluetoothAdapterPowerChanged(
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
index 1bc70d5..a5635db 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
@@ -61,7 +61,9 @@
   AuthenticatorRequestDialogModel* WeakDialogModelForTesting() const;
 
   // content::AuthenticatorRequestClientDelegate:
-  bool DoesBlockRequestOnFailure(InterestingFailureReason reason) override;
+  bool DoesBlockRequestOnFailure(
+      const ::device::FidoAuthenticator* authenticator,
+      InterestingFailureReason reason) override;
   void RegisterActionCallbacks(
       base::OnceClosure cancel_callback,
       base::Closure start_over_callback,
@@ -97,8 +99,10 @@
   void FidoAuthenticatorRemoved(base::StringPiece authenticator_id) override;
   void FidoAuthenticatorIdChanged(base::StringPiece old_authenticator_id,
                                   std::string new_authenticator_id) override;
-  void FidoAuthenticatorPairingModeChanged(base::StringPiece authenticator_id,
-                                           bool is_in_pairing_mode) override;
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id,
+      bool is_in_pairing_mode,
+      base::string16 display_name) override;
   void BluetoothAdapterPowerChanged(bool is_powered_on) override;
   bool SupportsPIN() const override;
   void CollectPIN(
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
index 5c4653c..2b130e2 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
@@ -10,6 +10,7 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/test/web_contents_tester.h"
+#include "device/fido/fido_device_authenticator.h"
 #include "device/fido/test_callback_receiver.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -116,14 +117,14 @@
 #endif
 
 #if defined(OS_WIN)
+// Tests that ShouldReturnAttestation() returns with true if |authenticator|
+// is the Windows native WebAuthn API with WEBAUTHN_API_VERSION_2 or higher,
+// where Windows prompts for attestation in its own native UI.
+//
+// Ideally, this would also test the inverse case, i.e. that with
+// WEBAUTHN_API_VERSION_1 Chrome's own attestation prompt is shown. However,
+// there seems to be no good way to test AuthenticatorRequestDialogModel UI.
 TEST_F(ChromeAuthenticatorRequestDelegateTest, ShouldPromptForAttestationWin) {
-  // Test that ShouldReturnAttestation() returns with true if |authenticator|
-  // is the Windows native WebAuthn API with WEBAUTHN_API_VERSION_2 or higher,
-  // where Windows prompts for attestation in its own native UI.
-  //
-  // Ideally, this would also test the inverse case, i.e. that with
-  // WEBAUTHN_API_VERSION_1 Chrome's own attestation prompt is shown. However,
-  // there seems to be no good way to test AuthenticatorRequestDialogModel UI.
   ::device::ScopedFakeWinWebAuthnApi win_webauthn_api;
   win_webauthn_api.set_version(WEBAUTHN_API_VERSION_2);
   ::device::WinWebAuthnApiAuthenticator authenticator(
@@ -136,4 +137,29 @@
   cb.WaitForCallback();
   EXPECT_EQ(cb.value(), true);
 }
+
+// Ensures that DoesBlockOnRequestFailure() returns false if |authenticator|
+// is the Windows native WebAuthn API because Chrome's request dialog UI
+// should not show an error sheet after the user cancels out of the native
+// Windows UI.
+TEST_F(ChromeAuthenticatorRequestDelegateTest, DoesBlockRequestOnFailure) {
+  ::device::ScopedFakeWinWebAuthnApi win_webauthn_api;
+  ::device::WinWebAuthnApiAuthenticator win_authenticator(
+      /*current_window=*/nullptr);
+  ::device::FidoDeviceAuthenticator device_authenticator(/*device=*/nullptr);
+
+  for (const bool use_win_api : {false, true}) {
+    SCOPED_TRACE(::testing::Message() << "use_win_api=" << use_win_api);
+
+    ChromeAuthenticatorRequestDelegate delegate(main_rfh(), kRelyingPartyID);
+    EXPECT_EQ(delegate.DoesBlockRequestOnFailure(
+                  use_win_api ? static_cast<::device::FidoAuthenticator*>(
+                                    &win_authenticator)
+                              : static_cast<::device::FidoAuthenticator*>(
+                                    &device_authenticator),
+                  ChromeAuthenticatorRequestDelegate::InterestingFailureReason::
+                      kUserConsentDenied),
+              !use_win_api);
+  }
+}
 #endif  // defined(OS_WIN)
diff --git a/chrome/browser/webauthn/observable_authenticator_list.cc b/chrome/browser/webauthn/observable_authenticator_list.cc
index ccc7f06..4751f1e 100644
--- a/chrome/browser/webauthn/observable_authenticator_list.cc
+++ b/chrome/browser/webauthn/observable_authenticator_list.cc
@@ -55,12 +55,14 @@
 
 void ObservableAuthenticatorList::ChangeAuthenticatorPairingMode(
     base::StringPiece authenticator_id,
-    bool is_in_pairing_mode) {
+    bool is_in_pairing_mode,
+    base::string16 display_name) {
   auto it = GetAuthenticatorIterator(authenticator_id);
   if (it == authenticator_list_.end())
     return;
 
   it->is_in_pairing_mode = is_in_pairing_mode;
+  it->authenticator_display_name = std::move(display_name);
   if (observer_)
     observer_->OnAuthenticatorPairingModeChanged(*it);
 }
diff --git a/chrome/browser/webauthn/observable_authenticator_list.h b/chrome/browser/webauthn/observable_authenticator_list.h
index 03ad7cc..4d2c49a 100644
--- a/chrome/browser/webauthn/observable_authenticator_list.h
+++ b/chrome/browser/webauthn/observable_authenticator_list.h
@@ -29,7 +29,8 @@
   void RemoveAllAuthenticators();
   void ChangeAuthenticatorId(base::StringPiece previous_id, std::string new_id);
   void ChangeAuthenticatorPairingMode(base::StringPiece authenticator_id,
-                                      bool is_in_pairing_mode);
+                                      bool is_in_pairing_mode,
+                                      base::string16 display_name);
   AuthenticatorReference* GetAuthenticator(base::StringPiece authenticator_id);
 
   void SetObserver(AuthenticatorListObserver* observer);
diff --git a/chrome/browser/win/OWNERS b/chrome/browser/win/OWNERS
index 0a65245d..3b19734 100644
--- a/chrome/browser/win/OWNERS
+++ b/chrome/browser/win/OWNERS
@@ -7,4 +7,4 @@
 per-file chrome_elf_init*=file://chrome/chrome_elf/OWNERS
 per-file enumerate_modules_model*=finnur@chromium.org
 
-# COMPONENT: Internals>Core
+# COMPONENT: Internals>PlatformIntegration
diff --git a/chrome/child/OWNERS b/chrome/child/OWNERS
new file mode 100644
index 0000000..3605f481
--- /dev/null
+++ b/chrome/child/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>Core
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 758100d..bcd14c5 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -665,7 +665,7 @@
 
 // Enables or disables the App Management UI.
 const base::Feature kAppManagement{"AppManagement",
-                                   base::FEATURE_ENABLED_BY_DEFAULT};
+                                   base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Disable downloads of unsafe file types over insecure transports if initiated
 // from a secure page
diff --git a/chrome/common/mac/OWNERS b/chrome/common/mac/OWNERS
index ada22cb..1a105278 100644
--- a/chrome/common/mac/OWNERS
+++ b/chrome/common/mac/OWNERS
@@ -12,3 +12,4 @@
 per-file *.mojom=file://ipc/SECURITY_OWNERS
 per-file *.typemap=set noparent
 per-file *.typemap=file://ipc/SECURITY_OWNERS
+# COMPONENT: UI>Browser>WebAppInstalls
diff --git a/chrome/common/media/OWNERS b/chrome/common/media/OWNERS
index d8469177..36ba8f37 100644
--- a/chrome/common/media/OWNERS
+++ b/chrome/common/media/OWNERS
@@ -3,3 +3,5 @@
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+# COMPONENT: Internals>Media>Encrypted
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index dd4cc1f0..c63a4e48 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -913,6 +913,10 @@
 // Last time that the kChildScreenTime pref was reset.
 const char kLastChildScreenTimeReset[] = "last_child_screen_time_reset";
 
+// Last patch on which patch notes were shown.
+const char kReleaseNotesLastShownMilestone[] =
+    "last_release_notes_shown_milestone";
+
 // Boolean pref indicating whether the NTLM authentication protocol should be
 // enabled when mounting an SMB share with a user credential by the Network File
 // Shares for Chrome OS feature.
@@ -2052,6 +2056,8 @@
     "auto_screen_brightness.metrics.atlas_user_adjustment_count";
 const char kAutoScreenBrightnessMetricsEveUserAdjustmentCount[] =
     "auto_screen_brightness.metrics.eve_user_adjustment_count";
+const char kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount[] =
+    "auto_screen_brightness.metrics.nocturne_user_adjustment_count";
 const char kAutoScreenBrightnessMetricsNoAlsUserAdjustmentCount[] =
     "auto_screen_brightness.metrics.no_als_user_adjustment_count";
 const char kAutoScreenBrightnessMetricsSupportedAlsUserAdjustmentCount[] =
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index be7a19a..85406f8 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -297,6 +297,7 @@
 extern const char kChildScreenTimeMilliseconds[];
 extern const char kLastChildScreenTimeSaved[];
 extern const char kLastChildScreenTimeReset[];
+extern const char kReleaseNotesLastShownMilestone[];
 extern const char kNTLMShareAuthenticationEnabled[];
 extern const char kNetworkFileSharesPreconfiguredShares[];
 extern const char kMostRecentlyUsedNetworkFileShareURL[];
@@ -670,6 +671,7 @@
 extern const char kAutoScreenBrightnessMetricsDailySample[];
 extern const char kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount[];
 extern const char kAutoScreenBrightnessMetricsEveUserAdjustmentCount[];
+extern const char kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount[];
 extern const char kAutoScreenBrightnessMetricsNoAlsUserAdjustmentCount[];
 extern const char kAutoScreenBrightnessMetricsSupportedAlsUserAdjustmentCount[];
 extern const char
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index 285e851..27ccc82 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -37,6 +37,10 @@
 const char kChromeBetaForumURL[] =
     "https://support.google.com/chrome/?p=beta_forum";
 
+// TODO: replace w/link after marketing provides it.
+const char kChromeReleaseNotesURL[] =
+    "https://www.google.com/chromebook/whatsnew/embedded/";
+
 const char kChromeHelpViaKeyboardURL[] =
 #if defined(OS_CHROMEOS)
 #if defined(GOOGLE_CHROME_BUILD)
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index 0f32538..fa4d8bc 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -56,6 +56,9 @@
 // Link to the forum for Chrome Beta.
 extern const char kChromeBetaForumURL[];
 
+// Link to the release notes page managed by marketing.
+extern const char kChromeReleaseNotesURL[];
+
 // General help links for Chrome, opened using various actions.
 extern const char kChromeHelpViaKeyboardURL[];
 extern const char kChromeHelpViaMenuURL[];
diff --git a/chrome/common/win/OWNERS b/chrome/common/win/OWNERS
new file mode 100644
index 0000000..5bbda7a
--- /dev/null
+++ b/chrome/common/win/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Platform>Apps>API>Windows
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index a8adf787..4f3ed79d 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -143,12 +143,12 @@
     "//components/omnibox/common",
     "//components/page_image_annotation/content/renderer",
     "//components/plugins/renderer",
-    "//components/rappor/public/interfaces",
+    "//components/rappor/public/mojom",
     "//components/resources:components_resources",
     "//components/safe_browsing/common:interfaces",
     "//components/safe_browsing/renderer:throttles",
     "//components/security_interstitials/core:",
-    "//components/security_interstitials/core/common/interfaces:",
+    "//components/security_interstitials/core/common/mojom:",
     "//components/spellcheck:buildflags",
     "//components/startup_metric_utils/common:interfaces",
     "//components/subresource_filter/content/renderer",
diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS
index a8c1b1c..d1326330 100644
--- a/chrome/renderer/DEPS
+++ b/chrome/renderer/DEPS
@@ -30,7 +30,7 @@
   "+components/plugins/renderer",
   "+components/printing/common",
   "+components/printing/renderer",
-  "+components/rappor/public/interfaces",
+  "+components/rappor/public/mojom",
   "+components/safe_browsing/common",
   "+components/safe_browsing/features.h",
   "+components/safe_browsing/renderer",
diff --git a/chrome/renderer/OWNERS b/chrome/renderer/OWNERS
index 2cd7526..bb7dc0a 100644
--- a/chrome/renderer/OWNERS
+++ b/chrome/renderer/OWNERS
@@ -12,3 +12,4 @@
 per-file chrome_content_renderer_client.cc=*
 per-file chrome_content_renderer_client.h=*
 per-file chrome_content_renderer_client_unittest.cc=*
+# COMPONENT: Internals>Services>Network
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index d351fc3..c5b898da 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -20,7 +20,7 @@
 #include "chrome/common/plugin.mojom.h"
 #include "chrome/renderer/media/chrome_key_systems_provider.h"
 #include "components/nacl/common/buildflags.h"
-#include "components/rappor/public/interfaces/rappor_recorder.mojom.h"
+#include "components/rappor/public/mojom/rappor_recorder.mojom.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_thread.h"
diff --git a/chrome/renderer/extensions/OWNERS b/chrome/renderer/extensions/OWNERS
index 1c7ec65..60dc5a8 100644
--- a/chrome/renderer/extensions/OWNERS
+++ b/chrome/renderer/extensions/OWNERS
@@ -4,3 +4,4 @@
 per-file automation_internal_custom_bindings*=file://ui/accessibility/OWNERS
 
 # COMPONENT: Platform>Extensions
+# TEAM: extensions-reviews@chromium.org
diff --git a/chrome/renderer/net/DEPS b/chrome/renderer/net/DEPS
index 113d2f9a..2359825 100644
--- a/chrome/renderer/net/DEPS
+++ b/chrome/renderer/net/DEPS
@@ -2,6 +2,6 @@
   "+components/error_page/renderer",
   "+components/offline_pages/core",
   "+components/security_interstitials/core",
-  "+components/security_interstitials/core/common/interfaces",
+  "+components/security_interstitials/core/common/mojom",
   "+gin",
 ]
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index a3e8c98..de28dbe 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -32,7 +32,7 @@
 #include "components/error_page/common/net_error_info.h"
 #include "components/grit/components_resources.h"
 #include "components/offline_pages/core/offline_page_feature.h"
-#include "components/security_interstitials/core/common/interfaces/interstitial_commands.mojom.h"
+#include "components/security_interstitials/core/common/mojom/interstitial_commands.mojom.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/url_constants.h"
diff --git a/chrome/services/app_service/OWNERS b/chrome/services/app_service/OWNERS
index be3d0805..fc5c3bf 100644
--- a/chrome/services/app_service/OWNERS
+++ b/chrome/services/app_service/OWNERS
@@ -1,3 +1,5 @@
 benwells@chromium.org
 dominickn@chromium.org
 nigeltao@chromium.org
+
+# COMPONENT: Platform>Apps>Foundation
diff --git a/chrome/services/cups_ipp_parser/OWNERS b/chrome/services/cups_ipp_parser/OWNERS
index 5a872c7..19a3181 100644
--- a/chrome/services/cups_ipp_parser/OWNERS
+++ b/chrome/services/cups_ipp_parser/OWNERS
@@ -1,2 +1,3 @@
 luum@chromium.org
 skau@chromium.org
+# COMPONENT: Internals>Printing>CUPS
diff --git a/chrome/services/file_util/OWNERS b/chrome/services/file_util/OWNERS
new file mode 100644
index 0000000..85d233d
--- /dev/null
+++ b/chrome/services/file_util/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Services>Safebrowsing
diff --git a/chrome/services/removable_storage_writer/OWNERS b/chrome/services/removable_storage_writer/OWNERS
index e69de29..eaf0589 100644
--- a/chrome/services/removable_storage_writer/OWNERS
+++ b/chrome/services/removable_storage_writer/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>Services
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 8dc72ce1..512ebddb 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1823,6 +1823,7 @@
         "../browser/ui/views/page_action/pwa_install_view_browsertest.cc",
         "../browser/ui/views/page_action/zoom_view_browsertest.cc",
         "../browser/ui/views/page_info/page_info_bubble_view_browsertest.cc",
+        "../browser/ui/views/page_info/page_info_bubble_view_sync_browsertest.cc",
         "../browser/ui/views/passwords/password_bubble_browsertest.cc",
         "../browser/ui/views/passwords/password_dialog_view_browsertest.cc",
         "../browser/ui/views/passwords/password_generation_popup_view_tester_views.cc",
@@ -2307,6 +2308,7 @@
         "../browser/safe_browsing/ad_redirect_trigger_browsertest.cc",
         "../browser/safe_browsing/certificate_reporting_service_browsertest.cc",
         "../browser/safe_browsing/chrome_password_protection_service_browsertest.cc",
+        "../browser/safe_browsing/chrome_password_protection_service_sync_browsertest.cc",
         "../browser/safe_browsing/client_side_detection_host_browsertest.cc",
         "../browser/safe_browsing/safe_browsing_blocking_page_test.cc",
         "../browser/safe_browsing/safe_browsing_navigation_observer_browsertest.cc",
@@ -4957,7 +4959,6 @@
   if (enable_app_list) {
     sources += [
       "../browser/ui/app_list/app_context_menu_unittest.cc",
-      "../browser/ui/app_list/app_launch_event_logger_unittest.cc",
       "../browser/ui/app_list/app_list_syncable_service_unittest.cc",
       "../browser/ui/app_list/app_list_test_util.cc",
       "../browser/ui/app_list/app_list_test_util.h",
@@ -4979,6 +4980,7 @@
       "../browser/ui/app_list/search/arc/arc_app_shortcuts_search_provider_unittest.cc",
       "../browser/ui/app_list/search/arc/arc_playstore_search_provider_unittest.cc",
       "../browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader_unittest.cc",
+      "../browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_launch_predictor_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_list_launch_metrics_provider_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_search_result_ranker_unittest.cc",
diff --git a/chrome/test/OWNERS b/chrome/test/OWNERS
index 4760712..879ea43 100644
--- a/chrome/test/OWNERS
+++ b/chrome/test/OWNERS
@@ -1,2 +1,3 @@
 # If you're doing structural changes get a review from one of the OWNERS.
 per-file BUILD.gn=*
+# COMPONENT: Tests
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index cee545d..72250418 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3679,6 +3679,14 @@
     ]
   },
 
+  "VmManagementCliAllowed": {
+    "os": ["chromeos"],
+    "test_policy": { "VmManagementCliAllowed": false },
+    "pref_mappings": [
+      { "pref": "crostini.vm_management_cli_allowed_by_policy" }
+    ]
+  },
+
   "----- Chrome OS device policies ---------------------------------------": {},
 
   "DevicePolicyRefreshRate": {
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 6faa4fe..54f26bae 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -82,10 +82,6 @@
     "webui_resource_async_browsertest.js",
   ]
 
-  if (!optimize_webui) {
-    sources += [ "js/webui_resource_module_async_browsertest.js" ]
-  }
-
   extra_js_files = [
     "test_browser_proxy.js",
     "settings/test_password_manager_proxy.js",
diff --git a/chrome/test/data/webui/app_management/arc_permission_view_test.js b/chrome/test/data/webui/app_management/arc_permission_view_test.js
index 0c08a9b..ebeeafa 100644
--- a/chrome/test/data/webui/app_management/arc_permission_view_test.js
+++ b/chrome/test/data/webui/app_management/arc_permission_view_test.js
@@ -19,12 +19,12 @@
 
   async function clickPermissionToggle(permissionType) {
     getPermissionCrToggleByType(arcPermissionView, permissionType).click();
-    await fakeHandler.$.flushForTesting();
+    await fakeHandler.flushPipesForTesting();
   }
 
   async function clickPermissionItem(permissionType) {
     getPermissionItemByType(arcPermissionView, permissionType).click();
-    await fakeHandler.$.flushForTesting();
+    await fakeHandler.flushPipesForTesting();
   }
 
   setup(async () => {
diff --git a/chrome/test/data/webui/app_management/metadata_view_test.js b/chrome/test/data/webui/app_management/metadata_view_test.js
index bea62ca..cc3e52d 100644
--- a/chrome/test/data/webui/app_management/metadata_view_test.js
+++ b/chrome/test/data/webui/app_management/metadata_view_test.js
@@ -49,7 +49,7 @@
 
         // Toggle from false to true.
         toggle.click();
-        await fakeHandler.$.flushForTesting();
+        await fakeHandler.flushPipesForTesting();
 
         // Check that the isPinned field of the app has changed.
         expectEquals(OptionalBool.kTrue, metadataView.app_.isPinned);
@@ -59,7 +59,7 @@
 
         // Toggle from true to false.
         toggle.click();
-        await fakeHandler.$.flushForTesting();
+        await fakeHandler.flushPipesForTesting();
 
         // Check that the isPinned field of the app has changed.
         expectEquals(OptionalBool.kFalse, metadataView.app_.isPinned);
diff --git a/chrome/test/data/webui/app_management/pwa_permission_view_test.js b/chrome/test/data/webui/app_management/pwa_permission_view_test.js
index cfc030f..218cc5dc 100644
--- a/chrome/test/data/webui/app_management/pwa_permission_view_test.js
+++ b/chrome/test/data/webui/app_management/pwa_permission_view_test.js
@@ -22,7 +22,7 @@
 
   async function clickToggle(permissionType) {
     getPermissionToggleByType(permissionType).click();
-    await fakeHandler.$.flushForTesting();
+    await fakeHandler.flushPipesForTesting();
   }
 
   setup(async function() {
diff --git a/chrome/test/data/webui/app_management/test_util.js b/chrome/test/data/webui/app_management/test_util.js
index fb3e753b..fd2878d7 100644
--- a/chrome/test/data/webui/app_management/test_util.js
+++ b/chrome/test/data/webui/app_management/test_util.js
@@ -19,10 +19,9 @@
  */
 function setupFakeHandler() {
   const browserProxy = app_management.BrowserProxy.getInstance();
-  const callbackRouterProxy = browserProxy.callbackRouter.$.createProxy();
-
-  const fakeHandler = new app_management.FakePageHandler(callbackRouterProxy);
-  browserProxy.handler = fakeHandler;
+  const fakeHandler = new app_management.FakePageHandler(
+      browserProxy.callbackRouter.$.bindNewPipeAndPassRemote());
+  browserProxy.handler = fakeHandler.getRemote();
 
   return fakeHandler;
 }
diff --git a/chrome/test/data/webui/js/cr_test.js b/chrome/test/data/webui/js/cr_test.js
deleted file mode 100644
index bfc3c2a..0000000
--- a/chrome/test/data/webui/js/cr_test.js
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2019 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 {addSingletonGetter, addWebUIListener, removeWebUIListener, sendWithPromise, webUIListenerCallback, webUIResponse} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-
-/** @type {string} Name of the chrome.send() message to be used in tests. */
-const CHROME_SEND_NAME = 'echoMessage';
-
-suite('CrModuleSendWithPromiseTest', function() {
-  let rejectPromises = false;
-
-  function whenChromeSendCalled(name) {
-    return new Promise(function(resolve, reject) {
-      registerMessageCallback(name, null, resolve);
-    });
-  }
-
-  /** @override */
-  setup(function() {
-    // Simulate a WebUI handler that echoes back all parameters passed to it.
-    // Rejects the promise depending on |rejectPromises|.
-    whenChromeSendCalled(CHROME_SEND_NAME).then(function(args) {
-      var callbackId = args[0];
-      webUIResponse.apply(
-          null, [callbackId, !rejectPromises].concat(args.slice(1)));
-    });
-  });
-
-  /** @override */
-  teardown(function() {
-    rejectPromises = false;
-  });
-
-  test('ResponseObject', function() {
-    var expectedResponse = {'foo': 'bar'};
-    return sendWithPromise(CHROME_SEND_NAME, expectedResponse)
-        .then(function(response) {
-          assertEquals(
-              JSON.stringify(expectedResponse), JSON.stringify(response));
-        });
-  });
-
-  test('ResponseArray', function() {
-    var expectedResponse = ['foo', 'bar'];
-    return sendWithPromise(CHROME_SEND_NAME, expectedResponse)
-        .then(function(response) {
-          assertEquals(
-              JSON.stringify(expectedResponse), JSON.stringify(response));
-        });
-  });
-
-  test('ResponsePrimitive', function() {
-    var expectedResponse = 1234;
-    return sendWithPromise(CHROME_SEND_NAME, expectedResponse)
-        .then(function(response) {
-          assertEquals(expectedResponse, response);
-        });
-  });
-
-  test('ResponseVoid', function() {
-    return sendWithPromise(CHROME_SEND_NAME).then(function(response) {
-      assertEquals(undefined, response);
-    });
-  });
-
-  test('Reject', function() {
-    rejectPromises = true;
-    var expectedResponse = 1234;
-    return sendWithPromise(CHROME_SEND_NAME, expectedResponse)
-        .then(
-            function() {
-              assertNotReached('should have rejected promise');
-            },
-            function(error) {
-              assertEquals(expectedResponse, error);
-            });
-  });
-});
-
-suite('CrModuleAddSingletonGetterTest', function() {
-  test('addSingletonGetter', function() {
-    function Foo() {}
-    addSingletonGetter(Foo);
-
-    assertEquals(
-        'function', typeof Foo.getInstance, 'Should add get instance function');
-
-    var x = Foo.getInstance();
-    assertEquals('object', typeof x, 'Should successfully create an object');
-    assertNotEquals(null, x, 'Created object should not be null');
-
-    var y = Foo.getInstance();
-    assertEquals(x, y, 'Should return the same object');
-
-    delete Foo.instance_;
-
-    var z = Foo.getInstance();
-    assertEquals('object', typeof z, 'Should work after clearing for testing');
-    assertNotEquals(null, z, 'Created object should not be null');
-
-    assertNotEquals(
-        x, z, 'Should return a different object after clearing for testing');
-  });
-});
-
-suite('CrModuleWebUIListenersTest', function() {
-  var listener1 = null;
-  var listener2 = null;
-
-  /** @const {string} */
-  var EVENT_NAME = 'my-foo-event';
-
-  teardown(function() {
-    if (listener1) {
-      removeWebUIListener(listener1);
-    }
-    if (listener2) {
-      removeWebUIListener(listener2);
-    }
-  });
-
-  test('removeWebUIListener', function() {
-    listener1 = addWebUIListener(EVENT_NAME, function() {});
-    assertTrue(removeWebUIListener(listener1));
-    assertFalse(removeWebUIListener(listener1));
-    assertFalse(removeWebUIListener({
-      eventName: 'non-existing-event',
-      uid: 12345,
-    }));
-  });
-
-  test('addWebUIListener_ResponseParams', function() {
-    var expectedString = 'foo';
-    var expectedNumber = 123;
-    var expectedArray = [1, 2];
-    var expectedObject = {};
-
-    return new Promise(function(resolve, reject) {
-      listener1 = addWebUIListener(EVENT_NAME, function(s, n, a, o) {
-        assertEquals(expectedString, s);
-        assertEquals(expectedNumber, n);
-        assertEquals(expectedArray, a);
-        assertEquals(expectedObject, o);
-        resolve();
-      });
-      webUIListenerCallback(
-          EVENT_NAME, expectedString, expectedNumber, expectedArray,
-          expectedObject);
-    });
-  });
-
-  test('addWebUIListener_NoResponseParams', function() {
-    return new Promise(function(resolve, reject) {
-      listener1 = addWebUIListener(EVENT_NAME, function() {
-        assertEquals(0, arguments.length);
-        resolve();
-      });
-      webUIListenerCallback(EVENT_NAME);
-    });
-  });
-
-  test('addWebUIListener_MulitpleListeners', function() {
-    var resolver1 = new PromiseResolver();
-    var resolver2 = new PromiseResolver();
-    listener1 = addWebUIListener(EVENT_NAME, resolver1.resolve);
-    listener2 = addWebUIListener(EVENT_NAME, resolver2.resolve);
-    webUIListenerCallback(EVENT_NAME);
-    // Check that both listeners registered are invoked.
-    return Promise.all([resolver1.promise, resolver2.promise]);
-  });
-});
diff --git a/chrome/test/data/webui/js/i18n_behavior_test.js b/chrome/test/data/webui/js/i18n_behavior_test.js
deleted file mode 100644
index a7c73bbe..0000000
--- a/chrome/test/data/webui/js/i18n_behavior_test.js
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2019 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 {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
-
-suite('I18nBehaviorModuleTest', function() {
-  const allowedByDefault = '<a href="https://google.com">Google!</a>';
-  const text = 'I\'m just text, nobody should have a problem with me!';
-  const nonBreakingSpace = 'A\u00a0B\u00a0C';  // \u00a0 is a unicode nbsp.
-
-  suiteSetup(function() {
-    window.loadTimeData.data = {
-      'allowedByDefault': allowedByDefault,
-      'customAttr': '<a is="action-link">Take action!</a>',
-      'customTag': '<x-foo>I\'m an X, foo!</x-foo>',
-      'javascriptHref': '<a href="javascript:alert(1)">teh hax</a>',
-      'script': '<script>alert(/xss/)</scr' +
-          'ipt>',
-      'text': text,
-      'nonBreakingSpace': nonBreakingSpace,
-    };
-  });
-
-  test('i18n', function() {
-    assertEquals(text, I18nBehavior.i18n('text'));
-    assertEquals(nonBreakingSpace, I18nBehavior.i18n('nonBreakingSpace'));
-
-    assertThrows(function() {
-      I18nBehavior.i18n('customAttr');
-    });
-    assertThrows(function() {
-      I18nBehavior.i18n('customTag');
-    });
-    assertThrows(function() {
-      I18nBehavior.i18n('javascriptHref');
-    });
-    assertThrows(function() {
-      I18nBehavior.i18n('script');
-    });
-  });
-
-  test('i18n advanced', function() {
-    assertEquals(
-        allowedByDefault, I18nBehavior.i18nAdvanced('allowedByDefault'));
-    I18nBehavior.i18nAdvanced('customAttr', {
-      attrs: {
-        is: function(el, val) {
-          return el.tagName == 'A' && val == 'action-link';
-        },
-      },
-    });
-    I18nBehavior.i18nAdvanced('customTag', {tags: ['X-FOO']});
-  });
-
-  test('i18n dynamic', function() {
-    var locale = 'en';
-    assertEquals(text, I18nBehavior.i18nDynamic(locale, 'text'));
-  });
-
-  test('i18n exists', function() {
-    assertTrue(I18nBehavior.i18nExists('text'));
-    assertFalse(I18nBehavior.i18nExists('missingText'));
-  });
-});
diff --git a/chrome/test/data/webui/js/load_time_data_test.js b/chrome/test/data/webui/js/load_time_data_test.js
deleted file mode 100644
index 15ae67a8..0000000
--- a/chrome/test/data/webui/js/load_time_data_test.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2019 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 'chrome://resources/js/load_time_data.m.js';
-
-suite('LoadTimeDataModuleTest', function() {
-  const loadTimeData = window.loadTimeData;
-
-  test('sanitizeInnerHtml', function() {
-    // A few tests to see that that data is being passed through. The
-    // sanitizeInnerHtml() function calls into parseHtmlSubset() which has its
-    // own tests (that don't need to be repeated here).
-    assertEquals(
-        '<a href="chrome://foo"></a>',
-        loadTimeData.sanitizeInnerHtml('<a href="chrome://foo"></a>'));
-    assertThrows(() => {
-      loadTimeData.sanitizeInnerHtml('<div></div>');
-    }, 'DIV is not supported');
-    assertEquals(
-        '<div></div>',
-        loadTimeData.sanitizeInnerHtml('<div></div>', {tags: ['div']}));
-  });
-
-  test('getStringPieces', function() {
-    const assertSubstitutedPieces = function(expected, var_args) {
-      var var_args = Array.prototype.slice.call(arguments, 1);
-      var pieces =
-          loadTimeData.getSubstitutedStringPieces.apply(loadTimeData, var_args);
-      assertDeepEquals(expected, pieces);
-
-      // Ensure output matches getStringF.
-      assertEquals(
-          loadTimeData.substituteString.apply(loadTimeData, var_args),
-          pieces.map(p => p.value).join(''));
-    };
-
-    assertSubstitutedPieces([{value: 'paper', arg: null}], 'paper');
-    assertSubstitutedPieces([{value: 'paper', arg: '$1'}], '$1', 'paper');
-
-    assertSubstitutedPieces(
-        [
-          {value: 'i think ', arg: null},
-          {value: 'paper mario', arg: '$1'},
-          {value: ' is a good game', arg: null},
-        ],
-        'i think $1 is a good game', 'paper mario');
-
-    assertSubstitutedPieces(
-        [
-          {value: 'paper mario', arg: '$1'},
-          {value: ' costs $', arg: null},
-          {value: '60', arg: '$2'},
-        ],
-        '$1 costs $$$2', 'paper mario', '60');
-
-    assertSubstitutedPieces(
-        [
-          {value: 'paper mario', arg: '$1'},
-          {value: ' costs $60', arg: null},
-        ],
-        '$1 costs $$60', 'paper mario');
-
-    assertSubstitutedPieces(
-        [
-          {value: 'paper mario', arg: '$1'},
-          {value: ' costs\n$60 ', arg: null},
-          {value: 'today', arg: '$2'},
-        ],
-        '$1 costs\n$$60 $2', 'paper mario', 'today');
-
-    assertSubstitutedPieces(
-        [
-          {value: '$$', arg: null},
-          {value: '1', arg: '$1'},
-          {value: '2', arg: '$2'},
-          {value: '1', arg: '$1'},
-          {value: '$$2', arg: null},
-          {value: '2', arg: '$2'},
-          {value: '$', arg: null},
-          {value: '1', arg: '$1'},
-          {value: '$', arg: null},
-        ],
-        '$$$$$1$2$1$$$$2$2$$$1$$', '1', '2');
-  });
-
-  test('unescapedDollarSign', function() {
-    /** @param {string} label */
-    const assertSubstitutionThrows = function(label) {
-      assertThrows(() => {
-        loadTimeData.getSubstitutedStringPieces(label);
-      }, 'Assertion failed: Unescaped $ found in localized string.');
-
-      assertThrows(() => {
-        loadTimeData.substituteString(label);
-      }, 'Assertion failed: Unescaped $ found in localized string.');
-    };
-
-    assertSubstitutionThrows('$');
-    assertSubstitutionThrows('$1$$$a2');
-    assertSubstitutionThrows('$$$');
-    assertSubstitutionThrows('a$');
-    assertSubstitutionThrows('a$\n');
-  });
-});
diff --git a/chrome/test/data/webui/js/parse_html_subset_test.js b/chrome/test/data/webui/js/parse_html_subset_test.js
deleted file mode 100644
index 97538e3..0000000
--- a/chrome/test/data/webui/js/parse_html_subset_test.js
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2019 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 {parseHtmlSubset} from 'chrome://resources/js/parse_html_subset.m.js';
-
-suite('ParseHtmlSubsetModuleTest', function() {
-  function parseAndAssertThrows() {
-    var args = arguments;
-    assertThrows(function() {
-      parseHtmlSubset.apply(null, args);
-    });
-  }
-
-  test('text', function() {
-    parseHtmlSubset('');
-    parseHtmlSubset('abc');
-    parseHtmlSubset('&nbsp;');
-  });
-
-  test('supported tags', function() {
-    parseHtmlSubset('<b>bold</b>');
-    parseHtmlSubset('Some <b>bold</b> text');
-    parseHtmlSubset('Some <strong>strong</strong> text');
-    parseHtmlSubset('<B>bold</B>');
-    parseHtmlSubset('Some <B>bold</B> text');
-    parseHtmlSubset('Some <STRONG>strong</STRONG> text');
-  });
-
-  test('invalid tags', function() {
-    parseAndAssertThrows('<unknown_tag>x</unknown_tag>');
-    parseAndAssertThrows('<img>');
-    parseAndAssertThrows(
-        '<script>alert(1)<' +
-        '/script>');
-  });
-
-  test('invalid attributes', function() {
-    parseAndAssertThrows('<b onclick="alert(1)">x</b>');
-    parseAndAssertThrows('<b style="color:red">x</b>');
-    parseAndAssertThrows('<b foo>x</b>');
-    parseAndAssertThrows('<b foo=bar></b>');
-  });
-
-  test('valid anchors', function() {
-    parseHtmlSubset('<a href="https://google.com">Google</a>');
-    parseHtmlSubset('<a href="chrome://settings">Google</a>');
-  });
-
-  test('invalid anchor hrefs', function() {
-    parseAndAssertThrows('<a href="http://google.com">Google</a>');
-    parseAndAssertThrows('<a href="ftp://google.com">Google</a>');
-    parseAndAssertThrows('<a href="http/google.com">Google</a>');
-    parseAndAssertThrows('<a href="javascript:alert(1)">Google</a>');
-    parseAndAssertThrows(
-        '<a href="chrome-extension://whurblegarble">Google</a>');
-  });
-
-  test('invalid anchor attributes', function() {
-    parseAndAssertThrows('<a name=foo>Google</a>');
-    parseAndAssertThrows(
-        '<a onclick="alert(1)" href="https://google.com">Google</a>');
-    parseAndAssertThrows(
-        '<a foo="bar(1)" href="https://google.com">Google</a>');
-  });
-
-  test('anchor target', function() {
-    var df = parseHtmlSubset(
-        '<a href="https://google.com" target="_blank">Google</a>');
-    assertEquals('_blank', df.firstChild.target);
-  });
-
-  test('invalid target', function() {
-    parseAndAssertThrows('<form target="_evil">', ['form']);
-    parseAndAssertThrows('<iframe target="_evil">', ['iframe']);
-    parseAndAssertThrows(
-        '<a href="https://google.com" target="foo">Google</a>');
-  });
-
-  test('custom tags', function() {
-    parseHtmlSubset('yo <I>ho</i><bR>yo <EM>ho</em>', ['i', 'EM', 'Br']);
-  });
-
-  test('invalid custom tags', function() {
-    parseAndAssertThrows(
-        'a pirate\'s<script>lifeForMe();<' +
-            '/script>',
-        ['br']);
-  });
-
-  test('custom attributes', function() {
-    const returnsTruthy = function(node, value) {
-      assertEquals('A', node.tagName);
-      assertEquals('fancy', value);
-      return true;
-    };
-    parseHtmlSubset(
-        '<a class="fancy">I\'m fancy!</a>', null, {class: returnsTruthy});
-  });
-
-  test('invalid custom attributes', function() {
-    const returnsFalsey = function() {
-      return false;
-    };
-    parseAndAssertThrows(
-        '<a class="fancy">I\'m fancy!</a>', null, {class: returnsFalsey});
-    parseAndAssertThrows('<a class="fancy">I\'m fancy!</a>');
-  });
-
-  test('on error async', function(done) {
-    window.called = false;
-
-    parseAndAssertThrows('<img onerror="window.called = true" src="_.png">');
-    parseAndAssertThrows('<img src="_.png" onerror="window.called = true">');
-
-    window.setTimeout(function() {
-      assertFalse(window.called);
-      done();
-    });
-  });
-});
diff --git a/chrome/test/data/webui/js/promise_resolver_test.js b/chrome/test/data/webui/js/promise_resolver_test.js
deleted file mode 100644
index 52e447e..0000000
--- a/chrome/test/data/webui/js/promise_resolver_test.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2019 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 {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-
-suite('PromiseResolverModuleTest', function() {
-  test('members read only', function() {
-    const resolver = new PromiseResolver;
-    assertThrows(function() {
-      resolver.promise = new Promise;
-    });
-    assertThrows(function() {
-      resolver.resolve = function() {};
-    });
-    assertThrows(function() {
-      resolver.reject = function() {};
-    });
-  });
-
-  test('resolves', function(done) {
-    const resolver = new PromiseResolver;
-    resolver.promise.then(done);
-    resolver.resolve();
-  });
-
-  test('rejects', function(done) {
-    const resolver = new PromiseResolver;
-    resolver.promise.catch(done);
-    resolver.reject();
-  });
-
-  test('is fulfilled', function() {
-    const resolver1 = new PromiseResolver;
-    assertFalse(resolver1.isFulfilled);
-    resolver1.resolve();
-    assertTrue(resolver1.isFulfilled);
-
-    const resolver2 = new PromiseResolver;
-    assertFalse(resolver2.isFulfilled);
-    resolver2.resolve(true);
-    assertTrue(resolver2.isFulfilled);
-
-    const resolver3 = new PromiseResolver;
-    assertFalse(resolver3.isFulfilled);
-    resolver3.reject(new Error);
-    assertTrue(resolver3.isFulfilled);
-  });
-});
diff --git a/chrome/test/data/webui/js/util_test.js b/chrome/test/data/webui/js/util_test.js
deleted file mode 100644
index af20ec2..0000000
--- a/chrome/test/data/webui/js/util_test.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2019 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 {$, quoteString} from 'chrome://resources/js/util.m.js';
-
-suite('UtilModuleTest', function() {
-  test('quote string', function() {
-    // Basic cases.
-    assertEquals('\"test\"', quoteString('"test"'));
-    assertEquals('\\!\\?', quoteString('!?'));
-    assertEquals(
-        '\\(\\._\\.\\) \\( \\:l \\) \\(\\.-\\.\\)',
-        quoteString('(._.) ( :l ) (.-.)'));
-
-    // Using the output as a regex.
-    var re = new RegExp(quoteString('"hello"'), 'gim');
-    var match = re.exec('She said "Hello" loudly');
-    assertEquals(9, match.index);
-
-    re = new RegExp(quoteString('Hello, .*'), 'gim');
-    match = re.exec('Hello, world');
-    assertEquals(null, match);
-  });
-
-  test('click handler', function() {
-    document.body.innerHTML = `
-      <a id="file" href="file:///path/to/file">File</a>
-      <a id="chrome" href="about:chrome">Chrome</a>
-      <a href="about:blank"><b id="blank">Click me</b></a>
-    `;
-
-    var clickArgs = null;
-    var oldSend = chrome.send;
-    chrome.send = function(message, args) {
-      assertEquals('navigateToUrl', message);
-      clickArgs = args;
-    };
-    $('file').click();
-    assertEquals('file:///path/to/file', clickArgs[0]);
-    $('chrome').click();
-    assertEquals('about:chrome', clickArgs[0]);
-    $('blank').click();
-    assertEquals('about:blank', clickArgs[0]);
-    chrome.send = oldSend;
-  });
-});
diff --git a/chrome/test/data/webui/js/webui_resource_module_async_browsertest.js b/chrome/test/data/webui/js/webui_resource_module_async_browsertest.js
deleted file mode 100644
index 124a1fc..0000000
--- a/chrome/test/data/webui/js/webui_resource_module_async_browsertest.js
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2019 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.
-
-/**
- * @fileoverview JS tests for various chrome://resources JS modules.
- */
-
-/** Test fixture for testing shared JS module resources. */
-var WebUIResourceModuleAsyncTest = class extends testing.Test {
-  /** @override */
-  get browsePreload() {
-    return DUMMY_URL;
-  }
-
-  /** @override */
-  get isAsync() {
-    return true;
-  }
-
-  /** @override */
-  get runAccessibilityChecks() {
-    return false;
-  }
-
-  /** @override */
-  get webuiHost() {
-    return 'dummyurl';
-  }
-
-  /** @override */
-  get extraLibraries() {
-    return [
-      '//third_party/mocha/mocha.js',
-      '//chrome/test/data/webui/mocha_adapter.js',
-    ];
-  }
-};
-
-var CrModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/cr_test.js';
-  }
-};
-
-TEST_F('CrModuleTest', 'AddSingletonGetter', function() {
-  mocha.fgrep('CrModuleAddSingletonGetterTest').run();
-});
-
-TEST_F('CrModuleTest', 'SendWithPromise', function() {
-  mocha.fgrep('CrModuleSendWithPromiseTest').run();
-});
-
-TEST_F('CrModuleTest', 'WebUIListeners', function() {
-  mocha.fgrep('CrModuleWebUIListenersTest').run();
-});
-
-var PromiseResolverModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/promise_resolver_test.js';
-  }
-};
-
-TEST_F('PromiseResolverModuleTest', 'All', function() {
-  mocha.run();
-});
-
-var ParseHtmlSubsetModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/parse_html_subset_test.js';
-  }
-};
-
-TEST_F('ParseHtmlSubsetModuleTest', 'All', function() {
-  mocha.run();
-});
-
-var UtilModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/util_test.js';
-  }
-};
-
-TEST_F('UtilModuleTest', 'All', function() {
-  mocha.run();
-});
-
-var LoadTimeDataModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/load_time_data_test.js';
-  }
-};
-
-TEST_F('LoadTimeDataModuleTest', 'All', function() {
-  mocha.run();
-});
-
-var I18nBehaviorModuleTest = class extends WebUIResourceModuleAsyncTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://test?module=js/i18n_behavior_test.js';
-  }
-};
-
-TEST_F('I18nBehaviorModuleTest', 'All', function() {
-  mocha.run();
-});
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index 1b2c98c7..660cb2f 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -57,6 +57,8 @@
           aboutBrowserProxy.whenCalled('getChannelInfo'),
           aboutBrowserProxy.whenCalled('refreshUpdateStatus'),
           aboutBrowserProxy.whenCalled('refreshTPMFirmwareUpdateStatus'),
+          aboutBrowserProxy.whenCalled('getEnabledReleaseNotes'),
+          aboutBrowserProxy.whenCalled('checkInternetConnection'),
         ]);
       }
 
@@ -278,6 +280,75 @@
         assertFalse(page.$.relaunchAndPowerwash.hidden);
       });
 
+      /**
+       * Test that release notes button can toggled by feature flags.
+       * Test that release notes button handles offline/online mode properly.
+       * page.$$("#") is used to access items inside dom-if.
+       */
+      test('ReleaseNotes', async () => {
+        let releaseNotes = null;
+
+        /**
+         * Checks the visibility of the "release notes" section when online.
+         * @param {boolean} isShowing Whether the section is expected to be
+         *     visible.
+         * @return {!Promise}
+         */
+        async function checkReleaseNotesOnline(isShowing) {
+          await aboutBrowserProxy.whenCalled('getEnabledReleaseNotes');
+          const releaseNotesOnlineEl = page.$$('#releaseNotesOnline');
+          assertTrue(!!releaseNotesOnlineEl);
+          assertEquals(isShowing, !releaseNotesOnlineEl.hidden);
+        }
+
+        /**
+         * Checks the visibility of the "release notes" for offline mode.
+         * @param {boolean} isShowing Whether the section is expected to be
+         *     visible.
+         * @return {!Promise}
+         */
+        async function checkReleaseNotesOffline(isShowing) {
+          await aboutBrowserProxy.whenCalled('getEnabledReleaseNotes');
+          const releaseNotesOfflineEl = page.$$('#releaseNotesOffline');
+          assertTrue(!!releaseNotesOfflineEl);
+          assertEquals(isShowing, !releaseNotesOfflineEl.hidden);
+        }
+
+        /**
+         * Checks the visibility of the "release notes" section when disabled.
+         * @return {!Promise}
+         */
+        async function checkReleaseNotesDisabled() {
+          await aboutBrowserProxy.whenCalled('getEnabledReleaseNotes');
+          const releaseNotesOnlineEl = page.$$('#releaseNotesOnline');
+          assertTrue(!releaseNotesOnlineEl);
+          const releaseNotesOfflineEl = page.$$('#releaseNotesOffline');
+          assertTrue(!releaseNotesOfflineEl);
+        }
+
+        aboutBrowserProxy.setReleaseNotes(false);
+        aboutBrowserProxy.setInternetConnection(false);
+        await initNewPage();
+        await checkReleaseNotesDisabled();
+
+        aboutBrowserProxy.setReleaseNotes(false);
+        aboutBrowserProxy.setInternetConnection(true);
+        await initNewPage();
+        await checkReleaseNotesDisabled();
+
+        aboutBrowserProxy.setReleaseNotes(true);
+        aboutBrowserProxy.setInternetConnection(false);
+        await initNewPage();
+        await checkReleaseNotesOnline(false);
+        await checkReleaseNotesOffline(true);
+
+        aboutBrowserProxy.setReleaseNotes(true);
+        aboutBrowserProxy.setInternetConnection(true);
+        await initNewPage();
+        await checkReleaseNotesOnline(true);
+        await checkReleaseNotesOffline(false);
+      });
+
       test('RegulatoryInfo', async () => {
         const regulatoryInfo = {text: 'foo', url: 'bar'};
 
diff --git a/chrome/test/data/webui/settings/test_about_page_browser_proxy.js b/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
index 305e08d..ebc9bb9 100644
--- a/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
@@ -15,6 +15,7 @@
     if (cr.isChromeOS) {
       methodNames.push(
           'getChannelInfo', 'getVersionInfo', 'getRegulatoryInfo',
+          'checkInternetConnection', 'getEnabledReleaseNotes',
           'getHasEndOfLife', 'openOsHelpPage', 'refreshTPMFirmwareUpdateStatus',
           'setChannel');
     }
@@ -134,6 +135,18 @@
     this.hasEndOfLife_ = hasEndOfLife;
   };
 
+  /** @param {boolean|Promise} hasReleaseNotes */
+  TestAboutPageBrowserProxy.prototype.setReleaseNotes = function(
+      hasEnabledReleaseNotes) {
+    this.hasReleaseNotes_ = hasEnabledReleaseNotes;
+  };
+
+  /** @param {boolean|Promise} hasInternetConnection */
+  TestAboutPageBrowserProxy.prototype.setInternetConnection = function(
+      hasInternetConnection) {
+    this.hasInternetConnection_ = hasInternetConnection;
+  };
+
   /** @override */
   TestAboutPageBrowserProxy.prototype.getChannelInfo = function() {
     this.methodCalled('getChannelInfo');
@@ -147,6 +160,18 @@
   };
 
   /** @override */
+  TestAboutPageBrowserProxy.prototype.getEnabledReleaseNotes = function() {
+    this.methodCalled('getEnabledReleaseNotes');
+    return Promise.resolve(this.hasReleaseNotes_);
+  };
+
+  /** @override */
+  TestAboutPageBrowserProxy.prototype.checkInternetConnection = function() {
+    this.methodCalled('checkInternetConnection');
+    return Promise.resolve(this.hasInternetConnection_);
+  };
+
+  /** @override */
   TestAboutPageBrowserProxy.prototype.getRegulatoryInfo = function() {
     this.methodCalled('getRegulatoryInfo');
     return Promise.resolve(this.regulatoryInfo_);
diff --git a/chrome/test/nacl/pnacl_header_test.cc b/chrome/test/nacl/pnacl_header_test.cc
index d05c9d0..75d36882 100644
--- a/chrome/test/nacl/pnacl_header_test.cc
+++ b/chrome/test/nacl/pnacl_header_test.cc
@@ -14,7 +14,6 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "chrome/test/nacl/nacl_browsertest_util.h"
-#include "content/public/browser/resource_dispatcher_host.h"
 #include "content/public/browser/web_contents.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -25,6 +24,7 @@
 using net::test_server::HttpRequest;
 using net::test_server::HttpResponse;
 
+/*
 void TestDispatcherHostDelegate::RequestBeginning(
     net::URLRequest* request,
     content::ResourceContext* resource_context,
@@ -42,6 +42,7 @@
     }
   }
 }
+*/
 
 PnaclHeaderTest::PnaclHeaderTest() : noncors_loads_(0), cors_loads_(0) {}
 
@@ -61,7 +62,7 @@
 void PnaclHeaderTest::RunLoadTest(const std::string& url,
                                   int expected_noncors,
                                   int expected_cors) {
-  content::ResourceDispatcherHost::Get()->SetDelegate(&test_delegate_);
+  // content::ResourceDispatcherHost::Get()->SetDelegate(&test_delegate_);
   StartServer();
   LoadTestMessageHandler handler;
   content::JavascriptTestObserver observer(
@@ -88,7 +89,7 @@
   EXPECT_EQ(expected_noncors, noncors_loads_);
   EXPECT_EQ(expected_cors, cors_loads_);
 
-  content::ResourceDispatcherHost::Get()->SetDelegate(NULL);
+  // content::ResourceDispatcherHost::Get()->SetDelegate(NULL);
 }
 
 std::unique_ptr<HttpResponse> PnaclHeaderTest::WatchForPexeFetch(
@@ -113,7 +114,7 @@
   auto it = request.headers.find("Accept");
   EXPECT_NE(std::string::npos, it->second.find("application/x-pnacl"));
   EXPECT_NE(std::string::npos, it->second.find("*/*"));
-  EXPECT_TRUE(test_delegate_.found_pnacl_header());
+  // EXPECT_TRUE(test_delegate_.found_pnacl_header());
 
   // Also make sure that other headers like CORS-related headers
   // are preserved when injecting the special Accept header.
diff --git a/chrome/test/nacl/pnacl_header_test.h b/chrome/test/nacl/pnacl_header_test.h
index 8d7c00f..4906224 100644
--- a/chrome/test/nacl/pnacl_header_test.h
+++ b/chrome/test/nacl/pnacl_header_test.h
@@ -11,7 +11,6 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "content/public/browser/resource_dispatcher_host_delegate.h"
 #include "content/public/common/resource_type.h"
 
 namespace net {
@@ -21,6 +20,10 @@
 }
 }
 
+/*
+TODO(https://crbug.com/711289): port to work with network service if this
+check matters.
+
 using content::ResourceDispatcherHostDelegate;
 
 class TestDispatcherHostDelegate : public ResourceDispatcherHostDelegate {
@@ -44,6 +47,7 @@
 
   DISALLOW_COPY_AND_ASSIGN(TestDispatcherHostDelegate);
 };
+*/
 
 class PnaclHeaderTest : public InProcessBrowserTest {
  public:
@@ -65,7 +69,7 @@
 
   int noncors_loads_;
   int cors_loads_;
-  TestDispatcherHostDelegate test_delegate_;
+  // TestDispatcherHostDelegate test_delegate_;
   DISALLOW_COPY_AND_ASSIGN(PnaclHeaderTest);
 };
 
diff --git a/chrome/test/views/OWNERS b/chrome/test/views/OWNERS
new file mode 100644
index 0000000..860516e
--- /dev/null
+++ b/chrome/test/views/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: UI>Accessibility
diff --git a/chrome/third_party/OWNERS b/chrome/third_party/OWNERS
new file mode 100644
index 0000000..0bad6a2
--- /dev/null
+++ b/chrome/third_party/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: A-N/A
diff --git a/chrome/third_party/mozilla_security_manager/OWNERS b/chrome/third_party/mozilla_security_manager/OWNERS
index 79dbd13..31a5940 100644
--- a/chrome/third_party/mozilla_security_manager/OWNERS
+++ b/chrome/third_party/mozilla_security_manager/OWNERS
@@ -1,3 +1,4 @@
 mattm@chromium.org
 rsleevi@chromium.org
 wtc@chromium.org
+# COMPONENT: Internals>Network>Certificate
diff --git a/chrome/tools/OWNERS b/chrome/tools/OWNERS
new file mode 100644
index 0000000..036a36bd
--- /dev/null
+++ b/chrome/tools/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: UI>Shell
diff --git a/chrome/tools/convert_dict/OWNERS b/chrome/tools/convert_dict/OWNERS
new file mode 100644
index 0000000..f136fc1
--- /dev/null
+++ b/chrome/tools/convert_dict/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals
diff --git a/chrome/tools/safe_browsing/OWNERS b/chrome/tools/safe_browsing/OWNERS
new file mode 100644
index 0000000..85d233d
--- /dev/null
+++ b/chrome/tools/safe_browsing/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Services>Safebrowsing
diff --git a/chrome/tools/test/OWNERS b/chrome/tools/test/OWNERS
new file mode 100644
index 0000000..15fbac6
--- /dev/null
+++ b/chrome/tools/test/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Tests
diff --git a/chrome/tools/tracing/OWNERS b/chrome/tools/tracing/OWNERS
new file mode 100644
index 0000000..804c7d45
--- /dev/null
+++ b/chrome/tools/tracing/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Speed>Tracing
diff --git a/chrome/utility/OWNERS b/chrome/utility/OWNERS
index 8cdc929..0ecff5f 100644
--- a/chrome/utility/OWNERS
+++ b/chrome/utility/OWNERS
@@ -1,2 +1,3 @@
 # For service-related code
 per-file chrome_content_utility_client.*=rockot@google.com
+# COMPONENT: Internals>Services>ServiceManager
diff --git a/chromecast/common/extensions_api/OWNERS b/chromecast/common/extensions_api/OWNERS
index 0afdfaa..9f3e1dfa 100644
--- a/chromecast/common/extensions_api/OWNERS
+++ b/chromecast/common/extensions_api/OWNERS
@@ -2,3 +2,4 @@
 per-file *_messages.cc=file://ipc/SECURITY_OWNERS
 per-file *_messages*.h=set noparent
 per-file *_messages*.h=file://ipc/SECURITY_OWNERS
+# COMPONENT: Platform>Extensions
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index df73bb2..3d9e3749 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12334.0.0
\ No newline at end of file
+12363.0.0
\ No newline at end of file
diff --git a/chromeos/components/proximity_auth/fake_remote_device_life_cycle.cc b/chromeos/components/proximity_auth/fake_remote_device_life_cycle.cc
index 74af9e4..152f3b7 100644
--- a/chromeos/components/proximity_auth/fake_remote_device_life_cycle.cc
+++ b/chromeos/components/proximity_auth/fake_remote_device_life_cycle.cc
@@ -18,6 +18,7 @@
 
 void FakeRemoteDeviceLifeCycle::Start() {
   started_ = true;
+  ChangeState(RemoteDeviceLifeCycle::State::FINDING_CONNECTION);
 }
 
 chromeos::multidevice::RemoteDeviceRef
diff --git a/chromeos/components/proximity_auth/proximity_auth_system.cc b/chromeos/components/proximity_auth/proximity_auth_system.cc
index a62e6b5..f13d75e1 100644
--- a/chromeos/components/proximity_auth/proximity_auth_system.cc
+++ b/chromeos/components/proximity_auth/proximity_auth_system.cc
@@ -122,12 +122,6 @@
       remote_device, local_device, secure_channel_client_);
 }
 
-void ProximityAuthSystem::OnLifeCycleStateChanged(
-    RemoteDeviceLifeCycle::State old_state,
-    RemoteDeviceLifeCycle::State new_state) {
-  unlock_manager_->OnLifeCycleStateChanged();
-}
-
 void ProximityAuthSystem::OnScreenDidLock(
     ScreenlockBridge::LockHandler::ScreenType screen_type) {
   const AccountId& focused_account_id =
@@ -182,7 +176,6 @@
                  << account_id.Serialize();
     remote_device_life_cycle_ =
         CreateRemoteDeviceLifeCycle(remote_device, local_device);
-    remote_device_life_cycle_->AddObserver(this);
 
     // UnlockManager listens for Bluetooth power change events, and is therefore
     // responsible for starting RemoteDeviceLifeCycle when Bluetooth becomes
diff --git a/chromeos/components/proximity_auth/proximity_auth_system.h b/chromeos/components/proximity_auth/proximity_auth_system.h
index 4df26a4..0ea39c65 100644
--- a/chromeos/components/proximity_auth/proximity_auth_system.h
+++ b/chromeos/components/proximity_auth/proximity_auth_system.h
@@ -10,7 +10,6 @@
 
 #include "base/macros.h"
 #include "chromeos/components/multidevice/remote_device_ref.h"
-#include "chromeos/components/proximity_auth/remote_device_life_cycle.h"
 #include "chromeos/components/proximity_auth/screenlock_bridge.h"
 #include "components/account_id/account_id.h"
 
@@ -23,6 +22,7 @@
 namespace proximity_auth {
 
 class ProximityAuthClient;
+class RemoteDeviceLifeCycle;
 class UnlockManager;
 
 // This is the main entry point to start Proximity Auth, the underlying system
@@ -30,8 +30,7 @@
 // phone) for each registered user, the system will handle the connection,
 // authentication, and messenging protocol when the screen is locked and the
 // registered user is focused.
-class ProximityAuthSystem : public RemoteDeviceLifeCycle::Observer,
-                            public ScreenlockBridge::Observer {
+class ProximityAuthSystem : public ScreenlockBridge::Observer {
  public:
   enum ScreenlockType { SESSION_LOCK, SIGN_IN };
 
@@ -91,10 +90,6 @@
       chromeos::multidevice::RemoteDeviceRef remote_device,
       base::Optional<chromeos::multidevice::RemoteDeviceRef> local_device);
 
-  // RemoteDeviceLifeCycle::Observer:
-  void OnLifeCycleStateChanged(RemoteDeviceLifeCycle::State old_state,
-                               RemoteDeviceLifeCycle::State new_state) override;
-
   // ScreenlockBridge::Observer:
   void OnScreenDidLock(
       ScreenlockBridge::LockHandler::ScreenType screen_type) override;
diff --git a/chromeos/components/proximity_auth/proximity_auth_system_unittest.cc b/chromeos/components/proximity_auth/proximity_auth_system_unittest.cc
index 774450d..2792bc2 100644
--- a/chromeos/components/proximity_auth/proximity_auth_system_unittest.cc
+++ b/chromeos/components/proximity_auth/proximity_auth_system_unittest.cc
@@ -68,7 +68,6 @@
   ~MockUnlockManager() override {}
   MOCK_METHOD0(IsUnlockAllowed, bool());
   MOCK_METHOD1(SetRemoteDeviceLifeCycle, void(RemoteDeviceLifeCycle*));
-  MOCK_METHOD0(OnLifeCycleStateChanged, void());
   MOCK_METHOD1(OnAuthAttempted, void(mojom::AuthType));
   MOCK_METHOD0(CancelConnectionAttempt, void());
 
@@ -395,20 +394,6 @@
   EXPECT_EQ(kUser1, life_cycle()->GetRemoteDevice().user_id());
 }
 
-TEST_F(ProximityAuthSystemTest, OnLifeCycleStateChanged) {
-  FocusUser(kUser1);
-
-  EXPECT_CALL(*unlock_manager_, OnLifeCycleStateChanged());
-  life_cycle()->ChangeState(RemoteDeviceLifeCycle::State::FINDING_CONNECTION);
-
-  EXPECT_CALL(*unlock_manager_, OnLifeCycleStateChanged());
-  life_cycle()->ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATING);
-
-  EXPECT_CALL(*unlock_manager_, OnLifeCycleStateChanged());
-  life_cycle()->ChangeState(
-      RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-}
-
 TEST_F(ProximityAuthSystemTest, OnAuthAttempted) {
   FocusUser(kUser1);
   EXPECT_CALL(*unlock_manager_, OnAuthAttempted(_));
diff --git a/chromeos/components/proximity_auth/unlock_manager.h b/chromeos/components/proximity_auth/unlock_manager.h
index 7195ede..5a29996 100644
--- a/chromeos/components/proximity_auth/unlock_manager.h
+++ b/chromeos/components/proximity_auth/unlock_manager.h
@@ -25,9 +25,6 @@
   // authentication is inactive.
   virtual void SetRemoteDeviceLifeCycle(RemoteDeviceLifeCycle* life_cycle) = 0;
 
-  // Called when the life cycle's state changes.
-  virtual void OnLifeCycleStateChanged() = 0;
-
   // Called when the user pod is clicked for an authentication attempt of type
   // |auth_type|.
   // Exposed for testing.
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl.cc b/chromeos/components/proximity_auth/unlock_manager_impl.cc
index b361f82..b71d106 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl.cc
+++ b/chromeos/components/proximity_auth/unlock_manager_impl.cc
@@ -125,14 +125,13 @@
 }
 
 UnlockManagerImpl::~UnlockManagerImpl() {
+  if (life_cycle_)
+    life_cycle_->RemoveObserver(this);
   if (GetMessenger())
     GetMessenger()->RemoveObserver(this);
-
   if (proximity_monitor_)
     proximity_monitor_->RemoveObserver(this);
-
   chromeos::PowerManagerClient::Get()->RemoveObserver(this);
-
   if (bluetooth_adapter_)
     bluetooth_adapter_->RemoveObserver(this);
 }
@@ -153,11 +152,15 @@
   PA_LOG(VERBOSE) << "Request received to change scan state to: "
                   << (life_cycle == nullptr ? "inactive" : "active") << ".";
 
+  if (life_cycle_)
+    life_cycle_->RemoveObserver(this);
   if (GetMessenger())
     GetMessenger()->RemoveObserver(this);
 
   life_cycle_ = life_cycle;
   if (life_cycle_) {
+    life_cycle_->AddObserver(this);
+
     attempt_secure_connection_start_time_ =
         base::DefaultClock::GetInstance()->Now();
 
@@ -174,11 +177,11 @@
   UpdateLockScreen();
 }
 
-void UnlockManagerImpl::OnLifeCycleStateChanged() {
-  RemoteDeviceLifeCycle::State state = life_cycle_->GetState();
-
+void UnlockManagerImpl::OnLifeCycleStateChanged(
+    RemoteDeviceLifeCycle::State old_state,
+    RemoteDeviceLifeCycle::State new_state) {
   remote_screenlock_state_.reset();
-  if (state == RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) {
+  if (new_state == RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) {
     DCHECK(life_cycle_->GetChannel());
     DCHECK(GetMessenger());
     if (!proximity_monitor_) {
@@ -196,7 +199,7 @@
     proximity_monitor_.reset();
   }
 
-  if (state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED)
+  if (new_state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED)
     SetIsPerformingInitialScan(false /* is_performing_initial_scan */);
 
   UpdateLockScreen();
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl.h b/chromeos/components/proximity_auth/unlock_manager_impl.h
index ed13d74..6259d1f 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl.h
+++ b/chromeos/components/proximity_auth/unlock_manager_impl.h
@@ -34,8 +34,9 @@
 class UnlockManagerImpl : public UnlockManager,
                           public MessengerObserver,
                           public ProximityMonitorObserver,
-                          chromeos::PowerManagerClient::Observer,
-                          public device::BluetoothAdapter::Observer {
+                          public chromeos::PowerManagerClient::Observer,
+                          public device::BluetoothAdapter::Observer,
+                          public RemoteDeviceLifeCycle::Observer {
  public:
   // The |proximity_auth_client| is not owned and should outlive the constructed
   // unlock manager.
@@ -46,7 +47,6 @@
   // UnlockManager:
   bool IsUnlockAllowed() override;
   void SetRemoteDeviceLifeCycle(RemoteDeviceLifeCycle* life_cycle) override;
-  void OnLifeCycleStateChanged() override;
   void OnAuthAttempted(mojom::AuthType auth_type) override;
   void CancelConnectionAttempt() override;
 
@@ -92,6 +92,10 @@
   // chromeos::PowerManagerClient::Observer:
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
+  // RemoteDeviceLifeCycle::Observer:
+  void OnLifeCycleStateChanged(RemoteDeviceLifeCycle::State old_state,
+                               RemoteDeviceLifeCycle::State new_state) override;
+
   // Returns true if the BluetoothAdapter is present and powered.
   bool IsBluetoothPresentAndPowered() const;
 
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl_unittest.cc b/chromeos/components/proximity_auth/unlock_manager_impl_unittest.cc
index 777962c..a1ed71e 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl_unittest.cc
+++ b/chromeos/components/proximity_auth/unlock_manager_impl_unittest.cc
@@ -195,7 +195,6 @@
     unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
     life_cycle_.ChangeState(
         RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-    unlock_manager_->OnLifeCycleStateChanged();
     unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
   }
 
@@ -244,7 +243,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
 
   EXPECT_TRUE(unlock_manager_->IsUnlockAllowed());
@@ -256,7 +254,6 @@
 
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
 
   ON_CALL(messenger_, SupportsSignIn()).WillByDefault(Return(true));
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
@@ -271,7 +268,6 @@
 
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
 
   ON_CALL(messenger_, SupportsSignIn()).WillByDefault(Return(false));
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
@@ -286,7 +282,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
 
   ON_CALL(*proximity_monitor(), IsUnlockAllowed()).WillByDefault(Return(false));
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
@@ -300,7 +295,6 @@
   life_cycle_.set_messenger(nullptr);
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATING);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenUnlocked);
 
   EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
@@ -323,7 +317,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenLocked);
 
   EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
@@ -335,7 +328,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate({USER_PRESENCE_SECONDARY,
                                          SECURE_SCREEN_LOCK_ENABLED,
                                          TRUST_AGENT_UNSUPPORTED});
@@ -350,7 +342,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate({USER_PRESENCE_BACKGROUND,
                                          SECURE_SCREEN_LOCK_ENABLED,
                                          TRUST_AGENT_UNSUPPORTED});
@@ -365,7 +356,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenlockStateUnknown);
 
   EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
@@ -378,7 +368,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   unlock_manager_->OnRemoteStatusUpdate(kRemoteScreenlockDisabled);
 
   EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
@@ -391,7 +380,6 @@
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
 
   EXPECT_FALSE(unlock_manager_->IsUnlockAllowed());
 }
@@ -471,9 +459,7 @@
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   SimulateUserPresentState();
 
-  unlock_manager_->OnLifeCycleStateChanged();
   life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::FINDING_CONNECTION);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_TRUE(proximity_monitor_destroyed());
 }
 
@@ -483,10 +469,8 @@
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
 
-  unlock_manager_->OnLifeCycleStateChanged();
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_TRUE(proximity_monitor()->started());
 }
 
@@ -498,22 +482,18 @@
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
 
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
-  unlock_manager_->OnLifeCycleStateChanged();
 
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_TRUE(proximity_monitor()->started());
 
   // Simulate the phone connection being lost. The ProximityMonitor is stale
   // and should have been destroyed.
   life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::FINDING_CONNECTION);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_TRUE(proximity_monitor_destroyed());
 
   life_cycle_.ChangeState(
       RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_FALSE(proximity_monitor_destroyed());
   EXPECT_TRUE(proximity_monitor()->started());
 }
@@ -548,76 +528,58 @@
   EXPECT_TRUE(life_cycle_.started());
 }
 
-TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_SecureChannelEstablished_RegistersAsObserver) {
-  CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
-  SimulateUserPresentState();
-  EXPECT_CALL(messenger_, AddObserver(unlock_manager_.get()));
-  unlock_manager_->OnLifeCycleStateChanged();
-}
-
-TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_StartsProximityMonitor) {
+TEST_F(ProximityAuthUnlockManagerImplTest, StartsProximityMonitor) {
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   SimulateUserPresentState();
   EXPECT_TRUE(proximity_monitor()->started());
-  unlock_manager_->OnLifeCycleStateChanged();
 }
 
 TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_StopsProximityMonitor) {
+       OnAuthenticationFailed_StopsProximityMonitor) {
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   SimulateUserPresentState();
 
-  unlock_manager_->OnLifeCycleStateChanged();
   life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED);
-  unlock_manager_->OnLifeCycleStateChanged();
   EXPECT_TRUE(proximity_monitor_destroyed());
 }
 
 TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_AuthenticationFailed_UpdatesScreenlockState) {
+       AuthenticationFailed_UpdatesScreenlockState) {
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   SimulateUserPresentState();
 
   EXPECT_CALL(proximity_auth_client_,
               UpdateScreenlockState(ScreenlockState::PHONE_NOT_AUTHENTICATED));
   life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED);
-  unlock_manager_->OnLifeCycleStateChanged();
 }
 
 TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_FindingConnection_UpdatesScreenlockState) {
+       FindingConnection_UpdatesScreenlockState) {
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
 
+  // TODO(crbug.com/890047): Remove this once the bug is resolved.
   EXPECT_CALL(proximity_auth_client_,
-              UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
-  unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
-}
+              UpdateScreenlockState(ScreenlockState::NO_PHONE));
 
-TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnLifeCycleStateChanged_Authenticating_UpdatesScreenlockState) {
-  CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
   EXPECT_CALL(proximity_auth_client_,
               UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
   unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
   EXPECT_TRUE(life_cycle_.started());
-
-  life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATING);
-  unlock_manager_->OnLifeCycleStateChanged();
 }
 
 TEST_F(ProximityAuthUnlockManagerImplTest,
-       OnDisconnected_UnregistersAsObserver) {
+       Authenticating_UpdatesScreenlockState) {
   CreateUnlockManager(ProximityAuthSystem::SESSION_LOCK);
-  SimulateUserPresentState();
-  life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED);
-  unlock_manager_->OnLifeCycleStateChanged();
 
-  EXPECT_CALL(messenger_, RemoveObserver(unlock_manager_.get()))
-      .Times(testing::AtLeast(1));
-  unlock_manager_.get()->OnDisconnected();
-  unlock_manager_->SetRemoteDeviceLifeCycle(nullptr);
+  // TODO(crbug.com/890047): Remove this once the bug is resolved.
+  EXPECT_CALL(proximity_auth_client_,
+              UpdateScreenlockState(ScreenlockState::NO_PHONE));
+
+  EXPECT_CALL(proximity_auth_client_,
+              UpdateScreenlockState(ScreenlockState::BLUETOOTH_CONNECTING));
+  unlock_manager_->SetRemoteDeviceLifeCycle(&life_cycle_);
+  EXPECT_TRUE(life_cycle_.started());
+  life_cycle_.ChangeState(RemoteDeviceLifeCycle::State::AUTHENTICATING);
 }
 
 TEST_F(ProximityAuthUnlockManagerImplTest,
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index b0819f38..5567531 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -124,6 +124,11 @@
 const base::Feature kShowBluetoothDeviceBattery{
     "ShowBluetoothDeviceBattery", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables or disables Release Notes on Chrome OS.
+// TODO(yulunwu): http://crbug.com/978201
+const base::Feature kReleaseNotes{"ReleaseNotes",
+                                  base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Uses the V3 (~2019-05 era) Smart Dim model instead of the default V2
 // (~2018-11) model.
 const base::Feature kSmartDimModelV3{"SmartDimModelV3",
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index ebea5cd..0572da36 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -62,6 +62,8 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kInstantTethering;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kReleaseNotes;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kShowBluetoothDeviceBattery;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kSmartDimModelV3;
diff --git a/chromeos/dbus/power/fake_power_manager_client.cc b/chromeos/dbus/power/fake_power_manager_client.cc
index bb424c32..39cdc6c 100644
--- a/chromeos/dbus/power/fake_power_manager_client.cc
+++ b/chromeos/dbus/power/fake_power_manager_client.cc
@@ -361,6 +361,10 @@
       FROM_HERE, base::BindOnce(std::move(callback), true));
 }
 
+void FakePowerManagerClient::DeferScreenDim() {
+  num_defer_screen_dim_calls_++;
+}
+
 bool FakePowerManagerClient::PopVideoActivityReport() {
   CHECK(!video_activity_reports_.empty());
   bool fullscreen = video_activity_reports_.front();
@@ -414,6 +418,11 @@
     observer.PowerButtonEventReceived(down, timestamp);
 }
 
+void FakePowerManagerClient::SendScreenDimImminent() {
+  for (auto& observer : observers_)
+    observer.ScreenDimImminent();
+}
+
 void FakePowerManagerClient::SetLidState(LidState state,
                                          const base::TimeTicks& timestamp) {
   lid_state_ = state;
diff --git a/chromeos/dbus/power/fake_power_manager_client.h b/chromeos/dbus/power/fake_power_manager_client.h
index 4095117..82c5c528 100644
--- a/chromeos/dbus/power/fake_power_manager_client.h
+++ b/chromeos/dbus/power/fake_power_manager_client.h
@@ -52,6 +52,7 @@
   int num_set_is_projecting_calls() const {
     return num_set_is_projecting_calls_;
   }
+  int num_defer_screen_dim_calls() const { return num_defer_screen_dim_calls_; }
   int num_wake_notification_calls() const {
     return num_wake_notification_calls_;
   }
@@ -127,6 +128,7 @@
                      VoidDBusMethodCallback callback) override;
   void DeleteArcTimers(const std::string& tag,
                        VoidDBusMethodCallback callback) override;
+  void DeferScreenDim() override;
 
   // Pops the first report from |video_activity_reports_|, returning whether the
   // activity was fullscreen or not. There must be at least one report.
@@ -151,6 +153,9 @@
   // Notifies observers that the power button has been pressed or released.
   void SendPowerButtonEvent(bool down, const base::TimeTicks& timestamp);
 
+  // Notifies observers that the screen is about to be dimmed.
+  void SendScreenDimImminent();
+
   // Sets |lid_state_| or |tablet_mode_| and notifies |observers_| about the
   // change.
   void SetLidState(LidState state, const base::TimeTicks& timestamp);
@@ -219,6 +224,7 @@
   int num_set_policy_calls_ = 0;
   int num_set_is_projecting_calls_ = 0;
   int num_set_backlights_forced_off_calls_ = 0;
+  int num_defer_screen_dim_calls_ = 0;
   int num_wake_notification_calls_ = 0;
 
   // Number of pending suspend readiness callbacks.
diff --git a/chromeos/dbus/power/power_manager_client.cc b/chromeos/dbus/power/power_manager_client.cc
index 06ab167d..1209b65 100644
--- a/chromeos/dbus/power/power_manager_client.cc
+++ b/chromeos/dbus/power/power_manager_client.cc
@@ -192,6 +192,8 @@
          &PowerManagerClientImpl::SuspendDoneReceived},
         {power_manager::kDarkSuspendImminentSignal,
          &PowerManagerClientImpl::DarkSuspendImminentReceived},
+        {power_manager::kScreenDimImminentSignal,
+         &PowerManagerClientImpl::ScreenDimImminentReceived},
         {power_manager::kIdleActionImminentSignal,
          &PowerManagerClientImpl::IdleActionImminentReceived},
         {power_manager::kIdleActionDeferredSignal,
@@ -537,6 +539,10 @@
         base::BindOnce(&OnVoidDBusMethod, std::move(callback)));
   }
 
+  void DeferScreenDim() override {
+    SimpleMethodCallToPowerManager(power_manager::kDeferScreenDimMethod);
+  }
+
  private:
   // Returns true if the current thread is the origin thread.
   bool OnOriginThread() {
@@ -915,6 +921,11 @@
     base::PowerMonitorDeviceSource::HandleSystemResumed();
   }
 
+  void ScreenDimImminentReceived(dbus::Signal* signal) {
+    for (auto& observer : observers_)
+      observer.ScreenDimImminent();
+  }
+
   void IdleActionImminentReceived(dbus::Signal* signal) {
     dbus::MessageReader reader(signal);
     power_manager::IdleActionImminent proto;
diff --git a/chromeos/dbus/power/power_manager_client.h b/chromeos/dbus/power/power_manager_client.h
index 9bd84f5d..b6f3a967a 100644
--- a/chromeos/dbus/power/power_manager_client.h
+++ b/chromeos/dbus/power/power_manager_client.h
@@ -145,6 +145,9 @@
     virtual void TabletModeEventReceived(TabletMode mode,
                                          const base::TimeTicks& timestamp) {}
 
+    // Called just before the screen is dimmed in response to user inactivity.
+    virtual void ScreenDimImminent() {}
+
     // Called when the idle action will be performed after
     // |time_until_idle_action|.
     virtual void IdleActionImminent(
@@ -318,6 +321,11 @@
   virtual void DeleteArcTimers(const std::string& tag,
                                VoidDBusMethodCallback callback) = 0;
 
+  // Instructs powerd to defer dimming the screen. This only has an effect when
+  // called shortly (i.e. seconds) after observers have received
+  // ScreenDimImminent notifications.
+  virtual void DeferScreenDim() = 0;
+
   PowerManagerClient();
   virtual ~PowerManagerClient();
 
diff --git a/chromeos/ime/OWNERS b/chromeos/ime/OWNERS
index 726bdf382d53..f8ad3ae6 100644
--- a/chromeos/ime/OWNERS
+++ b/chromeos/ime/OWNERS
@@ -4,3 +4,5 @@
 
 # backup reviewers
 yukishiino@chromium.org
+
+# COMPONENT: UI>Input>Text>IME
diff --git a/chromeos/services/assistant/public/cpp/assistant_prefs.cc b/chromeos/services/assistant/public/cpp/assistant_prefs.cc
index 3f7330bb3..58d4bf7 100644
--- a/chromeos/services/assistant/public/cpp/assistant_prefs.cc
+++ b/chromeos/services/assistant/public/cpp/assistant_prefs.cc
@@ -21,12 +21,33 @@
 // This preference should only be changed in browser.
 const char kAssistantDisabledByPolicy[] =
     "settings.assistant.disabled_by_policy";
+// A preference that indicates the user has chosen to always keep hotword
+// listening on even without DSP support.
+// This preference should only be changed in browser.
+const char kAssistantHotwordAlwaysOn[] =
+    "settings.voice_interaction.hotword.always_on";
+// A preference that indicates whether microphone should be open when the
+// Assistant launches.
+// This preference should only be changed in browser.
+const char kAssistantLaunchWithMicOpen[] =
+    "settings.voice_interaction.launch_with_mic_open";
+// A preference that indicates the user has allowed the Assistant services
+// to send notification.
+// This preference should only be changed in browser.
+const char kAssistantNotificationEnabled[] =
+    "settings.voice_interaction.notification.enabled";
 
 void RegisterProfilePrefsForBrowser(PrefRegistrySimple* registry) {
   registry->RegisterIntegerPref(kAssistantConsentStatus,
                                 ConsentStatus::kUnknown, PrefRegistry::PUBLIC);
   registry->RegisterBooleanPref(kAssistantDisabledByPolicy, false,
                                 PrefRegistry::PUBLIC);
+  registry->RegisterBooleanPref(kAssistantHotwordAlwaysOn, false,
+                                PrefRegistry::PUBLIC);
+  registry->RegisterBooleanPref(kAssistantLaunchWithMicOpen, false,
+                                PrefRegistry::PUBLIC);
+  registry->RegisterBooleanPref(kAssistantNotificationEnabled, true,
+                                PrefRegistry::PUBLIC);
 }
 
 void RegisterProfilePrefsForeign(PrefRegistrySimple* registry, bool for_test) {
@@ -38,6 +59,9 @@
   }
   registry->RegisterForeignPref(kAssistantConsentStatus);
   registry->RegisterForeignPref(kAssistantDisabledByPolicy);
+  registry->RegisterForeignPref(kAssistantHotwordAlwaysOn);
+  registry->RegisterForeignPref(kAssistantLaunchWithMicOpen);
+  registry->RegisterForeignPref(kAssistantNotificationEnabled);
 }
 
 }  // namespace prefs
diff --git a/chromeos/services/assistant/public/cpp/assistant_prefs.h b/chromeos/services/assistant/public/cpp/assistant_prefs.h
index 4fc8dbf..7dec5758 100644
--- a/chromeos/services/assistant/public/cpp/assistant_prefs.h
+++ b/chromeos/services/assistant/public/cpp/assistant_prefs.h
@@ -32,6 +32,9 @@
 
 extern const char kAssistantConsentStatus[];
 extern const char kAssistantDisabledByPolicy[];
+extern const char kAssistantHotwordAlwaysOn[];
+extern const char kAssistantLaunchWithMicOpen[];
+extern const char kAssistantNotificationEnabled[];
 
 // Registers Assistant specific profile preferences for browser prefs.
 void RegisterProfilePrefsForBrowser(PrefRegistrySimple* registry);
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index 34bec34..8512688 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -27,6 +27,7 @@
 #include "chromeos/services/assistant/fake_assistant_settings_manager_impl.h"
 #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
 #include "chromeos/services/assistant/public/features.h"
+#include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/known_user.h"
@@ -107,7 +108,8 @@
 
   // Disable hotword if hotword is not set to always on and power source is not
   // connected.
-  if (!dsp_available && !assistant_state_.hotword_always_on().value() &&
+  if (!dsp_available &&
+      !pref_service_->GetBoolean(prefs::kAssistantHotwordAlwaysOn) &&
       !power_source_connected_) {
     return false;
   }
@@ -194,6 +196,14 @@
   UpdateListeningState();
 }
 
+void Service::OnAssistantHotwordAlwaysOn() {
+  // No need to update hotword status if power source is connected.
+  if (power_source_connected_)
+    return;
+
+  UpdateAssistantManagerState();
+}
+
 void Service::OnVoiceInteractionSettingsEnabled(bool enabled) {
   UpdateAssistantManagerState();
 }
@@ -214,18 +224,11 @@
   UpdateListeningState();
 }
 
-void Service::OnVoiceInteractionHotwordAlwaysOn(bool always_on) {
-  // No need to update hotword status if power source is connected.
-  if (power_source_connected_)
-    return;
-
-  UpdateAssistantManagerState();
-}
-
 void Service::UpdateAssistantManagerState() {
+  if (!pref_service_)
+    return;
   if (!assistant_state_.hotword_enabled().has_value() ||
       !assistant_state_.settings_enabled().has_value() ||
-      !assistant_state_.hotword_always_on().has_value() ||
       !assistant_state_.locale().has_value() ||
       (!access_token_.has_value() && !is_signed_out_mode_) ||
       !assistant_state_.arc_play_store_enabled().has_value()) {
@@ -296,9 +299,19 @@
 
 void Service::OnPrefServiceConnected(
     std::unique_ptr<::PrefService> pref_service) {
-  // TODO(b/110211045): Switch to user pref service after migrating other
-  // Assistant related prefs.
+  // TODO(b/110211045): Add testing support for Assistant prefs.
+  if (!pref_service_)
+    return;
+
   pref_service_ = std::move(pref_service);
+
+  pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
+  pref_change_registrar_->Init(pref_service_.get());
+
+  pref_change_registrar_->Add(
+      chromeos::assistant::prefs::kAssistantHotwordAlwaysOn,
+      base::BindRepeating(&Service::OnAssistantHotwordAlwaysOn,
+                          base::Unretained(this)));
 }
 
 identity::mojom::IdentityAccessor* Service::GetIdentityAccessor() {
diff --git a/chromeos/services/assistant/service.h b/chromeos/services/assistant/service.h
index 0e4016a..736351a 100644
--- a/chromeos/services/assistant/service.h
+++ b/chromeos/services/assistant/service.h
@@ -34,6 +34,7 @@
 #include "services/service_manager/public/mojom/service.mojom.h"
 
 class GoogleServiceAuthError;
+class PrefChangeRegistrar;
 class PrefService;
 
 namespace base {
@@ -129,10 +130,12 @@
   void OnSessionActivated(bool activated) override;
   void OnLockStateChanged(bool locked) override;
 
+  // Called when the hotword always on status is changed from the pref service.
+  void OnAssistantHotwordAlwaysOn();
+
   // ash::mojom::VoiceInteractionObserver:
   void OnVoiceInteractionSettingsEnabled(bool enabled) override;
   void OnVoiceInteractionHotwordEnabled(bool enabled) override;
-  void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override;
   void OnLocaleChanged(const std::string& locale) override;
   void OnArcPlayStoreEnabledChanged(bool enabled) override;
   void OnLockedFullScreenStateChanged(bool enabled) override;
@@ -219,6 +222,9 @@
 
   std::unique_ptr<PrefService> pref_service_;
 
+  // Observes user profile prefs for the Assistant.
+  std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
+
   base::WeakPtrFactory<Service> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(Service);
diff --git a/chromeos/services/ime/ime_sandbox_hook.cc b/chromeos/services/ime/ime_sandbox_hook.cc
index 2b39705..20ca657 100644
--- a/chromeos/services/ime/ime_sandbox_hook.cc
+++ b/chromeos/services/ime/ime_sandbox_hook.cc
@@ -21,8 +21,6 @@
 
 namespace {
 
-// The name of an IME decoder shared library.
-const char kLibImeDecoderName[] = "libimedecoder.so";
 // The path of input tools relative folder, which contains some 'pre-bundled'
 // static language dictionaries.
 const char kInputToolsBundleFolder[] = "input_methods/input_tools";
@@ -43,15 +41,6 @@
   return base::CreateDirectory(path);
 }
 
-// This is where IME decoder shared library will be put.
-base::FilePath GetLibFolder() {
-#if defined(__x86_64__) || defined(__aarch64__)
-  return base::FilePath("/usr/lib64");
-#else
-  return base::FilePath("/usr/lib");
-#endif
-}
-
 // Whether IME instance shares a same language data path with each other.
 inline constexpr bool CrosImeSharedDataEnabled() {
 #if BUILDFLAG(ENABLE_CROS_IME_SHARED_DATA)
@@ -66,9 +55,22 @@
   return base::FilePath("/usr/share/chromeos-assets");
 }
 
-void AddDecoderPath(std::vector<BrokerFilePermission>* permissions) {
-  base::FilePath lib_path = GetLibFolder().AppendASCII(kLibImeDecoderName);
-  permissions->push_back(BrokerFilePermission::ReadOnly(lib_path.value()));
+void AddSharedLibraryAndDepsPath(
+    std::vector<BrokerFilePermission>* permissions) {
+  // Where IME decoder shared library and its dependencies will live.
+  static const char* kReadOnlyLibDirs[] =
+#if defined(__x86_64__) || defined(__aarch64__)
+      {"/usr/lib64", "/lib64"};
+#else
+      {"/usr/lib", "/lib"};
+#endif
+
+  for (const char* dir : kReadOnlyLibDirs) {
+    std::string path(dir);
+    permissions->push_back(
+        BrokerFilePermission::StatOnlyWithIntermediateDirs(path));
+    permissions->push_back(BrokerFilePermission::ReadOnlyRecursive(path + "/"));
+  }
 }
 
 void AddBundleFolder(std::vector<BrokerFilePermission>* permissions) {
@@ -98,10 +100,11 @@
   // user dictionary can not be saved.
   bool success = CreateFolderIfNotExist(kUserHomePath);
   if (!success) {
-    LOG(WARNING) << "Unable to create ime folder under user profile folder";
+    LOG(WARNING) << "Unable to create IME folder under user profile folder";
+    return;
   }
-  // Still need to push this path, otherwise process will crash directly when
-  // decoder tries to access this folder.
+  // Push this path, otherwise process will crash directly when IME decoder
+  // tries to access this folder.
   permissions->push_back(
       BrokerFilePermission::ReadWriteCreateRecursive(kUserHomePath));
 }
@@ -111,7 +114,8 @@
   std::vector<BrokerFilePermission> permissions{
       BrokerFilePermission::ReadOnly("/dev/urandom"),
       BrokerFilePermission::ReadOnly("/sys/devices/system/cpu")};
-  AddDecoderPath(&permissions);
+
+  AddSharedLibraryAndDepsPath(&permissions);
   AddBundleFolder(&permissions);
   AddUserDataFolder(&permissions);
   AddSharedDataFolderIfEnabled(&permissions);
@@ -123,9 +127,11 @@
 bool ImePreSandboxHook(service_manager::SandboxLinux::Options options) {
   auto* instance = service_manager::SandboxLinux::GetInstance();
   instance->StartBrokerProcess(MakeBrokerCommandSet({
+                                   sandbox::syscall_broker::COMMAND_ACCESS,
                                    sandbox::syscall_broker::COMMAND_OPEN,
                                    sandbox::syscall_broker::COMMAND_MKDIR,
                                    sandbox::syscall_broker::COMMAND_STAT,
+                                   sandbox::syscall_broker::COMMAND_STAT64,
                                    sandbox::syscall_broker::COMMAND_RENAME,
                                    sandbox::syscall_broker::COMMAND_UNLINK,
                                }),
diff --git a/components/arc/arc_prefs.cc b/components/arc/arc_prefs.cc
index 75a1811..9b2b91b 100644
--- a/components/arc/arc_prefs.cc
+++ b/components/arc/arc_prefs.cc
@@ -126,23 +126,11 @@
     "settings.voice_interaction.context.enabled";
 // A preference that indicates the user has enabled voice interaction services.
 const char kVoiceInteractionEnabled[] = "settings.voice_interaction.enabled";
-// A preference that indicates the user has chosen to always keep hotword
-// listening on even withough DSP support.
-const char kVoiceInteractionHotwordAlwaysOn[] =
-    "settings.voice_interaction.hotword.always_on";
 // A preference that indicates the user has allowed voice interaction services
 // to use hotword listening. This preference can be overridden by the
 // VoiceInteractionHotwordEnabled administrator policy.
 const char kVoiceInteractionHotwordEnabled[] =
     "settings.voice_interaction.hotword.enabled";
-// A preference that indicates whether microphone should be open when the voice
-// interaction launches.
-const char kVoiceInteractionLaunchWithMicOpen[] =
-    "settings.voice_interaction.launch_with_mic_open";
-// A preference that indicates the user has allowed voice interaction services
-// to send notification.
-const char kVoiceInteractionNotificationEnabled[] =
-    "settings.voice_interaction.notification.enabled";
 
 // ======== LOCAL STATE PREFS ========
 
@@ -201,10 +189,7 @@
   registry->RegisterTimeDeltaPref(kEngagementTimeTotal, base::TimeDelta());
   registry->RegisterBooleanPref(kVoiceInteractionContextEnabled, false);
   registry->RegisterBooleanPref(kVoiceInteractionEnabled, false);
-  registry->RegisterBooleanPref(kVoiceInteractionHotwordAlwaysOn, false);
   registry->RegisterBooleanPref(kVoiceInteractionHotwordEnabled, false);
-  registry->RegisterBooleanPref(kVoiceInteractionNotificationEnabled, true);
-  registry->RegisterBooleanPref(kVoiceInteractionLaunchWithMicOpen, false);
 }
 
 }  // namespace prefs
diff --git a/components/arc/arc_prefs.h b/components/arc/arc_prefs.h
index 552ad69..671128c 100644
--- a/components/arc/arc_prefs.h
+++ b/components/arc/arc_prefs.h
@@ -48,10 +48,7 @@
 // TODO(b/110211045): Move Assistant related prefs to ash.
 ARC_EXPORT extern const char kVoiceInteractionContextEnabled[];
 ARC_EXPORT extern const char kVoiceInteractionEnabled[];
-ARC_EXPORT extern const char kVoiceInteractionHotwordAlwaysOn[];
 ARC_EXPORT extern const char kVoiceInteractionHotwordEnabled[];
-ARC_EXPORT extern const char kVoiceInteractionLaunchWithMicOpen[];
-ARC_EXPORT extern const char kVoiceInteractionNotificationEnabled[];
 
 // Local state prefs in lexicographical order.
 ARC_EXPORT extern const char kStabilityMetrics[];
diff --git a/components/arc/common/intent_helper.mojom b/components/arc/common/intent_helper.mojom
index 675db19..ab63854 100644
--- a/components/arc/common/intent_helper.mojom
+++ b/components/arc/common/intent_helper.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 28
+// Next MinVersion: 29
 
 module arc.mojom;
 
@@ -171,9 +171,14 @@
   [MinVersion=26] OnOpenInChromeClicked@0();
 };
 
+enum CameraIntentMode {
+  PHOTO,
+  VIDEO,
+};
+
 // Handles intents from ARC in Chrome.
 // Deprecated method ID: 4
-// Next method ID: 12
+// Next method ID: 13
 interface IntentHelperHost {
   // Called when icons associated with the package are no longer up to date.
   [MinVersion=3] OnIconInvalidated@1(string package_name);
@@ -224,6 +229,21 @@
   // Does a reset of ARC; this wipes /data, and then re-calls on OOBE for
   // account binding to happen again, as if the user just went through OOBE.
   [MinVersion=27] FactoryResetArc@11();
+
+  // Launches camera app from the camera intent.
+  // |mode| indicates which mode should camera app land on. If
+  // |should_handle_result| is true, the intent expects the captured result
+  // will be returned after capturing. If |should_down_scale| is true, the
+  // intent expects the captured image would be down-scaled to a small enough
+  // size. If |is_secure| is true, the intent is fired when the device is
+  // secured, which means the camera app should not show any user-sensitive
+  // data. |is_success| indicates that the capture is done successfully. If it
+  // succeed, the result should be filled in |captured_data| as a byte array.
+  [MinVersion=28] LaunchCameraApp@12(CameraIntentMode mode,
+                                     bool should_handle_result,
+                                     bool should_down_scale,
+                                     bool is_secure)
+      => (bool is_success, array<uint8> captured_data);
 };
 
 // Sends intents to ARC on behalf of Chrome.
diff --git a/components/arc/ime/OWNERS b/components/arc/ime/OWNERS
index 4a76891b..9d5fb32 100644
--- a/components/arc/ime/OWNERS
+++ b/components/arc/ime/OWNERS
@@ -1,2 +1,4 @@
 kinaba@chromium.org
 yhanada@chromium.org
+
+# COMPONENT: UI>Input>Text>IME
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.cc b/components/arc/intent_helper/arc_intent_helper_bridge.cc
index 91b3c31..9773596b 100644
--- a/components/arc/intent_helper/arc_intent_helper_bridge.cc
+++ b/components/arc/intent_helper/arc_intent_helper_bridge.cc
@@ -115,6 +115,7 @@
                                              ArcBridgeService* bridge_service)
     : context_(context),
       arc_bridge_service_(bridge_service),
+      camera_intent_id_(0),
       allowed_arc_schemes_(std::cbegin(kArcSchemes), std::cend(kArcSchemes)) {
   arc_bridge_service_->intent_helper()->SetHost(this);
 }
@@ -221,6 +222,30 @@
   UMA_HISTOGRAM_ENUMERATION("Arc.ShareFilesOnExit", flag);
 }
 
+void ArcIntentHelperBridge::LaunchCameraApp(arc::mojom::CameraIntentMode mode,
+                                            bool should_handle_result,
+                                            bool should_down_scale,
+                                            bool is_secure,
+                                            LaunchCameraAppCallback callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  launch_camera_app_callback_map_.emplace(camera_intent_id_,
+                                          std::move(callback));
+
+  base::DictionaryValue intent_info;
+  std::string mode_str =
+      mode == arc::mojom::CameraIntentMode::PHOTO ? "photo" : "video";
+
+  std::stringstream queries;
+  queries << "?intentId=" << camera_intent_id_ << "&mode=" << mode_str
+          << "&shouldHandleResult=" << should_handle_result
+          << "&shouldDownScale=" << should_down_scale
+          << "&isSecure=" << is_secure;
+  ash::NewWindowDelegate::GetInstance()->LaunchCameraApp(queries.str());
+
+  camera_intent_id_++;
+}
+
 ArcIntentHelperBridge::GetResult ArcIntentHelperBridge::GetActivityIcons(
     const std::vector<ActivityName>& activities,
     OnIconsReadyCallback callback) {
@@ -258,6 +283,16 @@
   return observer_list_.HasObserver(observer);
 }
 
+void ArcIntentHelperBridge::OnCameraIntentHandled(
+    uint32_t intent_id,
+    bool is_success,
+    const std::vector<uint8_t>& captured_data) {
+  CHECK(launch_camera_app_callback_map_.find(intent_id) !=
+        launch_camera_app_callback_map_.end());
+  std::move(launch_camera_app_callback_map_[intent_id])
+      .Run(is_success, captured_data);
+}
+
 // static
 bool ArcIntentHelperBridge::IsIntentHelperPackage(
     const std::string& package_name) {
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.h b/components/arc/intent_helper/arc_intent_helper_bridge.h
index 3f91d9b..94d7f97 100644
--- a/components/arc/intent_helper/arc_intent_helper_bridge.h
+++ b/components/arc/intent_helper/arc_intent_helper_bridge.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/threading/thread_checker.h"
@@ -33,9 +34,8 @@
 class OpenUrlDelegate;
 
 // Receives intents from ARC.
-class ArcIntentHelperBridge
-    : public KeyedService,
-      public mojom::IntentHelperHost {
+class ArcIntentHelperBridge : public KeyedService,
+                              public mojom::IntentHelperHost {
  public:
   // Returns singleton instance for the given BrowserContext,
   // or nullptr if the browser |context| is not allowed to use ARC.
@@ -61,6 +61,10 @@
   void RemoveObserver(ArcIntentHelperObserver* observer);
   bool HasObserver(ArcIntentHelperObserver* observer) const;
 
+  void OnCameraIntentHandled(uint32_t intent_id,
+                             bool is_success,
+                             const std::vector<uint8_t>& captured_data);
+
   // mojom::IntentHelperHost
   void OnIconInvalidated(const std::string& package_name) override;
   void OnIntentFiltersUpdated(
@@ -79,6 +83,11 @@
   void FactoryResetArc() override;
   void OnOpenWebApp(const std::string& url) override;
   void RecordShareFilesMetrics(mojom::ShareFiles flag) override;
+  void LaunchCameraApp(arc::mojom::CameraIntentMode mode,
+                       bool should_handle_result,
+                       bool should_down_scale,
+                       bool is_secure,
+                       LaunchCameraAppCallback callback) override;
 
   // Retrieves icons for the |activities| and calls |callback|.
   // See ActivityIconLoader::GetActivityIcons() for more details.
@@ -123,6 +132,11 @@
 
   base::ObserverList<ArcIntentHelperObserver>::Unchecked observer_list_;
 
+  base::flat_map<uint32_t, LaunchCameraAppCallback>
+      launch_camera_app_callback_map_;
+
+  uint32_t camera_intent_id_;
+
   // Schemes that ARC is known to send via OnOpenUrl.
   const std::set<std::string> allowed_arc_schemes_;
 
diff --git a/components/autofill_strings_grdp/OWNERS b/components/autofill_strings_grdp/OWNERS
index 50a21bb..36368efa 100644
--- a/components/autofill_strings_grdp/OWNERS
+++ b/components/autofill_strings_grdp/OWNERS
@@ -1 +1,2 @@
 file://components/autofill/OWNERS
+# COMPONENT: UI>Browser>Autofill
diff --git a/components/cast_certificate/OWNERS b/components/cast_certificate/OWNERS
index ca8567d..79022c3e 100644
--- a/components/cast_certificate/OWNERS
+++ b/components/cast_certificate/OWNERS
@@ -1,3 +1,4 @@
 file://chromecast/OWNERS
 dougsteed@chromium.org
-# COMPONENT: Internals>Network>Certificate
+
+# COMPONENT: Chromecast
diff --git a/components/cronet/stale_host_resolver_unittest.cc b/components/cronet/stale_host_resolver_unittest.cc
index bbe32a619..1232471 100644
--- a/components/cronet/stale_host_resolver_unittest.cc
+++ b/components/cronet/stale_host_resolver_unittest.cc
@@ -185,10 +185,8 @@
     if (dns_client) {
       inner_resolver->GetManagerForTesting()->SetDnsClientForTesting(
           std::move(dns_client));
-      inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(true);
     } else {
-      inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(
-          false);
+      inner_resolver->GetManagerForTesting()->SetDnsClientEnabled(false);
     }
     return inner_resolver;
   }
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index d3e297e..c27fa41 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -679,8 +679,7 @@
     CHECK(net_log) << "All DNS-related experiments require NetLog.";
     std::unique_ptr<net::HostResolver> host_resolver;
     net::HostResolver::ManagerOptions host_resolver_manager_options;
-    host_resolver_manager_options.insecure_dns_client_enabled =
-        async_dns_enable;
+    host_resolver_manager_options.dns_client_enabled = async_dns_enable;
     host_resolver_manager_options.check_ipv6_on_wifi = !disable_ipv6_on_wifi;
     // TODO(crbug.com/934402): Consider using a shared HostResolverManager for
     // Cronet HostResolvers.
diff --git a/components/gcm_driver/common/gcm_message.cc b/components/gcm_driver/common/gcm_message.cc
index 196f946..2ea4761 100644
--- a/components/gcm_driver/common/gcm_message.cc
+++ b/components/gcm_driver/common/gcm_message.cc
@@ -10,19 +10,19 @@
 const int OutgoingMessage::kMaximumTTL = 24 * 60 * 60;  // 1 day.
 const int WebPushMessage::kMaximumTTL = 24 * 60 * 60;   // 1 day.
 
-OutgoingMessage::OutgoingMessage() : time_to_live(kMaximumTTL) {}
+OutgoingMessage::OutgoingMessage() = default;
 
 OutgoingMessage::OutgoingMessage(const OutgoingMessage& other) = default;
 
 OutgoingMessage::~OutgoingMessage() = default;
 
-IncomingMessage::IncomingMessage() : decrypted(false) {}
+IncomingMessage::IncomingMessage() = default;
 
 IncomingMessage::IncomingMessage(const IncomingMessage& other) = default;
 
 IncomingMessage::~IncomingMessage() = default;
 
-WebPushMessage::WebPushMessage() : time_to_live(kMaximumTTL) {}
+WebPushMessage::WebPushMessage() = default;
 
 WebPushMessage::WebPushMessage(WebPushMessage&& other) = default;
 
diff --git a/components/gcm_driver/common/gcm_message.h b/components/gcm_driver/common/gcm_message.h
index 7d7dc4e..b3a2a17 100644
--- a/components/gcm_driver/common/gcm_message.h
+++ b/components/gcm_driver/common/gcm_message.h
@@ -25,7 +25,7 @@
   // Message ID.
   std::string id;
   // In seconds.
-  int time_to_live;
+  int time_to_live = kMaximumTTL;
   MessageData data;
 
   static const int kMaximumTTL;
@@ -45,7 +45,7 @@
 
   // Whether the contents of the message have been decrypted, and are
   // available in |raw_data|.
-  bool decrypted;
+  bool decrypted = false;
 };
 
 // Message to be delivered to the other party via Web Push.
@@ -55,9 +55,19 @@
   ~WebPushMessage();
   WebPushMessage& operator=(WebPushMessage&& other);
 
+  // Urgency of a WebPushMessage as defined in RFC 8030 section 5.3.
+  // https://tools.ietf.org/html/rfc8030#section-5.3
+  enum class Urgency {
+    kVeryLow,
+    kLow,
+    kNormal,
+    kHigh,
+  };
+
   // In seconds.
-  int time_to_live;
+  int time_to_live = kMaximumTTL;
   std::string payload;
+  Urgency urgency = Urgency::kNormal;
 
   static const int kMaximumTTL;
 
diff --git a/components/gcm_driver/web_push_sender.cc b/components/gcm_driver/web_push_sender.cc
index 2976db5..30b28608 100644
--- a/components/gcm_driver/web_push_sender.cc
+++ b/components/gcm_driver/web_push_sender.cc
@@ -8,6 +8,7 @@
 
 #include "base/base64url.h"
 #include "base/bind.h"
+#include "base/no_destructor.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "components/gcm_driver/common/gcm_message.h"
@@ -39,6 +40,7 @@
 
 // HTTP header constants.
 const char kTTL[] = "TTL";
+const char kUrgency[] = "Urgency";
 
 const char kContentEncodingProperty[] = "content-encoding";
 const char kContentCodingAes128Gcm[] = "aes128gcm";
@@ -77,9 +79,23 @@
                             base64_public_key.c_str());
 }
 
+std::string GetUrgencyHeader(WebPushMessage::Urgency urgency) {
+  switch (urgency) {
+    case WebPushMessage::Urgency::kVeryLow:
+      return "very-low";
+    case WebPushMessage::Urgency::kLow:
+      return "low";
+    case WebPushMessage::Urgency::kNormal:
+      return "normal";
+    case WebPushMessage::Urgency::kHigh:
+      return "high";
+  }
+}
+
 std::unique_ptr<network::SimpleURLLoader> BuildURLLoader(
     const std::string& fcm_token,
     int time_to_live,
+    const std::string& urgency_header,
     const std::string& auth_header,
     const std::string& message) {
   auto resource_request = std::make_unique<network::ResourceRequest>();
@@ -94,6 +110,7 @@
   resource_request->headers.SetHeader(kTTL, base::NumberToString(time_to_live));
   resource_request->headers.SetHeader(kContentEncodingProperty,
                                       kContentCodingAes128Gcm);
+  resource_request->headers.SetHeader(kUrgency, urgency_header);
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("web_push_message", R"(
@@ -151,7 +168,8 @@
 
   LogSendWebPushMessagePayloadSize(message.payload.size());
   std::unique_ptr<network::SimpleURLLoader> url_loader = BuildURLLoader(
-      fcm_token, message.time_to_live, *auth_header, message.payload);
+      fcm_token, message.time_to_live, GetUrgencyHeader(message.urgency),
+      *auth_header, message.payload);
   url_loader->DownloadToString(
       url_loader_factory_.get(),
       base::BindOnce(&WebPushSender::OnMessageSent,
diff --git a/components/gcm_driver/web_push_sender_unittest.cc b/components/gcm_driver/web_push_sender_unittest.cc
index 9d40d6be..b12bd70 100644
--- a/components/gcm_driver/web_push_sender_unittest.cc
+++ b/components/gcm_driver/web_push_sender_unittest.cc
@@ -121,6 +121,46 @@
   ASSERT_EQ("message_id", message_id);
 }
 
+struct WebPushUrgencyTestData {
+  const WebPushMessage::Urgency urgency;
+  const std::string expected_header;
+} kWebPushUrgencyTestData[] = {
+    {WebPushMessage::Urgency::kVeryLow, "very-low"},
+    {WebPushMessage::Urgency::kLow, "low"},
+    {WebPushMessage::Urgency::kNormal, "normal"},
+    {WebPushMessage::Urgency::kHigh, "high"},
+};
+
+class WebPushUrgencyTest
+    : public WebPushSenderTest,
+      public testing::WithParamInterface<WebPushUrgencyTestData> {};
+
+TEST_P(WebPushUrgencyTest, SetUrgencyTest) {
+  std::string private_key_info;
+  ASSERT_TRUE(base::Base64Decode(kPrivateKey, &private_key_info));
+  std::unique_ptr<crypto::ECPrivateKey> private_key =
+      crypto::ECPrivateKey::CreateFromPrivateKeyInfo(std::vector<uint8_t>(
+          private_key_info.begin(), private_key_info.end()));
+  base::Optional<std::string> message_id;
+  std::string urgency;
+
+  WebPushMessage message = CreateMessage();
+  message.urgency = GetParam().urgency;
+
+  sender()->SendMessage("token", private_key.get(), message, base::DoNothing());
+  ASSERT_EQ(loader().NumPending(), 1);
+  net::HttpRequestHeaders headers =
+      loader().GetPendingRequest(0)->request.headers;
+
+  ASSERT_TRUE(headers.GetHeader("Urgency", &urgency));
+  ASSERT_EQ(GetParam().expected_header, urgency);
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    WebPushUrgencyTest,
+    testing::ValuesIn(kWebPushUrgencyTestData));
+
 TEST_F(WebPushSenderTest, ServerErrorTest) {
   std::string private_key_info;
   ASSERT_TRUE(base::Base64Decode(kPrivateKey, &private_key_info));
diff --git a/components/grpc_support/OWNERS b/components/grpc_support/OWNERS
index cbf0090..f8ceada1 100644
--- a/components/grpc_support/OWNERS
+++ b/components/grpc_support/OWNERS
@@ -1,3 +1,5 @@
 gcasto@chromium.org
 xyzzyz@chromium.org
 file://net/OWNERS
+# COMPONENT: Internals>Network>Library
+# TEAM: net-dev@chromium.org
diff --git a/components/infobars/OWNERS b/components/infobars/OWNERS
index ffecf3cd..7074f8ba 100644
--- a/components/infobars/OWNERS
+++ b/components/infobars/OWNERS
@@ -2,3 +2,4 @@
 pkasting@chromium.org
 
 # COMPONENT: UI>Browser>Infobars
+# TEAM: chromium-reviews@chromium.org
diff --git a/components/location/OWNERS b/components/location/OWNERS
index 5140571..966eb95 100644
--- a/components/location/OWNERS
+++ b/components/location/OWNERS
@@ -1,2 +1,3 @@
 jyasskin@chromium.org
 tedchoc@chromium.org
+# COMPONENT: Blink>Location
diff --git a/components/metrics/OWNERS b/components/metrics/OWNERS
index e20d9e7..41c1f554 100644
--- a/components/metrics/OWNERS
+++ b/components/metrics/OWNERS
@@ -5,3 +5,4 @@
 per-file DEPS=wittman@chromium.org
 
 # COMPONENT: Internals>Metrics
+# TEAM: chromium-dev@chromium.org
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashTestRule.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashTestRule.java
index e9ddcab..6ccb813 100644
--- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashTestRule.java
+++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/CrashTestRule.java
@@ -4,8 +4,6 @@
 
 package org.chromium.components.minidump_uploader;
 
-import android.support.test.InstrumentationRegistry;
-
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
@@ -51,8 +49,6 @@
     }
 
     private void setUp() throws Exception {
-        ContextUtils.initApplicationContextForTests(
-                InstrumentationRegistry.getTargetContext().getApplicationContext());
         LibraryLoader.getInstance().ensureInitialized(LibraryProcessType.PROCESS_BROWSER);
         if (mCacheDir == null) {
             mCacheDir = getExistingCacheDir();
diff --git a/components/password_manager/core/browser/form_parsing/form_parser.cc b/components/password_manager/core/browser/form_parsing/form_parser.cc
index 0903d07..452d023 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser.cc
@@ -390,17 +390,18 @@
       case AutocompleteFlag::kUsername:
         if (processed_field.is_password || result->username)
           continue;
-
         username_fields_found++;
         field_marked_as_username = processed_field.field;
         break;
       case AutocompleteFlag::kCurrentPassword:
-        if (!processed_field.is_password || result->password)
+        if (!processed_field.is_password || result->password ||
+            processed_field.server_hints_not_password)
           continue;
         result->password = processed_field.field;
         break;
       case AutocompleteFlag::kNewPassword:
-        if (!processed_field.is_password || new_password_found_by_server)
+        if (!processed_field.is_password || new_password_found_by_server ||
+            processed_field.server_hints_not_password)
           continue;
         // The first field with autocomplete=new-password is considered to be
         // new_password and the second is confirmation_password.
diff --git a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
index fad8926f..72ea19d6 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
@@ -1520,6 +1520,40 @@
   });
 }
 
+// The parser should avoid identifying NOT_PASSWORD fields as passwords.
+TEST(FormParserTest, NotPasswordFieldDespiteAutocompleteAttribute) {
+  CheckTestData({
+      {
+          "Server hints: NOT_PASSWORD.",
+          {
+              {.role = ElementRole::USERNAME, .form_control_type = "text"},
+              {.form_control_type = "password",
+               .prediction = {.type = autofill::NOT_PASSWORD},
+               .autocomplete_attribute = "current-password"},
+              {.form_control_type = "password",
+               .prediction = {.type = autofill::NOT_PASSWORD},
+               .autocomplete_attribute = "new-password"},
+              {.form_control_type = "password",
+               .prediction = {.type = autofill::NOT_PASSWORD},
+               .autocomplete_attribute = "password"},
+              {.role = ElementRole::CURRENT_PASSWORD,
+               .form_control_type = "password"},
+          },
+          .fallback_only = false,
+      },
+      {
+          "Server hints: NOT_PASSWORD on only password.",
+          {
+              {.role = ElementRole::USERNAME, .form_control_type = "text"},
+              {.role = ElementRole::CURRENT_PASSWORD,
+               .prediction = {.type = autofill::NOT_PASSWORD},
+               .form_control_type = "password"},
+          },
+          .fallback_only = true,
+      },
+  });
+}
+
 // Check that "readonly status" is reported accordingly.
 TEST(FormParserTest, ReadonlyStatus) {
   CheckTestData({
diff --git a/components/password_manager/core/browser/password_reuse_detection_manager.cc b/components/password_manager/core/browser/password_reuse_detection_manager.cc
index 868efc1..28c43c6 100644
--- a/components/password_manager/core/browser/password_reuse_detection_manager.cc
+++ b/components/password_manager/core/browser/password_reuse_detection_manager.cc
@@ -124,6 +124,8 @@
                                  matching_domains.size(),
                                  password_field_detected, reused_password_type);
 #if defined(FULL_SAFE_BROWSING)
+  // TODO(crbug/1673863): Log password reuse event for signed in non sync
+  // account.
   if (reused_password_type ==
       metrics_util::PasswordType::PRIMARY_ACCOUNT_PASSWORD)
     client_->LogPasswordReuseDetectedEvent();
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index dd754292..42a1d93 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -16276,6 +16276,26 @@
       Currently, the number of print servers is limited to 16. Only the first 16 print servers from the list will be queried.
       ''',
     },
+    {
+      'name': 'VmManagementCliAllowed',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:77-'],
+      'future': True,
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True,
+      },
+      'example_value': False,
+      'id': 577,
+      'caption': '''Specify VM CLI permission''',
+      'tags': [],
+      'desc': '''Instructs <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> to enable or disable virtual machine management console tools.
+
+      If the policy is set to true or left unset, the user will be able to use VM management CLI.
+      Otherwise, all of VM management CLI is disabled and hidden.
+      ''',
+    },
   ],
 
   'messages': {
@@ -17069,6 +17089,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 546, 562],
-  'highest_id_currently_used': 576,
+  'highest_id_currently_used': 577,
   'highest_atomic_group_id_currently_used': 37
 }
diff --git a/components/pref_registry/OWNERS b/components/pref_registry/OWNERS
index 17dc7671..ef0ab79 100644
--- a/components/pref_registry/OWNERS
+++ b/components/pref_registry/OWNERS
@@ -2,3 +2,4 @@
 gab@chromium.org
 
 # COMPONENT: UI>Browser>Preferences
+# TEAM: chromium-dev@chromium.org
diff --git a/components/prefs/OWNERS b/components/prefs/OWNERS
index 17dc7671..ef0ab79 100644
--- a/components/prefs/OWNERS
+++ b/components/prefs/OWNERS
@@ -2,3 +2,4 @@
 gab@chromium.org
 
 # COMPONENT: UI>Browser>Preferences
+# TEAM: chromium-dev@chromium.org
diff --git a/components/rappor/BUILD.gn b/components/rappor/BUILD.gn
index 2b18b9d..cdc94720 100644
--- a/components/rappor/BUILD.gn
+++ b/components/rappor/BUILD.gn
@@ -56,7 +56,7 @@
 
   public_deps = [
     "//base",
-    "//components/rappor/public/interfaces",
+    "//components/rappor/public/mojom",
   ]
 
   deps = [
diff --git a/components/rappor/public/interfaces/BUILD.gn b/components/rappor/public/mojom/BUILD.gn
similarity index 93%
rename from components/rappor/public/interfaces/BUILD.gn
rename to components/rappor/public/mojom/BUILD.gn
index 2a16142..a67538c 100644
--- a/components/rappor/public/interfaces/BUILD.gn
+++ b/components/rappor/public/mojom/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 
-mojom("interfaces") {
+mojom("mojom") {
   sources = [
     "rappor_recorder.mojom",
   ]
diff --git a/components/rappor/public/interfaces/OWNERS b/components/rappor/public/mojom/OWNERS
similarity index 100%
rename from components/rappor/public/interfaces/OWNERS
rename to components/rappor/public/mojom/OWNERS
diff --git a/components/rappor/public/interfaces/rappor_recorder.mojom b/components/rappor/public/mojom/rappor_recorder.mojom
similarity index 100%
rename from components/rappor/public/interfaces/rappor_recorder.mojom
rename to components/rappor/public/mojom/rappor_recorder.mojom
diff --git a/components/rappor/rappor_recorder_impl.h b/components/rappor/rappor_recorder_impl.h
index 103b4cd..8714a5ff 100644
--- a/components/rappor/rappor_recorder_impl.h
+++ b/components/rappor/rappor_recorder_impl.h
@@ -6,7 +6,7 @@
 #define COMPONENTS_RAPPOR_RAPPOR_RECORDER_IMPL_H_
 
 #include "base/threading/thread_checker.h"
-#include "components/rappor/public/interfaces/rappor_recorder.mojom.h"
+#include "components/rappor/public/mojom/rappor_recorder.mojom.h"
 
 class GURL;
 
diff --git a/components/reading_list/OWNERS b/components/reading_list/OWNERS
index c6815f7..918a15b 100644
--- a/components/reading_list/OWNERS
+++ b/components/reading_list/OWNERS
@@ -1,2 +1,4 @@
 noyau@chromium.org
 olivierrobin@chromium.org
+# COMPONENT: UI>Browser>ReaderMode
+# TEAM: ios-directory-owners@chromium.org
diff --git a/components/safe_browsing/browser/threat_details.cc b/components/safe_browsing/browser/threat_details.cc
index 9174f09..1c85e99 100644
--- a/components/safe_browsing/browser/threat_details.cc
+++ b/components/safe_browsing/browser/threat_details.cc
@@ -404,7 +404,7 @@
       is_all_done_(false) {}
 
 ThreatDetails::~ThreatDetails() {
-  DCHECK(all_done_expected_ == is_all_done_);
+  DCHECK_EQ(all_done_expected_, is_all_done_);
 }
 
 bool ThreatDetails::IsReportableUrl(const GURL& url) const {
diff --git a/components/safe_browsing/password_protection/metrics_util.cc b/components/safe_browsing/password_protection/metrics_util.cc
index 80607004..f9606d05 100644
--- a/components/safe_browsing/password_protection/metrics_util.cc
+++ b/components/safe_browsing/password_protection/metrics_util.cc
@@ -64,9 +64,7 @@
 
   bool is_gsuite_user =
       password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
-  bool is_gmail_user =
-      password_account_type.account_type() == ReusedPasswordAccountType::GMAIL;
-  bool is_primary_account_password = is_gsuite_user || is_gmail_user;
+  bool is_primary_account_password = password_account_type.is_account_syncing();
   // TODO(crbug/914410): Differentiate between primary and syncing accounts for
   // UMA.
   if (is_primary_account_password) {
@@ -93,23 +91,16 @@
 void LogPasswordAlertModeOutcome(
     RequestOutcome outcome,
     ReusedPasswordAccountType password_account_type) {
-  bool is_gsuite_user =
-      password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
-  bool is_gmail_user =
-      password_account_type.account_type() == ReusedPasswordAccountType::GMAIL;
-  bool is_primary_account_password = is_gsuite_user || is_gmail_user;
-
-  if (is_primary_account_password) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "PasswordProtection.PasswordAlertModeOutcome.GSuiteSyncPasswordEntry",
-        outcome);
-  } else {
-    DCHECK_EQ(ReusedPasswordAccountType::NON_GAIA_ENTERPRISE,
-              password_account_type.account_type());
+  if (password_account_type.account_type() ==
+      ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
     UMA_HISTOGRAM_ENUMERATION(
         "PasswordProtection.PasswordAlertModeOutcome."
         "NonGaiaEnterprisePasswordEntry",
         outcome);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION(
+        "PasswordProtection.PasswordAlertModeOutcome.GSuiteSyncPasswordEntry",
+        outcome);
   }
 }
 
@@ -130,11 +121,10 @@
     LoginReputationClientRequest::TriggerType trigger_type,
     ReusedPasswordAccountType password_account_type,
     VerdictType verdict_type) {
+  // TODO(crbug/914410): Account for non sync users.
   bool is_gsuite_user =
       password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
-  bool is_gmail_user =
-      password_account_type.account_type() == ReusedPasswordAccountType::GMAIL;
-  bool is_primary_account_password = is_gsuite_user || is_gmail_user;
+  bool is_primary_account_password = password_account_type.is_account_syncing();
   switch (trigger_type) {
     case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE:
       UMA_HISTOGRAM_ENUMERATION(
@@ -199,11 +189,11 @@
       ui_type == WarningUIType::INTERSTITIAL) {
     return;
   }
+
+  // TODO(crbug/914410): Account for non sync users.
   bool is_gsuite_user =
       password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
-  bool is_gmail_user =
-      password_account_type.account_type() == ReusedPasswordAccountType::GMAIL;
-  bool is_primary_account_password = is_gsuite_user || is_gmail_user;
+  bool is_primary_account_password = password_account_type.is_account_syncing();
   switch (ui_type) {
     case WarningUIType::PAGE_INFO:
       if (is_primary_account_password) {
diff --git a/components/safe_browsing/password_protection/mock_password_protection_service.h b/components/safe_browsing/password_protection/mock_password_protection_service.h
index c0e04b5..7d41cb2b 100644
--- a/components/safe_browsing/password_protection/mock_password_protection_service.h
+++ b/components/safe_browsing/password_protection/mock_password_protection_service.h
@@ -30,21 +30,25 @@
                      PasswordProtectionTrigger());
   MOCK_CONST_METHOD0(GetCurrentContentAreaSize, gfx::Size());
   MOCK_CONST_METHOD0(GetAccountInfo, AccountInfo());
+  MOCK_CONST_METHOD0(IsPrimaryAccountSyncing, bool());
+  MOCK_CONST_METHOD0(IsPrimaryAccountSignedIn, bool());
+  MOCK_CONST_METHOD0(IsPrimaryAccountGmail, bool());
+  MOCK_CONST_METHOD1(IsOtherGaiaAccountSignedIn, bool(const std::string&));
   MOCK_CONST_METHOD2(IsURLWhitelistedForPasswordEntry,
                      bool(const GURL&, RequestOutcome*));
 
   MOCK_METHOD0(IsExtendedReporting, bool());
   MOCK_METHOD0(IsIncognito, bool());
   MOCK_METHOD0(IsHistorySyncEnabled, bool());
-  MOCK_METHOD0(IsAccountSyncing, bool());
   MOCK_METHOD0(IsUnderAdvancedProtection, bool());
   MOCK_METHOD0(ReportPasswordChanged, void());
   MOCK_METHOD1(MaybeLogPasswordReuseDetectedEvent, void(content::WebContents*));
   MOCK_METHOD1(UserClickedThroughSBInterstitial, bool(content::WebContents*));
   MOCK_METHOD2(ShowInterstitial, void(content::WebContents*, PasswordType));
-  MOCK_METHOD3(IsPingingEnabled,
+  MOCK_METHOD4(IsPingingEnabled,
                bool(LoginReputationClientRequest::TriggerType,
                     PasswordType,
+                    const std::string&,
                     RequestOutcome*));
   MOCK_METHOD3(ShowModalWarning,
                void(content::WebContents*, const std::string&, PasswordType));
@@ -73,13 +77,11 @@
                     const GURL&,
                     const GURL&,
                     const std::string&));
-  MOCK_METHOD8(MaybeStartProtectedPasswordEntryRequest,
+  MOCK_METHOD6(MaybeStartProtectedPasswordEntryRequest,
                void(content::WebContents*,
                     const GURL&,
                     const std::string&,
                     PasswordType,
-                    const std::string,
-                    bool,
                     const std::vector<std::string>&,
                     bool));
 
diff --git a/components/safe_browsing/password_protection/password_protection_request.cc b/components/safe_browsing/password_protection/password_protection_request.cc
index 4b738d6..f7236da 100644
--- a/components/safe_browsing/password_protection/password_protection_request.cc
+++ b/components/safe_browsing/password_protection/password_protection_request.cc
@@ -72,7 +72,6 @@
     const GURL& password_form_frame_url,
     const std::string& username,
     PasswordType password_type,
-    bool is_account_syncing,
     const std::vector<std::string>& matching_domains,
     LoginReputationClientRequest::TriggerType type,
     bool password_field_exists,
@@ -84,7 +83,6 @@
       password_form_frame_url_(password_form_frame_url),
       username_(username),
       password_type_(password_type),
-      is_primary_account_syncing_(is_account_syncing),
       matching_domains_(matching_domains),
       trigger_type_(type),
       password_field_exists_(password_field_exists),
@@ -239,13 +237,13 @@
       }
       if (base::FeatureList::IsEnabled(
               safe_browsing::kPasswordProtectionForSignedInUsers)) {
-        ReusedPasswordAccountType* reused_password_account_type =
-            reuse_event->mutable_reused_password_account_type();
-        // TODO(crbug/914410): Add account_type.
-        reused_password_account_type->set_is_account_syncing(
-            is_primary_account_syncing_);
+        ReusedPasswordAccountType password_account_type_to_add =
+            password_protection_service_
+                ->GetPasswordProtectionReusedPasswordAccountType(
+                    password_type_);
+        *reuse_event->mutable_reused_password_account_type() =
+            password_account_type_to_add;
       }
-
       break;
     }
     default:
@@ -464,13 +462,12 @@
   if (outcome != RequestOutcome::CANCELED) {
     ReusedPasswordAccountType password_account_type =
         password_protection_service_
-            ->GetPasswordProtectionReusedPasswordAccountType(
-                password_type_,
-                (password_protection_service_->GetAccountInfo()).hosted_domain);
+            ->GetPasswordProtectionReusedPasswordAccountType(password_type_);
     if (trigger_type_ == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) {
       LogPasswordOnFocusRequestOutcome(outcome);
     } else {
       LogPasswordEntryRequestOutcome(outcome, password_account_type);
+      // TODO(crbug/914410): Account for non sync users.
       if (password_type_ == PasswordType::PRIMARY_ACCOUNT_PASSWORD) {
         password_protection_service_->MaybeLogPasswordReuseLookupEvent(
             web_contents_, outcome, response.get());
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h
index ed86579..54337e5 100644
--- a/components/safe_browsing/password_protection/password_protection_request.h
+++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -61,7 +61,6 @@
                             const GURL& password_form_frame_url,
                             const std::string& username,
                             PasswordType password_type,
-                            bool is_account_syncing,
                             const std::vector<std::string>& matching_origins,
                             LoginReputationClientRequest::TriggerType type,
                             bool password_field_exists,
@@ -188,9 +187,6 @@
   // Type of the reused password.
   const PasswordType password_type_;
 
-  // Whether the user's first currently signed in to Chrome account is syncing.
-  const bool is_primary_account_syncing_;
-
   // Domains from the Password Manager that match this password.
   // Should be non-empty if |reused_password_type_| == SAVED_PASSWORD.
   // Otherwise, may or may not be empty.
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index 9eba2c8f..73167a96 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -24,6 +24,7 @@
 #include "components/password_manager/core/browser/password_reuse_detector.h"
 #include "components/safe_browsing/common/utils.h"
 #include "components/safe_browsing/db/database_manager.h"
+#include "components/safe_browsing/features.h"
 #include "components/safe_browsing/password_protection/password_protection_navigation_throttle.h"
 #include "components/safe_browsing/password_protection/password_protection_request.h"
 #include "components/zoom/zoom_controller.h"
@@ -85,16 +86,18 @@
 bool PasswordProtectionService::ShouldShowModalWarning(
     LoginReputationClientRequest::TriggerType trigger_type,
     PasswordType password_type,
+    const std::string& username,
     LoginReputationClientResponse::VerdictType verdict_type) {
   if (trigger_type != LoginReputationClientRequest::PASSWORD_REUSE_EVENT ||
       !IsSupportedPasswordTypeForModalWarning(password_type)) {
     return false;
   }
 
-  // Shows modal warning for sync password reuse only if user's currently logged
-  // in.
-  if (password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD &&
-      GetSyncAccountType() == PasswordReuseEvent::NOT_SIGNED_IN) {
+  // Accounts are not signed in only in tests.
+  if ((password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD &&
+       !IsPrimaryAccountSignedIn()) ||
+      (password_type == PasswordType::OTHER_GAIA_PASSWORD &&
+       !IsOtherGaiaAccountSignedIn(username))) {
     return false;
   }
 
@@ -126,7 +129,6 @@
     const GURL& password_form_frame_url,
     const std::string& username,
     PasswordType password_type,
-    bool is_account_syncing,
     const std::vector<std::string>& matching_domains,
     LoginReputationClientRequest::TriggerType trigger_type,
     bool password_field_exists) {
@@ -134,9 +136,8 @@
   scoped_refptr<PasswordProtectionRequest> request(
       new PasswordProtectionRequest(
           web_contents, main_frame_url, password_form_action,
-          password_form_frame_url, username, password_type, is_account_syncing,
-          matching_domains, trigger_type, password_field_exists, this,
-          GetRequestTimeoutInMS()));
+          password_form_frame_url, username, password_type, matching_domains,
+          trigger_type, password_field_exists, this, GetRequestTimeoutInMS()));
   request->Start();
   pending_requests_.insert(std::move(request));
 }
@@ -150,11 +151,11 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RequestOutcome reason;
   if (CanSendPing(LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
-                  main_frame_url, PasswordType::PASSWORD_TYPE_UNKNOWN,
-                  hosted_domain, &reason)) {
+                  main_frame_url, PasswordType::PASSWORD_TYPE_UNKNOWN, "",
+                  &reason)) {
     StartRequest(web_contents, main_frame_url, password_form_action,
                  password_form_frame_url, /* username */ "",
-                 PasswordType::PASSWORD_TYPE_UNKNOWN, false,
+                 PasswordType::PASSWORD_TYPE_UNKNOWN,
                  {}, /* matching_domains: not used for this type */
                  LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   }
@@ -165,8 +166,6 @@
     const GURL& main_frame_url,
     const std::string& username,
     PasswordType password_type,
-    const std::string hosted_domain,
-    bool is_account_syncing,
     const std::vector<std::string>& matching_domains,
     bool password_field_exists) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -182,9 +181,9 @@
 
   RequestOutcome reason;
   if (CanSendPing(LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-                  main_frame_url, password_type, hosted_domain, &reason)) {
+                  main_frame_url, password_type, username, &reason)) {
     StartRequest(web_contents, main_frame_url, GURL(), GURL(), username,
-                 password_type, is_account_syncing, matching_domains,
+                 password_type, matching_domains,
                  LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
                  password_field_exists);
   } else {
@@ -199,11 +198,11 @@
     LoginReputationClientRequest::TriggerType trigger_type,
     const GURL& main_frame_url,
     PasswordType password_type,
-    std::string hosted_domain,
+    const std::string& username,
     RequestOutcome* reason) {
   *reason = RequestOutcome::UNKNOWN;
   bool is_pinging_enabled =
-      IsPingingEnabled(trigger_type, password_type, reason);
+      IsPingingEnabled(trigger_type, password_type, username, reason);
   // Pinging is enabled for password_reuse trigger level; however we need to
   // make sure *reason is set appropriately.
   PasswordProtectionTrigger trigger_level =
@@ -215,9 +214,9 @@
       !IsURLWhitelistedForPasswordEntry(main_frame_url, reason)) {
     return true;
   }
-  LogNoPingingReason(trigger_type, *reason,
-                     GetPasswordProtectionReusedPasswordAccountType(
-                         password_type, hosted_domain));
+  LogNoPingingReason(
+      trigger_type, *reason,
+      GetPasswordProtectionReusedPasswordAccountType(password_type));
   return false;
 }
 
@@ -230,13 +229,11 @@
 
   if (response) {
     if (outcome != RequestOutcome::RESPONSE_ALREADY_CACHED) {
-      if (response) {
-        CacheVerdict(request->main_frame_url(), request->trigger_type(),
-                     request->password_type(), *response, base::Time::Now());
-      }
+      CacheVerdict(request->main_frame_url(), request->trigger_type(),
+                   request->password_type(), *response, base::Time::Now());
     }
     if (ShouldShowModalWarning(request->trigger_type(),
-                               request->password_type(),
+                               request->password_type(), request->username(),
                                response->verdict_type())) {
       ShowModalWarning(request->web_contents(), response->verdict_token(),
                        request->password_type());
@@ -386,8 +383,8 @@
 }
 
 bool PasswordProtectionService::IsEventLoggingEnabled() {
-  return !IsIncognito() &&
-         GetSyncAccountType() != PasswordReuseEvent::NOT_SIGNED_IN;
+  // TODO(bdea): Incorporate non-sync users.
+  return !IsIncognito() && IsPrimaryAccountSignedIn();
 }
 
 // static
@@ -415,8 +412,7 @@
 // static
 ReusedPasswordAccountType
 PasswordProtectionService::GetPasswordProtectionReusedPasswordAccountType(
-    password_manager::metrics_util::PasswordType password_type,
-    std::string hosted_domain) {
+    password_manager::metrics_util::PasswordType password_type) const {
   ReusedPasswordAccountType reused_password_account_type;
   switch (password_type) {
     case PasswordType::SAVED_PASSWORD:
@@ -430,11 +426,16 @@
     case PasswordType::PRIMARY_ACCOUNT_PASSWORD:
     case PasswordType::OTHER_GAIA_PASSWORD:
       if (password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD)
-        reused_password_account_type.set_is_account_syncing(IsAccountSyncing());
+        reused_password_account_type.set_is_account_syncing(
+            IsPrimaryAccountSyncing());
+      if (!IsPrimaryAccountSignedIn()) {
+        reused_password_account_type.set_account_type(
+            ReusedPasswordAccountType::UNKNOWN);
+        return reused_password_account_type;
+      }
       reused_password_account_type.set_account_type(
-          hosted_domain == kNoHostedDomainFound
-              ? ReusedPasswordAccountType::GMAIL
-              : ReusedPasswordAccountType::GSUITE);
+          IsPrimaryAccountGmail() ? ReusedPasswordAccountType::GMAIL
+                                  : ReusedPasswordAccountType::GSUITE);
       return reused_password_account_type;
     case PasswordType::PASSWORD_TYPE_UNKNOWN:
     case PasswordType::PASSWORD_TYPE_COUNT:
@@ -452,10 +453,12 @@
     case PasswordType::SAVED_PASSWORD:
       return true;
     case PasswordType::PRIMARY_ACCOUNT_PASSWORD:
-      return GetSyncAccountType() != PasswordReuseEvent::NOT_SIGNED_IN;
+      return true;
     case PasswordType::ENTERPRISE_PASSWORD:
       return true;
     case PasswordType::OTHER_GAIA_PASSWORD:
+      return base::FeatureList::IsEnabled(
+          safe_browsing::kPasswordProtectionForSignedInUsers);
     case PasswordType::PASSWORD_TYPE_UNKNOWN:
     case PasswordType::PASSWORD_TYPE_COUNT:
       return false;
@@ -466,6 +469,10 @@
 
 bool PasswordProtectionService::IsSupportedPasswordTypeForModalWarning(
     PasswordType password_type) const {
+  if (password_type == PasswordType::OTHER_GAIA_PASSWORD) {
+    return base::FeatureList::IsEnabled(
+        safe_browsing::kPasswordProtectionForSignedInUsers);
+  }
   return password_type == PasswordType::PRIMARY_ACCOUNT_PASSWORD ||
          password_type == PasswordType::ENTERPRISE_PASSWORD;
 }
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index f33e087..8e6ba9a 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -102,7 +102,6 @@
                     const GURL& password_form_frame_url,
                     const std::string& username,
                     PasswordType password_type,
-                    bool is_account_syncing,
                     const std::vector<std::string>& matching_domains,
                     LoginReputationClientRequest::TriggerType trigger_type,
                     bool password_field_exists);
@@ -119,8 +118,6 @@
       const GURL& main_frame_url,
       const std::string& username,
       PasswordType password_type,
-      std::string hosted_domain,
-      bool is_account_syncing,
       const std::vector<std::string>& matching_domains,
       bool password_field_exists);
 
@@ -143,6 +140,7 @@
   bool ShouldShowModalWarning(
       LoginReputationClientRequest::TriggerType trigger_type,
       PasswordType password_type,
+      const std::string& username,
       LoginReputationClientResponse::VerdictType verdict_type);
 
   // Shows modal warning dialog on the current |web_contents| and pass the
@@ -207,8 +205,7 @@
   // LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordAccountType
   // to LoginReputationClientRequest::PasswordReuseEvent::ReusedPasswordType.
   ReusedPasswordAccountType GetPasswordProtectionReusedPasswordAccountType(
-      PasswordType password_type,
-      std::string hosted_domain);
+      PasswordType password_type) const;
 
   // If we can send ping for this type of reused password.
   bool IsSupportedPasswordTypeForPinging(PasswordType password_type) const;
@@ -229,7 +226,7 @@
   bool CanSendPing(LoginReputationClientRequest::TriggerType trigger_type,
                    const GURL& main_frame_url,
                    PasswordType password_type,
-                   const std::string hosted_domain,
+                   const std::string& username,
                    RequestOutcome* reason);
 
   // Called by a PasswordProtectionRequest instance when it finishes to remove
@@ -281,11 +278,19 @@
   virtual bool IsPingingEnabled(
       LoginReputationClientRequest::TriggerType trigger_type,
       PasswordType password_type,
+      const std::string& username,
       RequestOutcome* reason) = 0;
 
   virtual bool IsHistorySyncEnabled() = 0;
 
-  virtual bool IsAccountSyncing() = 0;
+  virtual bool IsPrimaryAccountSyncing() const = 0;
+
+  virtual bool IsPrimaryAccountSignedIn() const = 0;
+
+  virtual bool IsPrimaryAccountGmail() const = 0;
+
+  virtual bool IsOtherGaiaAccountSignedIn(
+      const std::string& username) const = 0;
 
   virtual bool IsUnderAdvancedProtection() = 0;
 
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 d3d49ce6..a147b99 100644
--- a/components/safe_browsing/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
@@ -248,7 +248,7 @@
 
     request_ = new PasswordProtectionRequest(
         web_contents, target_url, GURL(kFormActionUrl), GURL(kPasswordFrameUrl),
-        kUserName, PasswordType::PASSWORD_TYPE_UNKNOWN, false, {},
+        kUserName, PasswordType::PASSWORD_TYPE_UNKNOWN, {},
         LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true,
         password_protection_service_.get(), timeout_in_ms);
     request_->Start();
@@ -266,7 +266,7 @@
             Return(match_whitelist ? AsyncMatch::MATCH : AsyncMatch::NO_MATCH));
 
     request_ = new PasswordProtectionRequest(
-        web_contents, target_url, GURL(), GURL(), kUserName, type, false,
+        web_contents, target_url, GURL(), GURL(), kUserName, type,
         matching_domains, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
         true, password_protection_service_.get(), timeout_in_ms);
     request_->Start();
@@ -829,7 +829,8 @@
                          GURL(kTargetUrl).host());
   test_url_loader_factory_.AddResponse(url_.spec(),
                                        expected_response.SerializeAsString());
-
+  EXPECT_CALL(*password_protection_service_, IsPrimaryAccountSyncing())
+      .WillRepeatedly(Return(true));
   // Initiate a sync password entry request (w/ no saved password).
   InitializeAndStartPasswordEntryRequest(
       PasswordType::PRIMARY_ACCOUNT_PASSWORD, {}, false /* match whitelist */,
@@ -862,7 +863,7 @@
   password_protection_service_->StartRequest(
       GetWebContents(), target_url, GURL("http://foo.com/submit"),
       GURL("http://foo.com/frame"), "username", PasswordType::SAVED_PASSWORD,
-      false, {}, LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
+      {}, LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
 
   // Destroy password_protection_service_ while there is one request pending.
   password_protection_service_.reset();
@@ -965,57 +966,43 @@
 }
 
 TEST_P(PasswordProtectionServiceTest, VerifyShouldShowModalWarning) {
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GMAIL));
   EXPECT_CALL(*password_protection_service_,
               GetPasswordProtectionWarningTriggerPref())
       .WillRepeatedly(Return(PHISHING_REUSE));
+  EXPECT_CALL(*password_protection_service_, IsPrimaryAccountSignedIn())
+      .WillRepeatedly(Return(true));
 
   // Don't show modal warning if it is not a password reuse ping.
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // Don't show modal warning if it is a saved password reuse.
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::SAVED_PASSWORD, LoginReputationClientResponse::PHISHING));
+      PasswordType::SAVED_PASSWORD,
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // Don't show modal warning if it is a non-sync gaia password reuse.
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::OTHER_GAIA_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // Don't show modal warning if reused password type unknown.
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PASSWORD_TYPE_UNKNOWN,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
-  // Don't show modal warning if it is a sync password reuse but user is not
-  // signed in.
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::NOT_SIGNED_IN));
-  EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
-      LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
-
-  // Show warning if it is a sync password reuse and user is signed in and
-  // is not manged by enterprise.
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GMAIL));
   EXPECT_TRUE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // For a GSUITE account, don't show warning if password protection is set to
   // off by enterprise policy.
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GSUITE));
   EXPECT_CALL(*password_protection_service_,
               GetPasswordProtectionWarningTriggerPref())
       .WillRepeatedly(Return(PASSWORD_PROTECTION_OFF));
@@ -1025,7 +1012,7 @@
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // For a GSUITE account, show warning if password protection is set to
   // PHISHING_REUSE.
@@ -1038,27 +1025,23 @@
   EXPECT_TRUE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // Modal dialog warning is also shown on LOW_REPUTATION verdict.
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GMAIL));
   EXPECT_TRUE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::PRIMARY_ACCOUNT_PASSWORD,
-      LoginReputationClientResponse::LOW_REPUTATION));
+      /*username=*/"", LoginReputationClientResponse::LOW_REPUTATION));
 
   // Modal dialog warning should not be shown for enterprise password reuse
   // if it is turned off by policy.
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::NOT_SIGNED_IN));
   EXPECT_CALL(*password_protection_service_,
               GetPasswordProtectionWarningTriggerPref())
       .WillRepeatedly(Return(PASSWORD_PROTECTION_OFF));
   EXPECT_FALSE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::ENTERPRISE_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 
   // Show modal warning for enterprise password reuse if the trigger is
   // configured to PHISHING_REUSE.
@@ -1068,26 +1051,16 @@
   EXPECT_TRUE(password_protection_service_->ShouldShowModalWarning(
       LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
       PasswordType::ENTERPRISE_PASSWORD,
-      LoginReputationClientResponse::PHISHING));
+      /*username=*/"", LoginReputationClientResponse::PHISHING));
 }
 
 TEST_P(PasswordProtectionServiceTest, VerifyIsEventLoggingEnabled) {
   // For user who is not signed-in, event logging should be disabled.
-  EXPECT_EQ(PasswordReuseEvent::NOT_SIGNED_IN,
-            password_protection_service_->GetSyncAccountType());
   EXPECT_FALSE(password_protection_service_->IsEventLoggingEnabled());
 
   // Event logging should be enable for all signed-in users..
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GMAIL));
-  EXPECT_EQ(PasswordReuseEvent::GMAIL,
-            password_protection_service_->GetSyncAccountType());
-  EXPECT_TRUE(password_protection_service_->IsEventLoggingEnabled());
-
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GSUITE));
-  EXPECT_EQ(PasswordReuseEvent::GSUITE,
-            password_protection_service_->GetSyncAccountType());
+  EXPECT_CALL(*password_protection_service_, IsPrimaryAccountSignedIn())
+      .WillRepeatedly(Return(true));
   EXPECT_TRUE(password_protection_service_->IsEventLoggingEnabled());
 }
 
@@ -1114,23 +1087,17 @@
 }
 
 TEST_P(PasswordProtectionServiceTest, VerifyIsSupportedPasswordTypeForPinging) {
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::NOT_SIGNED_IN));
   EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::SAVED_PASSWORD));
-  EXPECT_FALSE(password_protection_service_->IsSupportedPasswordTypeForPinging(
+  EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::PRIMARY_ACCOUNT_PASSWORD));
   EXPECT_FALSE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::OTHER_GAIA_PASSWORD));
   EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::ENTERPRISE_PASSWORD));
 
-  EXPECT_CALL(*password_protection_service_, GetSyncAccountType())
-      .WillRepeatedly(Return(PasswordReuseEvent::GMAIL));
   EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::SAVED_PASSWORD));
-  EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
-      PasswordType::PRIMARY_ACCOUNT_PASSWORD));
   EXPECT_FALSE(password_protection_service_->IsSupportedPasswordTypeForPinging(
       PasswordType::OTHER_GAIA_PASSWORD));
   EXPECT_TRUE(password_protection_service_->IsSupportedPasswordTypeForPinging(
@@ -1146,7 +1113,7 @@
                                        expected_response.SerializeAsString());
   password_protection_service_->StartRequest(
       GetWebContents(), GURL("about:blank"), GURL(), GURL(), "username",
-      PasswordType::SAVED_PASSWORD, false, {"example.com"},
+      PasswordType::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
   histograms_.ExpectTotalCount(kPasswordOnFocusRequestOutcomeHistogram, 1);
@@ -1164,7 +1131,7 @@
       .WillOnce(Return(gfx::Size(1000, 1000)));
   password_protection_service_->StartRequest(
       GetWebContents(), GURL("about:blank"), GURL(), GURL(), kUserName,
-      PasswordType::SAVED_PASSWORD, false, {"example.com"},
+      PasswordType::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
 
@@ -1188,7 +1155,7 @@
       .WillOnce(Return(gfx::Size(1000, 1000)));
   password_protection_service_->StartRequest(
       GetWebContents(), GURL("about:blank"), GURL(), GURL(), kUserName,
-      PasswordType::SAVED_PASSWORD, false, {"example.com"},
+      PasswordType::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
 
diff --git a/components/security_interstitials/content/security_interstitial_tab_helper.h b/components/security_interstitials/content/security_interstitial_tab_helper.h
index 62dbb0d3..acb234cf1 100644
--- a/components/security_interstitials/content/security_interstitial_tab_helper.h
+++ b/components/security_interstitials/content/security_interstitial_tab_helper.h
@@ -7,7 +7,7 @@
 
 #include <map>
 
-#include "components/security_interstitials/core/common/interfaces/interstitial_commands.mojom.h"
+#include "components/security_interstitials/core/common/mojom/interstitial_commands.mojom.h"
 #include "components/security_interstitials/core/controller_client.h"
 #include "content/public/browser/web_contents_binding_set.h"
 #include "content/public/browser/web_contents_observer.h"
diff --git a/components/security_interstitials/core/BUILD.gn b/components/security_interstitials/core/BUILD.gn
index e84ca5b..8b0cf36 100644
--- a/components/security_interstitials/core/BUILD.gn
+++ b/components/security_interstitials/core/BUILD.gn
@@ -52,6 +52,6 @@
   ]
 
   public_deps = [
-    "//components/security_interstitials/core/common/interfaces:interfaces",
+    "//components/security_interstitials/core/common/mojom",
   ]
 }
diff --git a/components/security_interstitials/core/common/interfaces/BUILD.gn b/components/security_interstitials/core/common/mojom/BUILD.gn
similarity index 92%
rename from components/security_interstitials/core/common/interfaces/BUILD.gn
rename to components/security_interstitials/core/common/mojom/BUILD.gn
index 7e7dfd7..dfba06f 100644
--- a/components/security_interstitials/core/common/interfaces/BUILD.gn
+++ b/components/security_interstitials/core/common/mojom/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 
-mojom("interfaces") {
+mojom("mojom") {
   sources = [
     "interstitial_commands.mojom",
   ]
diff --git a/components/security_interstitials/core/common/interfaces/OWNERS b/components/security_interstitials/core/common/mojom/OWNERS
similarity index 100%
rename from components/security_interstitials/core/common/interfaces/OWNERS
rename to components/security_interstitials/core/common/mojom/OWNERS
diff --git a/components/security_interstitials/core/common/interfaces/interstitial_commands.mojom b/components/security_interstitials/core/common/mojom/interstitial_commands.mojom
similarity index 100%
rename from components/security_interstitials/core/common/interfaces/interstitial_commands.mojom
rename to components/security_interstitials/core/common/mojom/interstitial_commands.mojom
diff --git a/components/sync/driver/resources/PRESUBMIT.py b/components/sync/driver/resources/PRESUBMIT.py
new file mode 100644
index 0000000..3e4806bb
--- /dev/null
+++ b/components/sync/driver/resources/PRESUBMIT.py
@@ -0,0 +1,26 @@
+# Copyright 2019 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.
+
+def CheckChangeOnUpload(input_api, output_api):
+  return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+  return _CommonChecks(input_api, output_api)
+
+
+def _CommonChecks(input_api, output_api):
+  results = []
+  results += input_api.canned_checks.CheckPatchFormatted(input_api, output_api,
+                                                         check_js=True)
+  try:
+    import sys
+    old_sys_path = sys.path[:]
+    cwd = input_api.PresubmitLocalPath()
+    sys.path += [input_api.os_path.join(cwd, '..', '..', '..', '..', 'tools')]
+    from web_dev_style import presubmit_support
+    results += presubmit_support.CheckStyle(input_api, output_api)
+  finally:
+    sys.path = old_sys_path
+  return results
diff --git a/components/sync/driver/resources/about.js b/components/sync/driver/resources/about.js
index 98634d1..f1377d83 100644
--- a/components/sync/driver/resources/about.js
+++ b/components/sync/driver/resources/about.js
@@ -11,8 +11,8 @@
       this.removeAttribute('highlighted');
     }
 
-    var oldStr = oldVal.toString();
-    var newStr = newVal.toString();
+    const oldStr = oldVal.toString();
+    const newStr = newVal.toString();
     if (oldStr != '' && oldStr != newStr) {
       // Note the addListener function does not end up creating duplicate
       // listeners.  There can be only one listener per event at a time.
@@ -24,7 +24,7 @@
 
   function refreshAboutInfo(aboutInfo) {
     chrome.sync.aboutInfo = aboutInfo;
-    var aboutInfoDiv = $('about-info');
+    const aboutInfoDiv = $('about-info');
     jstProcess(new JsEvalContext(aboutInfo), aboutInfoDiv);
   }
 
@@ -33,13 +33,13 @@
   }
 
   function onAboutInfoCountersUpdated(e) {
-    var details = e.details;
+    const details = e.details;
 
-    var modelType = details.modelType;
-    var counters = details.counters;
+    const modelType = details.modelType;
+    const counters = details.counters;
 
-    var type_status_array = chrome.sync.aboutInfo.type_status;
-    type_status_array.forEach(function(row) {
+    const typeStatusArray = chrome.sync.aboutInfo.type_status;
+    typeStatusArray.forEach(function(row) {
       if (row.name == modelType) {
         // There are three types of counters, only "status" counters have these
         // fields. Keep the old values if updated fields are not present.
@@ -52,8 +52,7 @@
       }
     });
     jstProcess(
-        new JsEvalContext({ type_status: type_status_array }),
-        $('typeInfo'));
+        new JsEvalContext({type_status: typeStatusArray}), $('typeInfo'));
   }
 
   /**
@@ -74,17 +73,17 @@
   }
 
   /** Container for accumulated sync protocol events. */
-  var protocolEvents = [];
+  const protocolEvents = [];
 
   /** We may receive re-delivered events.  Keep a record of ones we've seen. */
-  var knownEventTimestamps = {};
+  const knownEventTimestamps = {};
 
   /**
    * Callback for incoming protocol events.
    * @param {Event} e The protocol event.
    */
   function onReceivedProtocolEvent(e) {
-    var details = e.details;
+    const details = e.details;
 
     // Return early if we've seen this event before.  Assumes that timestamps
     // are sufficiently high resolution to uniquely identify an event.
@@ -95,24 +94,25 @@
     knownEventTimestamps[details.time] = true;
     protocolEvents.push(details);
 
-    var trafficContainer = $('traffic-event-container');
+    const trafficContainer = $('traffic-event-container');
 
     // Scroll to the bottom if we were already at the bottom.  Otherwise, leave
     // the scrollbar alone.
-    var shouldScrollDown = isScrolledToBottom(trafficContainer);
+    const shouldScrollDown = isScrolledToBottom(trafficContainer);
 
-    var context = new JsEvalContext({ events: protocolEvents });
+    const context = new JsEvalContext({events: protocolEvents});
     jstProcess(context, trafficContainer);
 
-    if (shouldScrollDown)
+    if (shouldScrollDown) {
       scrollToBottom(trafficContainer);
+    }
   }
 
   /**
    * Initializes state and callbacks for the protocol event log UI.
    */
   function initProtocolEventLog() {
-    var includeSpecificsCheckbox = $('capture-specifics');
+    const includeSpecificsCheckbox = $('capture-specifics');
     includeSpecificsCheckbox.addEventListener('change', function(event) {
       chrome.sync.setIncludeSpecifics(includeSpecificsCheckbox.checked);
     });
@@ -123,7 +123,7 @@
     // Make the prototype jscontent element disappear.
     jstProcess({}, $('traffic-event-container'));
 
-    var triggerRefreshButton = $('trigger-refresh');
+    const triggerRefreshButton = $('trigger-refresh');
     triggerRefreshButton.addEventListener('click', function(event) {
       chrome.sync.triggerRefresh();
     });
@@ -135,15 +135,15 @@
   function initStatusDumpButton() {
     $('status-data').hidden = true;
 
-    var dumpStatusButton = $('dump-status');
+    const dumpStatusButton = $('dump-status');
     dumpStatusButton.addEventListener('click', function(event) {
-      var aboutInfo = chrome.sync.aboutInfo;
+      const aboutInfo = chrome.sync.aboutInfo;
       if (!$('include-ids').checked) {
         aboutInfo.details = chrome.sync.aboutInfo.details.filter(function(el) {
           return !el.is_sensitive;
         });
       }
-      var data = '';
+      let data = '';
       data += new Date().toString() + '\n';
       data += '======\n';
       data += 'Status\n';
@@ -154,7 +154,7 @@
       $('status-data').hidden = false;
     });
 
-    var importStatusButton = $('import-status');
+    const importStatusButton = $('import-status');
     importStatusButton.addEventListener('click', function(event) {
       $('status-data').hidden = false;
       if ($('status-text').value.length == 0) {
@@ -164,8 +164,8 @@
       }
 
       // First remove any characters before the '{'.
-      var data = $('status-text').value;
-      var firstBrace = data.indexOf('{');
+      let data = $('status-text').value;
+      const firstBrace = data.indexOf('{');
       if (firstBrace < 0) {
         $('status-text').value = 'Invalid sync status dump.';
         return;
@@ -181,7 +181,7 @@
           'onCountersUpdated',
           onAboutInfoCountersUpdated);
 
-      var aboutInfo = JSON.parse(data);
+      const aboutInfo = JSON.parse(data);
       refreshAboutInfo(aboutInfo);
     });
   }
@@ -195,12 +195,12 @@
       // We ignore proto clicks to keep it copyable.
       return;
     }
-    var traffic_event_div = e.target;
+    let trafficEventDiv = e.target;
     // Click might be on div's child.
-    if (traffic_event_div.nodeName != "DIV") {
-      traffic_event_div = traffic_event_div.parentNode;
+    if (trafficEventDiv.nodeName != 'DIV') {
+      trafficEventDiv = trafficEventDiv.parentNode;
     }
-    traffic_event_div.classList.toggle('traffic-event-entry-expanded');
+    trafficEventDiv.classList.toggle('traffic-event-entry-expanded');
   }
 
   /**
diff --git a/components/sync/driver/resources/chrome_sync.js b/components/sync/driver/resources/chrome_sync.js
index 2951f67..ffc727d8 100644
--- a/components/sync/driver/resources/chrome_sync.js
+++ b/components/sync/driver/resources/chrome_sync.js
@@ -30,7 +30,7 @@
   };
 
   /** @return {!Timer} An object which measures elapsed time. */
-  var makeTimer = function() {
+  const makeTimer = function() {
     return new Timer;
   };
 
@@ -38,8 +38,8 @@
    * @param {string} name The name of the event type.
    * @param {!Object} details A collection of event-specific details.
    */
-  var dispatchEvent = function(name, details) {
-    var e = new Event(name);
+  const dispatchEvent = function(name, details) {
+    const e = new Event(name);
     e.details = details;
     chrome.sync.events.dispatchEvent(e);
   };
@@ -48,7 +48,7 @@
    * Registers to receive a stream of events through
    * chrome.sync.dispatchEvent().
    */
-  var registerForEvents = function() {
+  const registerForEvents = function() {
     chrome.send('registerForEvents');
   };
 
@@ -56,15 +56,15 @@
    * Registers to receive a stream of status counter update events
    * chrome.sync.dispatchEvent().
    */
-  var registerForPerTypeCounters = function() {
+  const registerForPerTypeCounters = function() {
     chrome.send('registerForPerTypeCounters');
-  }
+  };
 
   /**
    * Asks the browser to refresh our snapshot of sync state. Should result
    * in an onAboutInfoUpdated event being emitted.
    */
-  var requestUpdatedAboutInfo = function() {
+  const requestUpdatedAboutInfo = function() {
     chrome.send('requestUpdatedAboutInfo');
   };
 
@@ -72,7 +72,7 @@
    * Asks the browser to send us the list of registered types. Should result
    * in an onReceivedListOfTypes event being emitted.
    */
-  var requestListOfTypes = function() {
+  const requestListOfTypes = function() {
     chrome.send('requestListOfTypes');
   };
 
@@ -81,14 +81,14 @@
    * flag. Should result in an onReceivedIncludeSpecificsInitialState event
    * being emitted.
    */
-  var requestIncludeSpecificsInitialState = function() {
+  const requestIncludeSpecificsInitialState = function() {
     chrome.send('requestIncludeSpecificsInitialState');
-  }
+  };
 
   /**
    * Asks the browser if we should show the User Events tab or not.
    */
-  var requestUserEventsVisibility = function() {
+  const requestUserEventsVisibility = function() {
     chrome.send('requestUserEventsVisibility');
   };
 
@@ -99,7 +99,7 @@
    * @param {boolean} includeSpecifics Whether protocol events include
    *     specifics.
    */
-  var setIncludeSpecifics = function(includeSpecifics) {
+  const setIncludeSpecifics = function(includeSpecifics) {
     chrome.send('setIncludeSpecifics', [includeSpecifics]);
   };
 
@@ -109,35 +109,35 @@
    * @param {string} eventTimeUsec Timestamp for the new event.
    * @param {string} navigationId Timestamp of linked sessions navigation.
    */
-  var writeUserEvent = function(eventTimeUsec, navigationId) {
+  const writeUserEvent = function(eventTimeUsec, navigationId) {
     chrome.send('writeUserEvent', [eventTimeUsec, navigationId]);
   };
 
   /**
    * Triggers a RequestStart call on the SyncService.
    */
-  var requestStart = function() {
+  const requestStart = function() {
     chrome.send('requestStart');
   };
 
   /**
    * Triggers a RequestStop(KEEP_DATA) call on the SyncService.
    */
-  var requestStopKeepData = function() {
+  const requestStopKeepData = function() {
     chrome.send('requestStopKeepData');
   };
 
   /**
    * Triggers a RequestStop(CLEAR_DATA) call on the SyncService.
    */
-  var requestStopClearData = function() {
+  const requestStopClearData = function() {
     chrome.send('requestStopClearData');
   };
 
   /**
    * Triggers a GetUpdates call for all enabled datatypes.
    */
-  var triggerRefresh = function() {
+  const triggerRefresh = function() {
     chrome.send('triggerRefresh');
   };
 
@@ -145,14 +145,14 @@
    * Counter to uniquely identify requests while they're in progress.
    * Used in the implementation of GetAllNodes.
    */
-  var requestId = 0;
+  let requestId = 0;
 
   /**
    * A map from counter values to asynchronous request callbacks.
    * Used in the implementation of GetAllNodes.
    * @type {!Object<!Function>}
    */
-  var requestCallbacks = {};
+  const requestCallbacks = {};
 
   /**
    * Asks the browser to send us a copy of all existing sync nodes.
@@ -160,7 +160,7 @@
    *
    * @param {function(!Object)} callback The function to call with the response.
    */
-  var getAllNodes = function(callback) {
+  const getAllNodes = function(callback) {
     requestId++;
     requestCallbacks[requestId] = callback;
     chrome.send('getAllNodes', [requestId]);
@@ -172,7 +172,7 @@
    * @param {number} id The requestId passed in with the request.
    * @param {Object} response The response to the request.
    */
-  var getAllNodesCallback = function(id, response) {
+  const getAllNodesCallback = function(id, response) {
     requestCallbacks[id](response);
     delete requestCallbacks[id];
   };
diff --git a/components/sync/driver/resources/data.js b/components/sync/driver/resources/data.js
index 6607193..595d5126 100644
--- a/components/sync/driver/resources/data.js
+++ b/components/sync/driver/resources/data.js
@@ -3,12 +3,12 @@
 // found in the LICENSE file.
 
 (function() {
-var dumpToTextButton = $('dump-to-text');
-var dataDump = $('data-dump');
+const dumpToTextButton = $('dump-to-text');
+const dataDump = $('data-dump');
 dumpToTextButton.addEventListener('click', function(event) {
   // TODO(akalin): Add info like Chrome version, OS, date dumped, etc.
 
-  var data = '';
+  let data = '';
   data += '======\n';
   data += 'Status\n';
   data += '======\n';
@@ -32,7 +32,7 @@
   dataDump.textContent = data;
 });
 
-var allFields = [
+const allFields = [
   'ID',
   'IS_UNSYNCED',
   'IS_UNAPPLIED_UPDATE',
@@ -51,9 +51,9 @@
 
 function versionToDateString(version) {
   // TODO(mmontgomery): ugly? Hacky? Is there a better way?
-  var epochLength = Date.now().toString().length;
-  var epochTime = parseInt(version.slice(0, epochLength), 10);
-  var date = new Date(epochTime);
+  const epochLength = Date.now().toString().length;
+  const epochTime = parseInt(version.slice(0, epochLength), 10);
+  const date = new Date(epochTime);
   return date.toString();
 }
 
@@ -63,22 +63,25 @@
  */
 function serializeNode(node) {
   return allFields.map(function(field) {
-    var fieldVal;
+    let fieldVal;
     if (field == 'SERVER_VERSION_TIME') {
-      var version = node['SERVER_VERSION'];
+      const version = node['SERVER_VERSION'];
       if (version != null) {
         fieldVal = versionToDateString(version);
       }
-    } if (field == 'BASE_VERSION_TIME') {
-      var version = node['BASE_VERSION'];
+    }
+    if (field == 'BASE_VERSION_TIME') {
+      const version = node['BASE_VERSION'];
       if (version != null) {
         fieldVal = versionToDateString(version);
       }
-    } else if ((field == 'SERVER_SPECIFICS' || field == 'SPECIFICS') &&
-            (!$('include-specifics').checked)) {
+    } else if (
+        (field == 'SERVER_SPECIFICS' || field == 'SPECIFICS') &&
+        (!$('include-specifics').checked)) {
       fieldVal = 'REDACTED';
-    } else if ((field == 'SERVER_SPECIFICS' || field == 'SPECIFICS') &&
-            $('include-specifics').checked) {
+    } else if (
+        (field == 'SERVER_SPECIFICS' || field == 'SPECIFICS') &&
+        $('include-specifics').checked) {
       fieldVal = JSON.stringify(node[field]);
     } else {
       fieldVal = node[field];
@@ -92,7 +95,7 @@
  * @return {boolean} True if the type's checkbox is selected.
  */
 function isSelectedDatatype(type) {
-  var typeCheckbox = $(type);
+  const typeCheckbox = $(type);
   // Some types, such as 'Top level folder', appear in the list of nodes
   // but not in the list of selectable items.
   if (typeCheckbox == null) {
@@ -102,28 +105,26 @@
 }
 
 function makeBlobUrl(data) {
-  var textBlob = new Blob([data], {type: 'octet/stream'});
-  var blobUrl = window.URL.createObjectURL(textBlob);
+  const textBlob = new Blob([data], {type: 'octet/stream'});
+  const blobUrl = window.URL.createObjectURL(textBlob);
   return blobUrl;
 }
 
 function makeDownloadName() {
   // Format is sync-data-dump-$epoch-$year-$month-$day-$OS.csv.
-  var now = new Date();
-  var friendlyDate = [now.getFullYear(),
-                      now.getMonth() + 1,
-                      now.getDate()].join('-');
-  var name = ['sync-data-dump',
-              friendlyDate,
-              Date.now(),
-              navigator.platform].join('-');
+  const now = new Date();
+  const friendlyDate =
+      [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('-');
+  const name = [
+    'sync-data-dump', friendlyDate, Date.now(), navigator.platform
+  ].join('-');
   return [name, 'csv'].join('.');
 }
 
 function makeDateUserAgentHeader() {
-  var now = new Date();
-  var userAgent = window.navigator.userAgent;
-  var dateUaHeader = [now.toISOString(), userAgent].join(',');
+  const now = new Date();
+  const userAgent = window.navigator.userAgent;
+  const dateUaHeader = [now.toISOString(), userAgent].join(',');
   return dateUaHeader;
 }
 
@@ -135,14 +136,14 @@
  */
 function triggerDataDownload(nodesMap) {
   // Prepend a header with ISO date and useragent.
-  var output = [makeDateUserAgentHeader()];
+  let output = [makeDateUserAgentHeader()];
   output.push('=====');
 
-  var aboutInfo = JSON.stringify(chrome.sync.aboutInfo, null, 2);
+  const aboutInfo = JSON.stringify(chrome.sync.aboutInfo, null, 2);
   output.push(aboutInfo);
 
   // Filter out non-selected types.
-  var selectedTypesNodes = nodesMap.filter(function(x) {
+  const selectedTypesNodes = nodesMap.filter(function(x) {
     return isSelectedDatatype(x.type);
   });
 
@@ -154,25 +155,25 @@
 
   output = output.join('\n');
 
-  var anchor = $('dump-to-file-anchor');
+  const anchor = $('dump-to-file-anchor');
   anchor.href = makeBlobUrl(output);
   anchor.download = makeDownloadName();
   anchor.click();
 }
 
 function createTypesCheckboxes(types) {
-  var containerElt = $('node-type-checkboxes');
+  const containerElt = $('node-type-checkboxes');
 
   types.map(function(type) {
-    var div = document.createElement('div');
+    const div = document.createElement('div');
 
-    var checkbox = document.createElement('input');
+    const checkbox = document.createElement('input');
     checkbox.id = type;
     checkbox.type = 'checkbox';
     checkbox.checked = 'yes';
     div.appendChild(checkbox);
 
-    var label = document.createElement('label');
+    const label = document.createElement('label');
     // Assigning to label.for doesn't work.
     label.setAttribute('for', type);
     label.innerText = type;
@@ -183,7 +184,7 @@
 }
 
 function onReceivedListOfTypes(e) {
-  var types = e.details.types;
+  const types = e.details.types;
   types.sort();
   createTypesCheckboxes(types);
   chrome.sync.events.removeEventListener(
@@ -207,7 +208,7 @@
   chrome.sync.requestIncludeSpecificsInitialState();
 });
 
-var dumpToFileLink = $('dump-to-file');
+const dumpToFileLink = $('dump-to-file');
 dumpToFileLink.addEventListener('click', function(event) {
   chrome.sync.getAllNodes(triggerDataDownload);
 });
diff --git a/components/sync/driver/resources/events.js b/components/sync/driver/resources/events.js
index f18477d1..98d1d87 100644
--- a/components/sync/driver/resources/events.js
+++ b/components/sync/driver/resources/events.js
@@ -6,14 +6,14 @@
   'use strict';
 
   function toggleDisplay(event) {
-    var originatingButton = event.target;
+    const originatingButton = event.target;
     if (originatingButton.className != 'toggle-button') {
       return;
     }
-    var detailsNode = originatingButton.parentNode.getElementsByClassName(
-        'details')[0];
-    var detailsColumn = detailsNode.parentNode;
-    var detailsRow = detailsColumn.parentNode;
+    const detailsNode =
+        originatingButton.parentNode.getElementsByClassName('details')[0];
+    const detailsColumn = detailsNode.parentNode;
+    const detailsRow = detailsColumn.parentNode;
 
     if (!detailsRow.classList.contains('expanded')) {
       detailsRow.classList.toggle('expanded');
@@ -24,16 +24,16 @@
       detailsColumn.removeAttribute('colspan');
       detailsRow.classList.toggle('expanded');
     }
-  };
+  }
 
   function displaySyncEvents() {
-    var entries = chrome.sync.log.entries;
-    var eventTemplateContext = {
+    const entries = chrome.sync.log.entries;
+    const eventTemplateContext = {
       eventList: entries,
     };
-    var context = new JsEvalContext(eventTemplateContext);
+    const context = new JsEvalContext(eventTemplateContext);
     jstProcess(context, $('sync-events'));
-  };
+  }
 
   function onLoad() {
     $('sync-events').addEventListener('click', toggleDisplay);
diff --git a/components/sync/driver/resources/sync_log.js b/components/sync/driver/resources/sync_log.js
index 7435a18..bb322aa 100644
--- a/components/sync/driver/resources/sync_log.js
+++ b/components/sync/driver/resources/sync_log.js
@@ -13,7 +13,7 @@
 cr.define('chrome.sync', function() {
   'use strict';
 
-  var eventsByCategory = {
+  const eventsByCategory = {
     notifier: [
       'onIncomingNotification',
       'onNotificationStateChange',
@@ -50,7 +50,7 @@
   class Log extends cr.EventTarget {
     constructor() {
       super();
-      var self = this;
+      const self = this;
 
       /**
        * The recorded log entries.
@@ -61,15 +61,15 @@
       /**
        * Creates a callback function to be invoked when an event arrives.
        */
-      var makeCallback = function(categoryName, eventName) {
+      const makeCallback = function(categoryName, eventName) {
         return function(e) {
           self.log_(categoryName, eventName, e.details);
         };
       };
 
-      for (var categoryName in eventsByCategory) {
-        for (var i = 0; i < eventsByCategory[categoryName].length; ++i) {
-          var eventName = eventsByCategory[categoryName][i];
+      for (const categoryName in eventsByCategory) {
+        for (let i = 0; i < eventsByCategory[categoryName].length; ++i) {
+          const eventName = eventsByCategory[categoryName][i];
           chrome.sync.events.addEventListener(
               eventName,
               makeCallback(categoryName, eventName));
@@ -86,7 +86,7 @@
      * @param {!Object} details A dictionary of event-specific details.
      */
     log_(submodule, event, details) {
-      var entry = {
+      const entry = {
         submodule: submodule,
         event: event,
         date: new Date(),
@@ -96,7 +96,7 @@
       entry.textDetails = JSON.stringify(entry.details, null, 2);
       this.entries.push(entry);
       // Fire append event.
-      var e = cr.doc.createEvent('CustomEvent');
+      const e = cr.doc.createEvent('CustomEvent');
       e.initCustomEvent('append', false, false, entry);
       this.dispatchEvent(e);
     }
diff --git a/components/sync/driver/resources/sync_node_browser.js b/components/sync/driver/resources/sync_node_browser.js
index f33d3af4..d772d80 100644
--- a/components/sync/driver/resources/sync_node_browser.js
+++ b/components/sync/driver/resources/sync_node_browser.js
@@ -12,7 +12,7 @@
    *
    * @param {!Object} node The node to check.
    */
-  var isTypeRootNode = function(node) {
+  const isTypeRootNode = function(node) {
     return node.PARENT_ID == 'r' && node.UNIQUE_SERVER_TAG != '';
   };
 
@@ -22,11 +22,10 @@
    * @param {!Object} parent node.
    * @param {!Object} node The node to check.
    */
-  var isChildOf = function(parentNode, node) {
+  const isChildOf = function(parentNode, node) {
     if (node.PARENT_ID != '') {
       return node.PARENT_ID == parentNode.ID;
-    }
-    else {
+    } else {
       return node.modelType == parentNode.modelType;
     }
   };
@@ -40,7 +39,7 @@
    * If this proves to be slow and expensive, we should experiment with moving
    * this functionality to C++ instead.
    */
-  var nodeComparator = function(nodeA, nodeB) {
+  const nodeComparator = function(nodeA, nodeB) {
     if (nodeA.hasOwnProperty('positionIndex') &&
         nodeB.hasOwnProperty('positionIndex')) {
       return nodeA.positionIndex - nodeB.positionIndex;
@@ -56,7 +55,7 @@
    * @param {!Object} node The struct representing the node we want to display.
    */
   function updateNodeDetailView(node) {
-    var nodeDetailsView = $('node-details');
+    const nodeDetailsView = $('node-details');
     nodeDetailsView.hidden = false;
     jstProcess(new JsEvalContext(node.entry_), nodeDetailsView);
   }
@@ -77,8 +76,8 @@
    *     chrome.sync.getAllNodes().
    * @extends {cr.ui.TreeItem}
    */
-  var SyncNodeTreeItem = function(node) {
-    var treeItem = new cr.ui.TreeItem();
+  const SyncNodeTreeItem = function(node) {
+    const treeItem = new cr.ui.TreeItem();
     treeItem.__proto__ = SyncNodeTreeItem.prototype;
 
     treeItem.entry_ = node;
@@ -103,14 +102,14 @@
      * Finds the children of this node and appends them to the tree.
      */
     handleExpand_: function(event) {
-      var treeItem = this;
+      const treeItem = this;
 
       if (treeItem.expanded_) {
         return;
       }
       treeItem.expanded_ = true;
 
-      var children = treeItem.tree.allNodes.filter(
+      const children = treeItem.tree.allNodes.filter(
           isChildOf.bind(undefined, treeItem.entry_));
       children.sort(nodeComparator);
 
@@ -129,7 +128,7 @@
    * @constructor
    * @extends {cr.ui.Tree}
    */
-  var SyncNodeTree = cr.ui.define('tree');
+  const SyncNodeTree = cr.ui.define('tree');
 
   SyncNodeTree.prototype = {
     __proto__: cr.ui.Tree.prototype,
@@ -141,12 +140,12 @@
     },
 
     populate: function(nodes) {
-      var tree = this;
+      const tree = this;
 
       // We store the full set of nodes in the SyncNodeTree object.
       tree.allNodes = nodes;
 
-      var roots = tree.allNodes.filter(isTypeRootNode);
+      const roots = tree.allNodes.filter(isTypeRootNode);
       roots.sort(nodeComparator);
 
       roots.forEach(function(typeRoot) {
@@ -165,12 +164,12 @@
    * Clears any existing UI state.  Useful prior to a refresh.
    */
   function clear() {
-    var treeContainer = $('sync-node-tree-container');
+    const treeContainer = $('sync-node-tree-container');
     while (treeContainer.firstChild) {
       treeContainer.removeChild(treeContainer.firstChild);
     }
 
-    var nodeDetailsView = $('node-details');
+    const nodeDetailsView = $('node-details');
     nodeDetailsView.hidden = true;
   }
 
@@ -185,12 +184,16 @@
 
     chrome.sync.getAllNodes(function(nodeMap) {
       // Put all nodes into one big list that ignores the type.
-      var nodes = nodeMap.
-          map(function(x) { return x.nodes; }).
-          reduce(function(a, b) { return a.concat(b); });
+      const nodes = nodeMap
+                        .map(function(x) {
+                          return x.nodes;
+                        })
+                        .reduce(function(a, b) {
+                          return a.concat(b);
+                        });
 
-      var treeContainer = $('sync-node-tree-container');
-      var tree = document.createElement('tree');
+      const treeContainer = $('sync-node-tree-container');
+      const tree = document.createElement('tree');
       tree.setAttribute('id', 'sync-node-tree');
       tree.setAttribute('icon-visibility', 'parent');
       treeContainer.appendChild(tree);
@@ -205,16 +208,16 @@
 
   document.addEventListener('DOMContentLoaded', function(e) {
     $('node-browser-refresh-button').addEventListener('click', refresh);
-    var Splitter = cr.ui.Splitter;
-    var customSplitter = cr.ui.define('div');
+    const Splitter = cr.ui.Splitter;
+    const customSplitter = cr.ui.define('div');
 
     customSplitter.prototype = {
       __proto__: Splitter.prototype,
 
       handleSplitterDragEnd: function(e) {
         Splitter.prototype.handleSplitterDragEnd.apply(this, arguments);
-        var treeElement = $("sync-node-tree-container");
-        var newWidth = parseFloat(treeElement.style.width);
+        const treeElement = $('sync-node-tree-container');
+        const newWidth = parseFloat(treeElement.style.width);
         treeElement.style.minWidth = Math.max(newWidth, 50) + "px";
       }
     };
diff --git a/components/sync/driver/resources/sync_search.js b/components/sync/driver/resources/sync_search.js
index 7702c6c..3e04ca3 100644
--- a/components/sync/driver/resources/sync_search.js
+++ b/components/sync/driver/resources/sync_search.js
@@ -5,13 +5,13 @@
 // require: cr.js
 
 cr.define('chrome.sync', function() {
-  var currSearchId = 0;
+  let currSearchId = 0;
 
-  var setQueryString = function(queryControl, query) {
+  const setQueryString = function(queryControl, query) {
     queryControl.value = query;
   };
 
-  var createDoQueryFunction = function(queryControl, submitControl, query) {
+  const createDoQueryFunction = function(queryControl, submitControl, query) {
     return function() {
       setQueryString(queryControl, query);
       submitControl.click();
@@ -27,12 +27,12 @@
    * @param {!HTMLInputElement} queryControl The <input> object of
    *     type=search where user's query is typed.
    */
-  var decorateQuickQueryControls = function(quickLinkArray, submitControl,
-                                            queryControl) {
-    for (var index = 0; index < quickLinkArray.length; ++index) {
-      var quickQuery = quickLinkArray[index].getAttribute('data-query');
-      var quickQueryFunction = createDoQueryFunction(queryControl,
-          submitControl, quickQuery);
+  const decorateQuickQueryControls = function(
+      quickLinkArray, submitControl, queryControl) {
+    for (let index = 0; index < quickLinkArray.length; ++index) {
+      const quickQuery = quickLinkArray[index].getAttribute('data-query');
+      const quickQueryFunction =
+          createDoQueryFunction(queryControl, submitControl, quickQuery);
       quickLinkArray[index].addEventListener('click', quickQueryFunction);
     }
   };
@@ -44,15 +44,19 @@
    * @param {!Function} callback The callback called with the search results.
    *     not called if doSearch() is called again while the search is running.
    */
-  var doSearch = function(query, callback) {
-    var searchId = ++currSearchId;
+  const doSearch = function(query, callback) {
+    const searchId = ++currSearchId;
     try {
-      var regex = new RegExp(query);
+      const regex = new RegExp(query);
       chrome.sync.getAllNodes(function(node_map) {
         // Put all nodes into one big list that ignores the type.
-        var nodes = node_map.
-            map(function(x) { return x.nodes; }).
-            reduce(function(a, b) { return a.concat(b); });
+        const nodes = node_map
+                          .map(function(x) {
+                            return x.nodes;
+                          })
+                          .reduce(function(a, b) {
+                            return a.concat(b);
+                          });
 
         if (currSearchId != searchId) {
           return;
@@ -84,10 +88,10 @@
    */
   function decorateSearchControls(queryControl, submitControl, statusControl,
                                   resultsControl, detailsControl) {
-    var resultsDataModel = new cr.ui.ArrayDataModel([]);
+    const resultsDataModel = new cr.ui.ArrayDataModel([]);
 
-    var searchFunction = function() {
-      var query = queryControl.value;
+    const searchFunction = function() {
+      const query = queryControl.value;
       statusControl.textContent = '';
       resultsDataModel.splice(0, resultsDataModel.length);
       if (!query) {
@@ -95,7 +99,7 @@
       }
       statusControl.textContent = 'Searching for ' + query + '...';
       queryControl.removeAttribute('error');
-      var timer = chrome.sync.makeTimer();
+      const timer = chrome.sync.makeTimer();
       doSearch(query, function(nodes, error) {
         if (error) {
           statusControl.textContent = 'Error: ' + error;
@@ -107,7 +111,7 @@
           queryControl.removeAttribute('error');
 
           // TODO(akalin): Write a nicer list display.
-          for (var i = 0; i < nodes.length; ++i) {
+          for (let i = 0; i < nodes.length; ++i) {
             nodes[i].toString = function() {
               return this.NON_UNIQUE_NAME;
             };
@@ -129,7 +133,7 @@
     resultsControl.dataModel = resultsDataModel;
     resultsControl.selectionModel.addEventListener('change', function(event) {
       detailsControl.textContent = '';
-      var selected = resultsControl.selectedItem;
+      const selected = resultsControl.selectedItem;
       if (selected) {
         detailsControl.textContent = JSON.stringify(selected, null, 2);
       }
diff --git a/components/sync/driver/resources/traffic_log.js b/components/sync/driver/resources/traffic_log.js
index bfb297c3..6deca5e 100644
--- a/components/sync/driver/resources/traffic_log.js
+++ b/components/sync/driver/resources/traffic_log.js
@@ -2,95 +2,97 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('chrome.sync.traffic_log_tab', new class {
-  constructor() {
-    this.protocolEvents = [];
-    this.knownEventTimestamps = new Set();
+cr.exportPath(
+    'chrome.sync.traffic_log_tab', new (class {
+      constructor() {
+        this.protocolEvents = [];
+        this.knownEventTimestamps = new Set();
 
-    /** @type {!HTMLElement} */
-    this.container;
-  }
+        /** @type {!HTMLElement} */
+        this.container;
+      }
 
-  /**
-   * Helper to determine if the window is scrolled to its bottom limit.
-   * @return {boolean} true if the container is scrolled to the bottom
-   * @private
-   */
-  _isScrolledToBottom() {
-    return (window.innerHeight + window.scrollY) >= document.body.offsetHeight;
-  }
+      /**
+       * Helper to determine if the window is scrolled to its bottom limit.
+       * @return {boolean} true if the container is scrolled to the bottom
+       * @private
+       */
+      _isScrolledToBottom() {
+        return (window.innerHeight + window.scrollY) >=
+            document.body.offsetHeight;
+      }
 
-  /**
-   * Helper to scroll the window to its bottom.
-   * @private
-   */
-  _scrollToBottom() {
-    window.scrollTo(0, document.body.scrollHeight);
-  }
+      /**
+       * Helper to scroll the window to its bottom.
+       * @private
+       */
+      _scrollToBottom() {
+        window.scrollTo(0, document.body.scrollHeight);
+      }
 
-  /**
-   * Callback for incoming protocol events.
-   * @param {Event} e The protocol event.
-   * @private
-   */
-  _onReceivedProtocolEvent(e) {
-    var details = e.details;
+      /**
+       * Callback for incoming protocol events.
+       * @param {Event} e The protocol event.
+       * @private
+       */
+      _onReceivedProtocolEvent(e) {
+        const details = e.details;
 
-    if (this.knownEventTimestamps.has(details.time)) {
-      return;
-    }
+        if (this.knownEventTimestamps.has(details.time)) {
+          return;
+        }
 
-    this.knownEventTimestamps.add(details.time);
-    this.protocolEvents.push(details);
+        this.knownEventTimestamps.add(details.time);
+        this.protocolEvents.push(details);
 
-    var shouldScrollDown = this._isScrolledToBottom();
+        const shouldScrollDown = this._isScrolledToBottom();
 
-    jstProcess(
-      new JsEvalContext({ events: this.protocolEvents }),
-      this.container);
+        jstProcess(
+            new JsEvalContext({events: this.protocolEvents}), this.container);
 
-    if (shouldScrollDown) {
-      this._scrollToBottom();
-    }
-  }
+        if (shouldScrollDown) {
+          this._scrollToBottom();
+        }
+      }
 
-  /**
-   * Toggles the given traffic event entry div's "expanded" state.
-   * @param {!Event} e the click event that triggered the toggle.
-   * @private
-   */
-  _expandListener(e) {
-    if (e.target.classList.contains("proto")) {
-      // We ignore proto clicks to keep it copyable.
-      return;
-    }
-    var traffic_event_div = e.target;
-    // Click might be on div's child.
-    if (traffic_event_div.nodeName != "DIV") {
-      traffic_event_div = traffic_event_div.parentNode;
-    }
-    traffic_event_div.classList.toggle(
-      'traffic-event-entry-expanded-fullscreen');
-  }
+      /**
+       * Toggles the given traffic event entry div's "expanded" state.
+       * @param {!Event} e the click event that triggered the toggle.
+       * @private
+       */
+      _expandListener(e) {
+        if (e.target.classList.contains('proto')) {
+          // We ignore proto clicks to keep it copyable.
+          return;
+        }
+        let trafficEventDiv = e.target;
+        // Click might be on div's child.
+        if (trafficEventDiv.nodeName != 'DIV') {
+          trafficEventDiv = trafficEventDiv.parentNode;
+        }
+        trafficEventDiv.classList.toggle(
+            'traffic-event-entry-expanded-fullscreen');
+      }
 
-  /**
-   * Attaches a listener to the given traffic event entry div.
-   * @param {HTMLElement} element
-   */
-  addExpandListener(element) {
-    element.addEventListener('click', this._expandListener, false);
-  }
+      /**
+       * Attaches a listener to the given traffic event entry div.
+       * @param {HTMLElement} element
+       */
+      addExpandListener(element) {
+        element.addEventListener('click', this._expandListener, false);
+      }
 
-  onLoad() {
-    this.container = getRequiredElement('traffic-event-fullscreen-container');
+      onLoad() {
+        this.container =
+            getRequiredElement('traffic-event-fullscreen-container');
 
-    chrome.sync.events.addEventListener(
-      'onProtocolEvent', this._onReceivedProtocolEvent.bind(this));
+        chrome.sync.events.addEventListener(
+            'onProtocolEvent', this._onReceivedProtocolEvent.bind(this));
 
-    // Make the prototype jscontent element disappear.
-    jstProcess(new JsEvalContext({}), this.container);
-  }
-});
+        // Make the prototype jscontent element disappear.
+        jstProcess(new JsEvalContext({}), this.container);
+      }
+    }));
 
 document.addEventListener(
   'DOMContentLoaded',
diff --git a/components/sync/driver/resources/types.js b/components/sync/driver/resources/types.js
index 4195e28..94a359842 100644
--- a/components/sync/driver/resources/types.js
+++ b/components/sync/driver/resources/types.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 cr.define('chrome.sync.types', function() {
-  var typeCountersMap = {};
+  const typeCountersMap = {};
 
   /**
    * Redraws the counters table taking advantage of the most recent
@@ -11,8 +11,8 @@
    *
    * Makes use of typeCountersMap, which is defined in the containing scope.
    */
-  var refreshTypeCountersDisplay = function() {
-    var typeCountersArray = [];
+  const refreshTypeCountersDisplay = function() {
+    const typeCountersArray = [];
 
     // Transform our map into an array to make jstemplate happy.
     Object.keys(typeCountersMap).sort().forEach(function(t) {
@@ -34,8 +34,8 @@
    *
    * @param {!Object} e An event containing the list of known sync types.
    */
-  var onReceivedListOfTypes = function(e) {
-    var types = e.details.types;
+  const onReceivedListOfTypes = function(e) {
+    const types = e.details.types;
     types.map(function(type) {
       if (!typeCountersMap.hasOwnProperty(type)) {
         typeCountersMap[type] = {};
@@ -52,23 +52,24 @@
    *
    * @param {!Object} e An event containing an updated counter.
    */
-  var onCountersUpdated = function(e) {
-    var details = e.details;
+  const onCountersUpdated = function(e) {
+    const details = e.details;
 
-    var modelType = details.modelType;
-    var counters = details.counters;
+    const modelType = details.modelType;
+    const counters = details.counters;
 
-    if (typeCountersMap.hasOwnProperty(modelType))
-      for (var k in counters) {
+    if (typeCountersMap.hasOwnProperty(modelType)) {
+      for (const k in counters) {
         typeCountersMap[modelType][k] = counters[k];
       }
+    }
     refreshTypeCountersDisplay();
   };
 
   /**
    * Initializes state and callbacks for the per-type counters and status UI.
    */
-  var initTypeCounters = function() {
+  const initTypeCounters = function() {
     chrome.sync.events.addEventListener(
         'onCountersUpdated',
         onCountersUpdated);
@@ -80,7 +81,7 @@
     chrome.sync.registerForPerTypeCounters();
   };
 
-  var onLoad = function() {
+  const onLoad = function() {
     initTypeCounters();
   };
 
diff --git a/components/sync_preferences/OWNERS b/components/sync_preferences/OWNERS
index ede3ca9..8b22624 100644
--- a/components/sync_preferences/OWNERS
+++ b/components/sync_preferences/OWNERS
@@ -2,4 +2,5 @@
 battre@chromium.org
 gab@chromium.org
 
-# COMPONENT: Services>Sync
+# COMPONENT: UI>Browser>Preferences
+# TEAM: chromium-reviews@chromium.org
diff --git a/components/translate_strings_grdp/OWNERS b/components/translate_strings_grdp/OWNERS
index bb5c3afc..f02b3309 100644
--- a/components/translate_strings_grdp/OWNERS
+++ b/components/translate_strings_grdp/OWNERS
@@ -1 +1,2 @@
 file://components/translate/OWNERS
+# COMPONENT: UI>Browser>Language>Translate
diff --git a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
index 4f9597b..ab94cd41 100644
--- a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
+++ b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
@@ -61,7 +61,6 @@
                 .getServerConnection(VariationsSeedFetcher.VariationsPlatform.ANDROID, sRestrict,
                         sMilestone, sChannel);
         mPrefs = ContextUtils.getAppSharedPreferences();
-        mPrefs.edit().clear().apply();
     }
 
     @After
diff --git a/components/webdata/OWNERS b/components/webdata/OWNERS
index 26f7e47..7aa99e6 100644
--- a/components/webdata/OWNERS
+++ b/components/webdata/OWNERS
@@ -5,3 +5,4 @@
 pwnall@chromium.org
 
 # COMPONENT: Internals
+# TEAM: chromium-reviews@chromium.org
diff --git a/components/webdata_services/OWNERS b/components/webdata_services/OWNERS
index 26f7e47..7aa99e6 100644
--- a/components/webdata_services/OWNERS
+++ b/components/webdata_services/OWNERS
@@ -5,3 +5,4 @@
 pwnall@chromium.org
 
 # COMPONENT: Internals
+# TEAM: chromium-reviews@chromium.org
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index fa11692..918f249 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -582,6 +582,8 @@
     "browsing_data/clear_site_data_utils.cc",
     "browsing_data/conditional_cache_deletion_helper.cc",
     "browsing_data/conditional_cache_deletion_helper.h",
+    "browsing_data/same_site_data_remover_impl.cc",
+    "browsing_data/same_site_data_remover_impl.h",
     "browsing_data/storage_partition_code_cache_data_remover.cc",
     "browsing_data/storage_partition_code_cache_data_remover.h",
     "browsing_data/storage_partition_http_cache_data_remover.cc",
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index ed80522..9e1eb1d1 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "base/command_line.h"
 #include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
 #include "content/browser/frame_host/back_forward_cache.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/web_contents/web_contents_impl.h"
@@ -16,6 +17,7 @@
 #include "content/shell/browser/shell.h"
 #include "content/test/content_browser_test_utils_internal.h"
 #include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/controllable_http_response.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h"
@@ -644,4 +646,95 @@
   }
 }
 
+IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
+                       DoesNotCacheIfMainFrameStillLoading) {
+  net::test_server::ControllableHttpResponse response(embedded_test_server(),
+                                                      "/main_document");
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // 1) Navigate to a page that doesn't finish loading.
+  GURL url(embedded_test_server()->GetURL("a.com", "/main_document"));
+  TestNavigationManager navigation_manager(shell()->web_contents(), url);
+  shell()->LoadURL(url);
+
+  // The navigation starts.
+  EXPECT_TRUE(navigation_manager.WaitForRequestStart());
+  navigation_manager.ResumeNavigation();
+
+  // The server sends the first part of the response and waits.
+  response.WaitForRequest();
+  response.Send(
+      "HTTP/1.1 200 OK\r\n"
+      "Content-Type: text/html; charset=utf-8\r\n"
+      "\r\n"
+      "<html><body> ... ");
+
+  // The navigation finishes while the body is still loading.
+  navigation_manager.WaitForNavigationFinished();
+  RenderFrameDeletedObserver delete_rfh_a(current_frame_host());
+
+  // 2) Navigate away.
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+
+  // The page was still loading when we navigated away, so it shouldn't have
+  // been cached.
+  delete_rfh_a.WaitUntilDeleted();
+}
+
+IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
+                       DoesNotCacheIfImageStillLoading) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // 1) Navigate to a page with an image that loads forever.
+  GURL url(embedded_test_server()->GetURL("a.com",
+                                          "/infinitely_loading_image.html"));
+  TestNavigationManager navigation_manager(shell()->web_contents(), url);
+  shell()->LoadURL(url);
+
+  // The navigation finishes while the image is still loading.
+  navigation_manager.WaitForNavigationFinished();
+  RenderFrameDeletedObserver delete_rfh_a(current_frame_host());
+
+  // 2) Navigate away.
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+
+  // The page was still loading when we navigated away, so it shouldn't have
+  // been cached.
+  delete_rfh_a.WaitUntilDeleted();
+}
+
+// Test is flaky on Android (https://crbug.com/986742).
+#if defined(OS_ANDROID)
+#define MAYBE_LoadingSubframeDoesNotPreventCaching \
+  DISABLED_LoadingSubframeDoesNotPreventCaching
+#else
+#define MAYBE_LoadingSubframeDoesNotPreventCaching \
+  LoadingSubframeDoesNotPreventCaching
+#endif
+IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
+                       MAYBE_LoadingSubframeDoesNotPreventCaching) {
+  // Note: This test is only documenting current behavior. Not trying to say it
+  // should work this way...
+
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // 1) Navigate to a page with an iframe that loads forever.
+  GURL url(embedded_test_server()->GetURL("a.com",
+                                          "/infinitely_loading_iframe.html"));
+  TestNavigationManager navigation_manager(shell()->web_contents(), url);
+  shell()->LoadURL(url);
+
+  // The navigation finishes while the iframe is still loading.
+  navigation_manager.WaitForNavigationFinished();
+  RenderFrameHostImpl* rfh_a = current_frame_host();
+  RenderFrameDeletedObserver delete_rfh_a(rfh_a);
+
+  // 2) Navigate away.
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+
+  // The page with the infinitely loading iframe was cached.
+  EXPECT_FALSE(delete_rfh_a.deleted());
+  EXPECT_TRUE(rfh_a->is_in_back_forward_cache());
+}
 }  // namespace content
diff --git a/content/browser/browsing_data/same_site_data_remover_impl.cc b/content/browser/browsing_data/same_site_data_remover_impl.cc
new file mode 100644
index 0000000..a013638
--- /dev/null
+++ b/content/browser/browsing_data/same_site_data_remover_impl.cc
@@ -0,0 +1,70 @@
+// Copyright 2019 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 "content/browser/browsing_data/same_site_data_remover_impl.h"
+
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/barrier_closure.h"
+#include "base/bind.h"
+#include "base/callback.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+#include "net/cookies/canonical_cookie.h"
+#include "net/cookies/cookie_monster.h"
+#include "services/network/public/mojom/cookie_manager.mojom.h"
+
+namespace content {
+
+namespace {
+
+void OnGetAllCookies(base::OnceClosure closure,
+                     network::mojom::CookieManager* cookie_manager,
+                     std::set<std::string>* same_site_none_domains,
+                     const std::vector<net::CanonicalCookie>& cookies) {
+  base::RepeatingClosure barrier =
+      base::BarrierClosure(cookies.size(), std::move(closure));
+  for (const auto& cookie : cookies) {
+    if (cookie.GetEffectiveSameSite() == net::CookieSameSite::NO_RESTRICTION) {
+      same_site_none_domains->emplace(cookie.Domain());
+      cookie_manager->DeleteCanonicalCookie(
+          cookie, base::BindOnce([](const base::RepeatingClosure& callback,
+                                    bool success) { callback.Run(); },
+                                 barrier));
+    } else {
+      barrier.Run();
+    }
+  }
+}
+
+}  // namespace
+
+SameSiteDataRemoverImpl::SameSiteDataRemoverImpl(
+    BrowserContext* browser_context)
+    : browser_context_(browser_context) {
+  DCHECK(browser_context_);
+}
+
+SameSiteDataRemoverImpl::~SameSiteDataRemoverImpl() {}
+
+const std::set<std::string>&
+SameSiteDataRemoverImpl::GetDeletedDomainsForTesting() {
+  return same_site_none_domains_;
+}
+
+void SameSiteDataRemoverImpl::DeleteSameSiteNoneCookies(
+    base::OnceClosure closure) {
+  same_site_none_domains_.clear();
+  StoragePartition* storage_partition =
+      BrowserContext::GetDefaultStoragePartition(browser_context_);
+  auto* cookie_manager = storage_partition->GetCookieManagerForBrowserProcess();
+  cookie_manager->GetAllCookies(
+      base::BindOnce(&OnGetAllCookies, std::move(closure), cookie_manager,
+                     &same_site_none_domains_));
+}
+
+}  // namespace content
diff --git a/content/browser/browsing_data/same_site_data_remover_impl.h b/content/browser/browsing_data/same_site_data_remover_impl.h
new file mode 100644
index 0000000..030caef
--- /dev/null
+++ b/content/browser/browsing_data/same_site_data_remover_impl.h
@@ -0,0 +1,44 @@
+// Copyright 2019 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 CONTENT_BROWSER_BROWSING_DATA_SAME_SITE_DATA_REMOVER_IMPL_H_
+#define CONTENT_BROWSER_BROWSING_DATA_SAME_SITE_DATA_REMOVER_IMPL_H_
+
+#include <set>
+#include <string>
+
+#include "base/callback.h"
+#include "content/public/browser/browser_context.h"
+
+namespace net {
+class CookieStore;
+}
+
+namespace content {
+
+class CONTENT_EXPORT SameSiteDataRemoverImpl {
+ public:
+  explicit SameSiteDataRemoverImpl(BrowserContext* browser_context);
+  ~SameSiteDataRemoverImpl();
+
+  // Returns a set containing domains associated with deleted SameSite=None
+  // cookies.
+  const std::set<std::string>& GetDeletedDomainsForTesting();
+
+  // Deletes cookies with SameSite attribute value NO_RESTRICTION
+  // from the CookieStore and stores domains of deleted cookies in the
+  // same_site_none_domains_ vector. The closure is called after cookies
+  // have been deleted.
+  void DeleteSameSiteNoneCookies(base::OnceClosure closure);
+
+ private:
+  BrowserContext* browser_context_;
+  std::set<std::string> same_site_none_domains_;
+
+  DISALLOW_COPY_AND_ASSIGN(SameSiteDataRemoverImpl);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_BROWSING_DATA_SAME_SITE_DATA_REMOVER_IMPL_H_
diff --git a/content/browser/browsing_data/same_site_data_remover_impl_unittest.cc b/content/browser/browsing_data/same_site_data_remover_impl_unittest.cc
new file mode 100644
index 0000000..fa22d4c
--- /dev/null
+++ b/content/browser/browsing_data/same_site_data_remover_impl_unittest.cc
@@ -0,0 +1,234 @@
+// Copyright 2019 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 <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
+#include "base/time/time.h"
+#include "content/browser/browsing_data/same_site_data_remover_impl.h"
+#include "content/public/browser/storage_partition.h"
+#include "content/public/test/test_browser_context.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "net/cookies/cookie_monster.h"
+#include "net/url_request/url_request_context.h"
+#include "services/network/public/mojom/cookie_manager.mojom.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::IsEmpty;
+using testing::SizeIs;
+using testing::UnorderedElementsAre;
+
+namespace content {
+
+class SameSiteDataRemoverImplTest : public testing::Test {
+ public:
+  SameSiteDataRemoverImplTest()
+      : browser_context_(std::make_unique<TestBrowserContext>()),
+        same_site_remover_(
+            std::make_unique<SameSiteDataRemoverImpl>(browser_context_.get())) {
+  }
+
+  void TearDown() override { browser_context_.reset(); }
+
+  void CreateCookieForTest(
+      const std::string& cookie_name,
+      const std::string& cookie_domain,
+      net::CookieSameSite same_site,
+      net::CookieOptions::SameSiteCookieContext cookie_context) {
+    network::mojom::CookieManager* cookie_manager = GetCookieManager();
+
+    base::RunLoop run_loop;
+    net::CookieOptions options;
+    options.set_same_site_cookie_context(cookie_context);
+    bool result_out;
+    cookie_manager->SetCanonicalCookie(
+        net::CanonicalCookie(cookie_name, "1", cookie_domain, "/", base::Time(),
+                             base::Time(), base::Time(), false, false,
+                             same_site, net::COOKIE_PRIORITY_LOW),
+        "https", options,
+        base::BindLambdaForTesting(
+            [&](net::CanonicalCookie::CookieInclusionStatus result) {
+              result_out =
+                  (result ==
+                   net::CanonicalCookie::CookieInclusionStatus::INCLUDE);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+    EXPECT_TRUE(result_out);
+  }
+
+  std::vector<net::CanonicalCookie> GetAllCookies(
+      network::mojom::CookieManager* cookie_manager) {
+    base::RunLoop run_loop;
+    std::vector<net::CanonicalCookie> cookies_out;
+    cookie_manager->GetAllCookies(base::BindLambdaForTesting(
+        [&](const std::vector<net::CanonicalCookie>& cookies) {
+          cookies_out = cookies;
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+    return cookies_out;
+  }
+
+  SameSiteDataRemoverImpl* GetSameSiteDataRemoverImpl() {
+    return same_site_remover_.get();
+  }
+
+  network::mojom::CookieManager* GetCookieManager() {
+    StoragePartition* storage_partition =
+        BrowserContext::GetDefaultStoragePartition(browser_context_.get());
+    return storage_partition->GetCookieManagerForBrowserProcess();
+  }
+
+  void DeleteSameSiteNoneCookies() {
+    base::RunLoop run_loop;
+    GetSameSiteDataRemoverImpl()->DeleteSameSiteNoneCookies(
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+
+ private:
+  TestBrowserThreadBundle thread_bundle_;
+  std::unique_ptr<BrowserContext> browser_context_;
+  std::unique_ptr<SameSiteDataRemoverImpl> same_site_remover_;
+
+  DISALLOW_COPY_AND_ASSIGN(SameSiteDataRemoverImplTest);
+};
+
+TEST_F(SameSiteDataRemoverImplTest, TestRemoveSameSiteNoneCookies) {
+  CreateCookieForTest("TestCookie1", "www.google.com",
+                      net::CookieSameSite::NO_RESTRICTION,
+                      net::CookieOptions::SameSiteCookieContext::CROSS_SITE);
+  CreateCookieForTest("TestCookie2", "www.gmail.google.com",
+                      net::CookieSameSite::NO_RESTRICTION,
+                      net::CookieOptions::SameSiteCookieContext::CROSS_SITE);
+
+  DeleteSameSiteNoneCookies();
+
+  EXPECT_THAT(GetSameSiteDataRemoverImpl()->GetDeletedDomainsForTesting(),
+              UnorderedElementsAre("www.google.com", "www.gmail.google.com"));
+
+  const std::vector<net::CanonicalCookie>& cookies =
+      GetAllCookies(GetCookieManager());
+  EXPECT_THAT(cookies, IsEmpty());
+}
+
+TEST_F(SameSiteDataRemoverImplTest, TestRemoveOnlySameSiteNoneCookies) {
+  CreateCookieForTest("TestCookie1", "www.google.com",
+                      net::CookieSameSite::NO_RESTRICTION,
+                      net::CookieOptions::SameSiteCookieContext::CROSS_SITE);
+  // The second cookie has SameSite value STRICT_MODE instead of NO_RESTRICTION.
+  CreateCookieForTest(
+      "TestCookie2", "www.gmail.google.com", net::CookieSameSite::STRICT_MODE,
+      net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT);
+
+  DeleteSameSiteNoneCookies();
+
+  EXPECT_THAT(GetSameSiteDataRemoverImpl()->GetDeletedDomainsForTesting(),
+              UnorderedElementsAre("www.google.com"));
+
+  const std::vector<net::CanonicalCookie>& cookies =
+      GetAllCookies(GetCookieManager());
+  ASSERT_EQ(1u, cookies.size());
+  ASSERT_EQ(cookies[0].Name(), "TestCookie2");
+}
+
+TEST_F(SameSiteDataRemoverImplTest, TestRemoveSameDomainCookies) {
+  CreateCookieForTest("TestCookie1", "www.google.com",
+                      net::CookieSameSite::NO_RESTRICTION,
+                      net::CookieOptions::SameSiteCookieContext::CROSS_SITE);
+  // The second cookie has the same domain as the first cookie, but also has
+  // SameSite value STRICT_MODE instead of NO_RESTRICTION.
+  CreateCookieForTest(
+      "TestCookie2", "www.google.com", net::CookieSameSite::STRICT_MODE,
+      net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT);
+
+  DeleteSameSiteNoneCookies();
+
+  EXPECT_THAT(GetSameSiteDataRemoverImpl()->GetDeletedDomainsForTesting(),
+              UnorderedElementsAre("www.google.com"));
+
+  const std::vector<net::CanonicalCookie>& cookies =
+      GetAllCookies(GetCookieManager());
+  ASSERT_EQ(1u, cookies.size());
+  ASSERT_EQ(cookies[0].Name(), "TestCookie2");
+}
+
+TEST_F(SameSiteDataRemoverImplTest, TestKeepSameSiteCookies) {
+  CreateCookieForTest("TestCookie1", "www.google.com",
+                      net::CookieSameSite::LAX_MODE,
+                      net::CookieOptions::SameSiteCookieContext::SAME_SITE_LAX);
+  CreateCookieForTest(
+      "TestCookie2", "www.gmail.google.com", net::CookieSameSite::STRICT_MODE,
+      net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT);
+
+  DeleteSameSiteNoneCookies();
+
+  ASSERT_THAT(GetSameSiteDataRemoverImpl()->GetDeletedDomainsForTesting(),
+              IsEmpty());
+
+  const std::vector<net::CanonicalCookie>& cookies =
+      GetAllCookies(GetCookieManager());
+  EXPECT_THAT(2u, cookies.size());
+}
+
+TEST_F(SameSiteDataRemoverImplTest, TestCookieRemovalUnaffectedByParameters) {
+  network::mojom::CookieManager* cookie_manager = GetCookieManager();
+
+  base::RunLoop run_loop1;
+  net::CookieOptions options;
+  options.set_include_httponly();
+  bool result_out = false;
+  cookie_manager->SetCanonicalCookie(
+      net::CanonicalCookie("TestCookie1", "20", "google.com", "/",
+                           base::Time::Now(), base::Time(), base::Time(), false,
+                           true, net::CookieSameSite::NO_RESTRICTION,
+                           net::COOKIE_PRIORITY_HIGH),
+      "https", options,
+      base::BindLambdaForTesting(
+          [&](net::CanonicalCookie::CookieInclusionStatus result) {
+            result_out = (result ==
+                          net::CanonicalCookie::CookieInclusionStatus::INCLUDE);
+            run_loop1.Quit();
+          }));
+  run_loop1.Run();
+  EXPECT_TRUE(result_out);
+
+  base::RunLoop run_loop2;
+  options.set_same_site_cookie_context(
+      net::CookieOptions::SameSiteCookieContext::SAME_SITE_LAX);
+  result_out = false;
+  cookie_manager->SetCanonicalCookie(
+      net::CanonicalCookie("TestCookie2", "10", "gmail.google.com", "/",
+                           base::Time(), base::Time::Max(), base::Time(), false,
+                           true, net::CookieSameSite::LAX_MODE,
+                           net::COOKIE_PRIORITY_HIGH),
+      "https", options,
+      base::BindLambdaForTesting(
+          [&](net::CanonicalCookie::CookieInclusionStatus result) {
+            result_out = (result ==
+                          net::CanonicalCookie::CookieInclusionStatus::INCLUDE);
+            run_loop2.Quit();
+          }));
+  run_loop2.Run();
+  EXPECT_TRUE(result_out);
+
+  DeleteSameSiteNoneCookies();
+
+  EXPECT_THAT(GetSameSiteDataRemoverImpl()->GetDeletedDomainsForTesting(),
+              UnorderedElementsAre("google.com"));
+
+  const std::vector<net::CanonicalCookie>& cookies =
+      GetAllCookies(cookie_manager);
+  ASSERT_EQ(1u, cookies.size());
+  ASSERT_EQ(cookies[0].Name(), "TestCookie2");
+}
+
+}  // namespace content
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 43b89f3b2..2e2d4aa 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -1751,14 +1751,30 @@
   EXPECT_TRUE(CachePut(original_handle.value(), kBarURL));
   original_handle = CacheStorageCacheHandle();
 
+  // Capture the size before the index has necessarily flushed to disk.
   std::vector<StorageUsageInfo> usage = GetAllOriginsUsage();
   ASSERT_EQ(1ULL, usage.size());
   int64_t usage_before_close = usage[0].total_size_bytes;
   EXPECT_GT(usage_before_close, 0);
 
+  // Flush the index to ensure we can read it correctly from the index file.
+  EXPECT_TRUE(FlushCacheStorageIndex(origin1_));
+
   // Close the caches and cache manager.
   DestroyStorageManager();
 
+  CreateStorageManager();
+  quota_manager_proxy_->SimulateQuotaManagerDestroyed();
+  RecreateStorageManager();
+
+  // Read the size from the index file.
+  CreateStorageManager();
+  usage = GetAllOriginsUsage();
+  ASSERT_EQ(1ULL, usage.size());
+  EXPECT_EQ(usage_before_close, usage[0].total_size_bytes);
+
+  DestroyStorageManager();
+
   // Restore the index to the V1 state. Make the access/mod times of index file
   // older than the other directories in the store to trigger size
   // recalculation.
@@ -1767,6 +1783,7 @@
   EXPECT_TRUE(base::TouchFile(index_path, t, t));
   EXPECT_FALSE(IsIndexFileCurrent(storage_dir));
 
+  // Read the size with the stale index file forcing a recalculation.
   CreateStorageManager();
   usage = GetAllOriginsUsage();
   ASSERT_EQ(1ULL, usage.size());
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_manager.cc b/content/browser/cache_storage/legacy/legacy_cache_storage_manager.cc
index 384bc80..2d6b24c 100644
--- a/content/browser/cache_storage/legacy/legacy_cache_storage_manager.cc
+++ b/content/browser/cache_storage/legacy/legacy_cache_storage_manager.cc
@@ -57,14 +57,45 @@
 
 // Calculate the sum of all cache sizes in this store, but only if all sizes are
 // known. If one or more sizes are not known then return kSizeUnknown.
-int64_t GetCacheStorageSize(const proto::CacheStorageIndex& index) {
+int64_t GetCacheStorageSize(const base::FilePath& base_path,
+                            const base::Time& base_path_time,
+                            const base::Time& index_time,
+                            const proto::CacheStorageIndex& index) {
+  // If the base path's modified time is newer than the index, then the
+  // contents of a cache must have changed.  The index is stale.
+  if (base_path_time > index_time)
+    return CacheStorage::kSizeUnknown;
+
+  // It should be impossible for the directory containing the index to
+  // have a modified time older than the index's modified time.  Modifying
+  // the index should update the directories time as well.  Therefore we
+  // should be guaranteed that the time is equal here.
+  DCHECK_EQ(base_path_time, index_time);
+
   int64_t storage_size = 0;
   for (int i = 0, max = index.cache_size(); i < max; ++i) {
     const proto::CacheStorageIndex::Cache& cache = index.cache(i);
-    if (!cache.has_size() || cache.size() == CacheStorage::kSizeUnknown)
+    if (!cache.has_cache_dir() || !cache.has_size() ||
+        cache.size() == CacheStorage::kSizeUnknown) {
       return CacheStorage::kSizeUnknown;
+    }
+
+    // Check the modified time on each cache directory.  If one of the
+    // directories has the same or newer modified time as the index file, then
+    // its size is most likely not accounted for in the index file.  The
+    // cache can have a newer time here in spite of our base path time check
+    // above since simple disk_cache writes to these directories from a
+    // different thread.
+    base::FilePath path = base_path.AppendASCII(cache.cache_dir());
+    base::File::Info file_info;
+    if (!base::GetFileInfo(path, &file_info) ||
+        file_info.last_modified >= index_time) {
+      return CacheStorage::kSizeUnknown;
+    }
+
     storage_size += cache.size();
   }
+
   return storage_size;
 }
 
@@ -145,9 +176,11 @@
       continue;
     }
 
-    int64_t storage_size = CacheStorage::kSizeUnknown;
-    if (file_info.last_modified < index_last_modified)
-      storage_size = GetCacheStorageSize(index);
+    int64_t storage_size = GetCacheStorageSize(path, file_info.last_modified,
+                                               index_last_modified, index);
+    base::UmaHistogramBoolean("ServiceWorkerCache.UsedIndexFileSize",
+                              storage_size != CacheStorage::kSizeUnknown);
+
     usages->push_back(
         StorageUsageInfo(origin, storage_size, file_info.last_modified));
     RecordIndexValidationResult(IndexResult::kOk);
diff --git a/content/browser/frame_host/back_forward_cache.cc b/content/browser/frame_host/back_forward_cache.cc
index 590407bf..da3c58b 100644
--- a/content/browser/frame_host/back_forward_cache.cc
+++ b/content/browser/frame_host/back_forward_cache.cc
@@ -94,6 +94,13 @@
   if (!IsBackForwardCacheEnabled())
     return false;
 
+  // Note that we check is_loading on the rfh directly, rather than calling
+  // FrameTreeNode::IsLoading. This is because FrameTreeNode is already
+  // loading the new page being navigated to.
+  // TODO(lowell): Consider also checking whether any subframes are loading.
+  if (rfh->is_loading())
+    return false;
+
   // Don't enable BackForwardCache if the page has any disallowed features.
   // TODO(lowell): Handle races involving scheduler_tracked_features.
   // One solution could be to listen for changes to scheduler_tracked_features
diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller.cc b/content/browser/renderer_host/input/synthetic_gesture_controller.cc
index dda9d3e..8a99d72 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller.cc
@@ -28,6 +28,29 @@
     GestureCompleted(SyntheticGesture::GESTURE_FINISHED);
 }
 
+void SyntheticGestureController::EnsureRendererInitialized(
+    base::OnceClosure on_completed) {
+  if (renderer_known_to_be_initialized_)
+    return;
+
+  base::OnceClosure wrapper = base::BindOnce(
+      [](base::WeakPtr<SyntheticGestureController> weak_ptr,
+         base::OnceClosure on_completed) {
+        if (weak_ptr)
+          weak_ptr->renderer_known_to_be_initialized_ = true;
+
+        std::move(on_completed).Run();
+      },
+      weak_ptr_factory_.GetWeakPtr(), std::move(on_completed));
+
+  // TODO(bokan): This will wait for the renderer to produce a frame and the
+  // GPU to present it but we should really be waiting for hit testing data to
+  // have been updated in the browser. https://crbug.com/985374.
+  gesture_target_->WaitForTargetAck(
+      SyntheticGestureParams::WAIT_FOR_INPUT_PROCESSED,
+      SyntheticGestureParams::DEFAULT_INPUT, std::move(wrapper));
+}
+
 void SyntheticGestureController::QueueSyntheticGesture(
     std::unique_ptr<SyntheticGesture> synthetic_gesture,
     OnGestureCompleteCallback completion_callback) {
@@ -55,7 +78,7 @@
                               complete_immediately);
 
   if (was_empty)
-    StartGesture(*pending_gesture_queue_.FrontGesture());
+    StartGesture();
 }
 
 void SyntheticGestureController::StartTimer(bool high_frequency) {
@@ -98,12 +121,35 @@
   return !pending_gesture_queue_.IsEmpty();
 }
 
-void SyntheticGestureController::StartGesture(const SyntheticGesture& gesture) {
-  TRACE_EVENT_ASYNC_BEGIN0("input,benchmark",
-                           "SyntheticGestureController::running",
-                           &gesture);
-  if (!dispatch_timer_.IsRunning())
+void SyntheticGestureController::StartGesture() {
+  if (!renderer_known_to_be_initialized_) {
+    base::OnceClosure on_initialized = base::BindOnce(
+        [](base::WeakPtr<SyntheticGestureController> weak_ptr) {
+          if (!weak_ptr)
+            return;
+
+          // The renderer_known_to_be_initialized_ bit should be flipped before
+          // this callback is invoked in EnsureRendererInitialized so we don't
+          // call EnsureRendererInitialized again.
+          DCHECK(weak_ptr->renderer_known_to_be_initialized_);
+          weak_ptr->StartGesture();
+        },
+        weak_ptr_factory_.GetWeakPtr());
+
+    // We don't yet know whether the renderer is ready for input. Force it to
+    // produce a compositor frame and once it does we'll callback into this
+    // function to start the gesture.
+    EnsureRendererInitialized(std::move(on_initialized));
+    return;
+  }
+
+  if (!dispatch_timer_.IsRunning()) {
+    DCHECK(!pending_gesture_queue_.IsEmpty());
+    const SyntheticGesture& gesture = *pending_gesture_queue_.FrontGesture();
+    TRACE_EVENT_ASYNC_BEGIN0("input,benchmark",
+                             "SyntheticGestureController::running", &gesture);
     StartTimer(gesture.AllowHighFrequencyDispatch());
+  }
 }
 
 void SyntheticGestureController::StopGesture(const SyntheticGesture& gesture,
@@ -137,7 +183,7 @@
   pending_gesture_queue_.FrontCallback().Run(result);
   pending_gesture_queue_.Pop();
   if (!pending_gesture_queue_.IsEmpty())
-    StartGesture(*pending_gesture_queue_.FrontGesture());
+    StartGesture();
 }
 
 SyntheticGestureController::GestureAndCallbackQueue::GestureAndCallbackQueue() {
diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller.h b/content/browser/renderer_host/input/synthetic_gesture_controller.h
index 578edefe..0528ecf1 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller.h
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller.h
@@ -54,6 +54,8 @@
 
   bool DispatchNextEvent(base::TimeTicks = base::TimeTicks::Now());
 
+  void EnsureRendererInitialized(base::OnceClosure on_completed);
+
  private:
   friend class SyntheticGestureControllerTestBase;
 
@@ -63,7 +65,7 @@
       bool complete_immediately);
 
   void StartTimer(bool high_frequency);
-  void StartGesture(const SyntheticGesture& gesture);
+  void StartGesture();
   void StopGesture(const SyntheticGesture& gesture,
                    SyntheticGesture::Result result,
                    bool complete_immediately);
@@ -130,6 +132,18 @@
     DISALLOW_COPY_AND_ASSIGN(GestureAndCallbackQueue);
   } pending_gesture_queue_;
 
+  // The first time we start sending a gesture, the renderer may not yet be
+  // ready to receive events. e.g. Tests often start a gesture from script
+  // before load. The renderer  may not yet have produced a compositor frame
+  // and geometry data may not yet be available in the browser. The first time
+  // we try to start a gesture, we'll first force a redraw in the renderer and
+  // wait until it produces a compositor frame. The gesture will begin after
+  // that happens.
+  // TODO(bokan): The renderer currently just waits for a CompositorFrame to be
+  // generated. We should be waiting for hit test data to be available to be
+  // truly robust. https://crbug.com/985374.
+  bool renderer_known_to_be_initialized_ = false;
+
   base::RepeatingTimer dispatch_timer_;
   base::WeakPtrFactory<SyntheticGestureController> weak_ptr_factory_{this};
 
diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller_unittest.cc b/content/browser/renderer_host/input/synthetic_gesture_controller_unittest.cc
index d769105..1854a27 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller_unittest.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller_unittest.cc
@@ -804,6 +804,10 @@
       num_failure_++;
   }
 
+  bool DispatchTimerRunning() const {
+    return controller_->dispatch_timer_.IsRunning();
+  }
+
   base::TimeDelta GetTotalTime() const { return time_ - start_time_; }
 
   base::test::ScopedTaskEnvironment env_;
@@ -2011,4 +2015,78 @@
       pointer_pen_target->SyntheticMouseActionDispatchedCorrectly(param, 0));
 }
 
+class MockSyntheticGestureTargetManualAck : public MockSyntheticGestureTarget {
+ public:
+  void WaitForTargetAck(SyntheticGestureParams::GestureType type,
+                        SyntheticGestureParams::GestureSourceType source,
+                        base::OnceClosure callback) const override {
+    if (manually_ack_)
+      target_ack_ = std::move(callback);
+    else
+      std::move(callback).Run();
+  }
+  bool HasOutstandingAck() const { return !target_ack_.is_null(); }
+  void InvokeAck() {
+    DCHECK(HasOutstandingAck());
+    std::move(target_ack_).Run();
+  }
+  void SetManuallyAck(bool manually_ack) { manually_ack_ = manually_ack; }
+
+ private:
+  mutable base::OnceClosure target_ack_;
+  bool manually_ack_ = true;
+};
+
+// Ensure the first time a gesture is queued, we wait for a renderer ACK before
+// starting the gesture. Following gestures should start immediately. This test
+// the renderer_known_to_be_initialized_ bit in the controller.
+TEST_F(SyntheticGestureControllerTest, WaitForRendererInitialization) {
+  CreateControllerAndTarget<MockSyntheticGestureTargetManualAck>();
+
+  auto* target = static_cast<MockSyntheticGestureTargetManualAck*>(target_);
+
+  EXPECT_FALSE(target->HasOutstandingAck());
+
+  SyntheticTapGestureParams params;
+  params.gesture_source_type = SyntheticGestureParams::TOUCH_INPUT;
+  params.duration_ms = 123;
+  params.position.SetPoint(87, -124);
+
+  // Queue the first gesture.
+  {
+    auto gesture = std::make_unique<SyntheticTapGesture>(params);
+    QueueSyntheticGesture(std::move(gesture));
+
+    // We should have received a WaitForTargetAck and the dispatch timer won't
+    // start until that's ACK'd.
+    EXPECT_TRUE(target->HasOutstandingAck());
+    EXPECT_FALSE(DispatchTimerRunning());
+
+    target->InvokeAck();
+
+    // The timer should now be running.
+    EXPECT_FALSE(target->HasOutstandingAck());
+    EXPECT_TRUE(DispatchTimerRunning());
+  }
+
+  // Finish the gesture.
+  {
+    target->SetManuallyAck(false);
+    FlushInputUntilComplete();
+    target->SetManuallyAck(true);
+    EXPECT_FALSE(DispatchTimerRunning());
+  }
+
+  // Queue the second gesture.
+  {
+    auto gesture = std::make_unique<SyntheticTapGesture>(params);
+    QueueSyntheticGesture(std::move(gesture));
+
+    // This time, because we've already sent a gesuture to the renderer,
+    // there's no need to wait for an ACK before starting the dispatch timer.
+    EXPECT_FALSE(target->HasOutstandingAck());
+    EXPECT_TRUE(DispatchTimerRunning());
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/input/touch_action_browsertest.cc b/content/browser/renderer_host/input/touch_action_browsertest.cc
index 65f4d2d..c13373b 100644
--- a/content/browser/renderer_host/input/touch_action_browsertest.cc
+++ b/content/browser/renderer_host/input/touch_action_browsertest.cc
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/input/synthetic_gesture.h"
@@ -289,6 +290,8 @@
     DCHECK(URLLoaded());
     EXPECT_EQ(0, GetScrollTop());
 
+    EnsureInitializedForSyntheticGestures();
+
     int scroll_height =
         ExecuteScriptAndExtractInt("document.documentElement.scrollHeight");
     EXPECT_EQ(expected_scroll_height_after_scroll, scroll_height);
@@ -408,6 +411,22 @@
     run_loop_.reset();
   }
 
+  // Sends a no-op gesture to the page to ensure the SyntheticGestureController
+  // is initialized. We need to do this if the first sent gesture happens when
+  // the main thread is janked, otherwise the initialization won't happen
+  // because of the blocked main thread.
+  void EnsureInitializedForSyntheticGestures() {
+    DCHECK(URLLoaded());
+
+    base::RunLoop run_loop;
+
+    GetWidgetHost()->EnsureReadyForSyntheticGestures(
+        base::BindLambdaForTesting([&]() { run_loop.Quit(); }));
+
+    // Runs until we get the OnSyntheticGestureCompleted callback
+    run_loop.Run();
+  }
+
   void CheckScrollOffset(
       bool wait_until_scrolled,
       const gfx::Vector2d& expected_scroll_position_after_scroll) {
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc
index b124bd7b..77a0524 100644
--- a/content/browser/renderer_host/media/media_devices_manager.cc
+++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -1057,6 +1057,7 @@
   DCHECK(type == blink::MEDIA_DEVICE_TYPE_AUDIO_INPUT ||
          type == blink::MEDIA_DEVICE_TYPE_VIDEO_INPUT);
 
+  std::vector<blink::WebMediaDeviceInfo> removed_audio_devices;
   for (const auto& old_device_info : current_snapshot_[type]) {
     auto it =
         std::find_if(new_snapshot.begin(), new_snapshot.end(),
@@ -1066,8 +1067,31 @@
 
     // If a device was removed, notify the MediaStreamManager to stop all
     // streams using that device.
-    if (it == new_snapshot.end())
+    if (it == new_snapshot.end()) {
       stop_removed_input_device_cb_.Run(type, old_device_info);
+
+      if (type == blink::MEDIA_DEVICE_TYPE_AUDIO_INPUT)
+        removed_audio_devices.push_back(old_device_info);
+    }
+  }
+
+  // "default" and "communications" audio devices that have been removed,
+  // require an extra notification. In fact, such audio devices have associated
+  // virtual audio devices in the snapshot with the special "default" or
+  // "communications" IDs. The code below implements an heuristic, such that to
+  // identify if an audio device was default, it checks whether the old
+  // snapshot contained an audio device with the same group ID and device ID
+  // matching either "default" or "communications".
+  for (const auto& removed_audio_device : removed_audio_devices) {
+    for (const auto& old_device_info : current_snapshot_[type]) {
+      if (removed_audio_device.group_id == old_device_info.group_id &&
+          (old_device_info.device_id ==
+               media::AudioDeviceDescription::kDefaultDeviceId ||
+           old_device_info.device_id ==
+               media::AudioDeviceDescription::kCommunicationsDeviceId)) {
+        stop_removed_input_device_cb_.Run(type, old_device_info);
+      }
+    }
   }
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index dcdc9a6..8278ff4f 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1550,6 +1550,19 @@
   }
 }
 
+void RenderWidgetHostImpl::EnsureReadyForSyntheticGestures(
+    base::OnceClosure on_ready) {
+  CreateSyntheticGestureControllerIfNecessary();
+  if (synthetic_gesture_controller_) {
+    synthetic_gesture_controller_->EnsureRendererInitialized(
+        std::move(on_ready));
+  } else {
+    // If we couldn't create a SyntheticGestureController then we won't ever be
+    // ready.  Invoke the callback to unblock the calling code.
+    std::move(on_ready).Run();
+  }
+}
+
 void RenderWidgetHostImpl::SetCursor(const WebCursor& cursor) {
   if (!view_)
     return;
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 3d61b81..3507700 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -456,6 +456,13 @@
   void QueueSyntheticGestureCompleteImmediately(
       std::unique_ptr<SyntheticGesture> synthetic_gesture);
 
+  // Ensures the renderer is in a state ready to receive synthetic input. The
+  // SyntheticGestureController will normally ensure this before sending the
+  // first gesture; however, in some tests that may be a bad time (e.g. the
+  // gesture is sent while the main thread is blocked) so this allows the
+  // caller to do so manually.
+  void EnsureReadyForSyntheticGestures(base::OnceClosure on_ready);
+
   // Update the composition node of the renderer (or WebKit).
   // WebKit has a special node (a composition node) for input method to change
   // its text without affecting any other DOM nodes. When the input method
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index cdf9f02..8d9c5e5e 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -670,14 +670,9 @@
       WriteData(std::move(pending_buffer), bytes_available);
       return;
     case MOJO_RESULT_FAILED_PRECONDITION:
-      // Closed by peer. This indicates all the data from the network service
-      // are read or there is an error. In the error case, the reason is
-      // notified via OnComplete().
-      body_writer_state_ = WriterState::kCompleted;
-      if (network_loader_state_ == NetworkLoaderState::kCompleted) {
-        CommitCompleted(network::URLLoaderCompletionStatus(net::OK),
-                        std::string() /* status_message */);
-      }
+      // Call WriteData() with null buffer to let the cache writer know that
+      // body from the network reaches to the end.
+      WriteData(/*pending_buffer=*/nullptr, /*bytes_available=*/0);
       return;
     case MOJO_RESULT_SHOULD_WAIT:
       network_watcher_.ArmOrNotify();
@@ -693,7 +688,8 @@
   // next time.
   uint32_t bytes_written = std::min<uint32_t>(kReadBufferSize, bytes_available);
 
-  auto buffer = base::MakeRefCounted<WrappedIOBuffer>(pending_buffer->buffer());
+  auto buffer = base::MakeRefCounted<WrappedIOBuffer>(
+      pending_buffer ? pending_buffer->buffer() : nullptr);
   MojoResult result = client_producer_->WriteData(
       buffer->data(), &bytes_written, MOJO_WRITE_DATA_FLAG_NONE);
   switch (result) {
@@ -719,6 +715,8 @@
 
   // Write the buffer in the service worker script storage up to the size we
   // successfully wrote to the data pipe (i.e., |bytes_written|).
+  // A null buffer and zero |bytes_written| are passed when this is the end of
+  // the body.
   net::Error error = cache_writer_->MaybeWriteData(
       buffer.get(), base::strict_cast<size_t>(bytes_written),
       base::BindOnce(&ServiceWorkerNewScriptLoader::OnWriteDataComplete,
@@ -745,9 +743,23 @@
                     ServiceWorkerConsts::kServiceWorkerFetchScriptError);
     return;
   }
-  DCHECK(pending_buffer);
   ServiceWorkerMetrics::CountWriteResponseResult(
       ServiceWorkerMetrics::WRITE_OK);
+
+  if (bytes_written == 0) {
+    // Zero |bytes_written| with net::OK means that all data has been read from
+    // the network and the Mojo data pipe has been closed. Thus we can complete
+    // the request if OnComplete() has already been received.
+    DCHECK(!pending_buffer);
+    body_writer_state_ = WriterState::kCompleted;
+    if (network_loader_state_ == NetworkLoaderState::kCompleted) {
+      CommitCompleted(network::URLLoaderCompletionStatus(net::OK),
+                      std::string() /* status_message */);
+    }
+    return;
+  }
+
+  DCHECK(pending_buffer);
   pending_buffer->CompleteRead(bytes_written);
   // Get the consumer handle from a previous read operation if we have one.
   network_consumer_ = pending_buffer->ReleaseHandle();
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 0c3d82e..d96da29 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -109,16 +109,16 @@
     }
     client->OnReceiveResponse(response_head);
 
-    // Pass the response body to the client.
-    if (!response.body.empty()) {
-      uint32_t bytes_written = response.body.size();
-      mojo::DataPipe data_pipe;
-      MojoResult result = data_pipe.producer_handle->WriteData(
-          response.body.data(), &bytes_written,
-          MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
-      ASSERT_EQ(MOJO_RESULT_OK, result);
-      client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-    }
+    uint32_t bytes_written = response.body.size();
+    mojo::ScopedDataPipeConsumerHandle consumer;
+    mojo::ScopedDataPipeProducerHandle producer;
+    ASSERT_EQ(MOJO_RESULT_OK,
+              mojo::CreateDataPipe(nullptr, &producer, &consumer));
+    MojoResult result = producer->WriteData(
+        response.body.data(), &bytes_written, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
+    ASSERT_EQ(MOJO_RESULT_OK, result);
+    client->OnStartLoadingResponseBody(std::move(consumer));
+
     network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     client->OnComplete(status);
@@ -303,10 +303,11 @@
       mojo::BlockingCopyToString(client->response_body_release(), &response));
   EXPECT_EQ(mock_server_->Get(kScriptURL).body, response);
 
-  // The response should also be stored in the storage.
+  // WRITE_OK should be recorded once plus one as we record a single write
+  // success and the end of the body.
   EXPECT_TRUE(VerifyStoredResponse(kScriptURL));
   histogram_tester.ExpectUniqueSample(kHistogramWriteResponseResult,
-                                      ServiceWorkerMetrics::WRITE_OK, 1);
+                                      ServiceWorkerMetrics::WRITE_OK, 2);
 }
 
 TEST_F(ServiceWorkerNewScriptLoaderTest, Success_EmptyBody) {
@@ -327,12 +328,13 @@
 
   // The client should have received the response.
   EXPECT_TRUE(client->has_received_response());
-  EXPECT_FALSE(client->response_body().is_valid());
+  EXPECT_TRUE(client->response_body().is_valid());
 
   // The response should also be stored in the storage.
   EXPECT_TRUE(VerifyStoredResponse(kScriptURL));
-  // We don't record write response result if body is empty.
-  histogram_tester.ExpectTotalCount(kHistogramWriteResponseResult, 0);
+  // WRITE_OK should be recorded once as we record the end of the body.
+  histogram_tester.ExpectUniqueSample(kHistogramWriteResponseResult,
+                                      ServiceWorkerMetrics::WRITE_OK, 1);
 }
 
 TEST_F(ServiceWorkerNewScriptLoaderTest, Success_LargeBody) {
@@ -368,9 +370,10 @@
 
   // The response should also be stored in the storage.
   EXPECT_TRUE(VerifyStoredResponse(kScriptURL));
-  // WRITE_OK should be recorded twice as we record every single write success.
+  // WRITE_OK should be recorded twice plus one as we record every single write
+  // success and the end of the body.
   histogram_tester.ExpectUniqueSample(kHistogramWriteResponseResult,
-                                      ServiceWorkerMetrics::WRITE_OK, 2);
+                                      ServiceWorkerMetrics::WRITE_OK, 3);
 }
 
 TEST_F(ServiceWorkerNewScriptLoaderTest, Error_404) {
@@ -530,10 +533,11 @@
       mojo::BlockingCopyToString(client->response_body_release(), &response));
   EXPECT_EQ(mock_server_->Get(kScriptURL).body, response);
 
-  // The response should also be stored in the storage.
+  // WRITE_OK should be recorded once plus one as we record a single write
+  // success and the end of the body.
   EXPECT_TRUE(VerifyStoredResponse(kScriptURL));
   histogram_tester.ExpectUniqueSample(kHistogramWriteResponseResult,
-                                      ServiceWorkerMetrics::WRITE_OK, 1);
+                                      ServiceWorkerMetrics::WRITE_OK, 2);
 }
 
 TEST_F(ServiceWorkerNewScriptLoaderTest, Error_PathRestriction) {
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index e1868a4..b29e2479 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -36,8 +36,8 @@
 // Returns true if CreateForURL() and related functions should be allowed to
 // return a default SiteInstance.
 bool ShouldAllowDefaultSiteInstance() {
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableDefaultSiteInstance);
+  return base::FeatureList::IsEnabled(
+      features::kProcessSharingWithDefaultSiteInstances);
 }
 
 }  // namespace
diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc
index eba8724..98d2515f 100644
--- a/content/browser/tracing/background_tracing_manager_impl.cc
+++ b/content/browser/tracing/background_tracing_manager_impl.cc
@@ -62,7 +62,7 @@
 constexpr size_t kUploadLimitKb = 30 * 1024;  // Less than 10MB compressed size.
 #endif
 
-bool IsTraceLogUploadAllowed(size_t trace_size_kb) {
+size_t TraceLogUploadLimitKb() {
 #if defined(OS_ANDROID)
   auto connection_type = net::NetworkChangeNotifier::GetConnectionType();
   if (connection_type != net::NetworkChangeNotifier::CONNECTION_WIFI &&
@@ -235,7 +235,7 @@
   if (trace_to_upload_.empty()) {
     return false;
   }
-  if (!IsTraceLogUploadAllowed(trace_to_upload_.size())) {
+  if (trace_to_upload_.size() > TraceLogUploadLimitKb() * 1024) {
     RecordMetric(Metrics::LARGE_UPLOAD_WAITING_TO_RETRY);
     return false;
   }
diff --git a/content/browser/web_package/signed_exchange_devtools_proxy.cc b/content/browser/web_package/signed_exchange_devtools_proxy.cc
index 2a24b5c..097b592 100644
--- a/content/browser/web_package/signed_exchange_devtools_proxy.cc
+++ b/content/browser/web_package/signed_exchange_devtools_proxy.cc
@@ -21,17 +21,16 @@
 
 namespace {
 
-// Runs |task| on the thread specified by |thread_id| if already on that thread,
-// otherwise posts a task to that thread.
-void RunOrPostTaskIfNecessary(const base::Location& from_here,
-                              BrowserThread::ID thread_id,
-                              base::OnceClosure task) {
-  if (BrowserThread::CurrentlyOn(thread_id)) {
+// If on the UI thread, just run |task|, otherwise post a task to run
+// the thread on the UI thread.
+void RunOrPostTaskIfNotOnUiThread(const base::Location& from_here,
+                                  base::OnceClosure task) {
+  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
     std::move(task).Run();
     return;
   }
 
-  base::PostTaskWithTraits(from_here, {thread_id}, std::move(task));
+  base::PostTaskWithTraits(from_here, {BrowserThread::UI}, std::move(task));
 }
 
 void AddErrorMessageToConsoleOnUI(
@@ -132,8 +131,8 @@
   DCHECK_CURRENTLY_ON(
       NavigationURLLoaderImpl::GetLoaderRequestControllerThreadID());
   errors_.push_back(SignedExchangeError(message, std::move(error_field)));
-  RunOrPostTaskIfNecessary(
-      FROM_HERE, BrowserThread::UI,
+  RunOrPostTaskIfNotOnUiThread(
+      FROM_HERE,
       base::BindOnce(&AddErrorMessageToConsoleOnUI, frame_tree_node_id_getter_,
                      std::move(message)));
 }
@@ -144,8 +143,8 @@
   if (!devtools_enabled_)
     return;
 
-  RunOrPostTaskIfNecessary(
-      FROM_HERE, BrowserThread::UI,
+  RunOrPostTaskIfNotOnUiThread(
+      FROM_HERE,
       base::BindOnce(
           &CertificateRequestSentOnUI, frame_tree_node_id_getter_, request_id,
           devtools_navigation_token_ ? *devtools_navigation_token_ : request_id,
@@ -163,8 +162,8 @@
   auto resource_response = base::MakeRefCounted<network::ResourceResponse>();
   resource_response->head = head;
 
-  RunOrPostTaskIfNecessary(
-      FROM_HERE, BrowserThread::UI,
+  RunOrPostTaskIfNotOnUiThread(
+      FROM_HERE,
       base::BindOnce(
           &CertificateResponseReceivedOnUI, frame_tree_node_id_getter_,
           request_id,
@@ -177,8 +176,8 @@
     const network::URLLoaderCompletionStatus& status) {
   if (!devtools_enabled_)
     return;
-  RunOrPostTaskIfNecessary(
-      FROM_HERE, BrowserThread::UI,
+  RunOrPostTaskIfNotOnUiThread(
+      FROM_HERE,
       base::BindOnce(&CertificateRequestCompletedOnUI,
                      frame_tree_node_id_getter_, request_id, status));
 }
@@ -199,8 +198,8 @@
   auto resource_response = base::MakeRefCounted<network::ResourceResponse>();
   resource_response->head = outer_response_;
 
-  RunOrPostTaskIfNecessary(
-      FROM_HERE, BrowserThread::UI,
+  RunOrPostTaskIfNotOnUiThread(
+      FROM_HERE,
       base::BindOnce(&OnSignedExchangeReceivedOnUI, frame_tree_node_id_getter_,
                      outer_request_url_, resource_response->DeepCopy(),
                      devtools_navigation_token_, envelope, certificate,
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc
index f0fcf0f3..41475e5 100644
--- a/content/browser/webauth/authenticator_common.cc
+++ b/content/browser/webauth/authenticator_common.cc
@@ -1040,8 +1040,8 @@
       // authenticator that already contains one of the credentials in
       // |exclude_credentials|.
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kKeyAlreadyRegistered);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kKeyAlreadyRegistered);
       return;
     case device::FidoReturnCode::kAuthenticatorResponseInvalid:
       // The response from the authenticator was corrupted.
@@ -1056,31 +1056,34 @@
       return;
     case device::FidoReturnCode::kUserConsentDenied:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kUserConsentDenied);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kUserConsentDenied);
       return;
     case device::FidoReturnCode::kSoftPINBlock:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kSoftPINBlock);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kSoftPINBlock);
       return;
     case device::FidoReturnCode::kHardPINBlock:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kHardPINBlock);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kHardPINBlock);
       return;
     case device::FidoReturnCode::kAuthenticatorRemovedDuringPINEntry:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorRemovedDuringPINEntry);
       return;
     case device::FidoReturnCode::kAuthenticatorMissingResidentKeys:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorMissingResidentKeys);
       return;
     case device::FidoReturnCode::kAuthenticatorMissingUserVerification:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorMissingUserVerification);
       return;
@@ -1101,8 +1104,8 @@
       return;
     case device::FidoReturnCode::kStorageFull:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kStorageFull);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kStorageFull);
       return;
     case device::FidoReturnCode::kSuccess:
       DCHECK(response_data.has_value());
@@ -1249,8 +1252,8 @@
   switch (status_code) {
     case device::FidoReturnCode::kUserConsentButCredentialNotRecognized:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kKeyNotRegistered);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kKeyNotRegistered);
       return;
     case device::FidoReturnCode::kAuthenticatorResponseInvalid:
       // The response from the authenticator was corrupted.
@@ -1264,31 +1267,34 @@
       return;
     case device::FidoReturnCode::kUserConsentDenied:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kUserConsentDenied);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kUserConsentDenied);
       return;
     case device::FidoReturnCode::kSoftPINBlock:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kSoftPINBlock);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kSoftPINBlock);
       return;
     case device::FidoReturnCode::kHardPINBlock:
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kHardPINBlock);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kHardPINBlock);
       return;
     case device::FidoReturnCode::kAuthenticatorRemovedDuringPINEntry:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorRemovedDuringPINEntry);
       return;
     case device::FidoReturnCode::kAuthenticatorMissingResidentKeys:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorMissingResidentKeys);
       return;
     case device::FidoReturnCode::kAuthenticatorMissingUserVerification:
       SignalFailureToRequestDelegate(
+          authenticator,
           AuthenticatorRequestClientDelegate::InterestingFailureReason::
               kAuthenticatorMissingUserVerification);
       return;
@@ -1308,8 +1314,8 @@
     case device::FidoReturnCode::kStorageFull:
       NOTREACHED() << "Should not be possible for assertions.";
       SignalFailureToRequestDelegate(
-          AuthenticatorRequestClientDelegate::InterestingFailureReason::
-              kStorageFull);
+          authenticator, AuthenticatorRequestClientDelegate::
+                             InterestingFailureReason::kStorageFull);
       return;
     case device::FidoReturnCode::kSuccess:
       DCHECK(response_data.has_value());
@@ -1355,6 +1361,7 @@
 }
 
 void AuthenticatorCommon::SignalFailureToRequestDelegate(
+    const ::device::FidoAuthenticator* authenticator,
     AuthenticatorRequestClientDelegate::InterestingFailureReason reason) {
   blink::mojom::AuthenticatorStatus status =
       blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR;
@@ -1405,7 +1412,7 @@
 
   // If WebAuthnUi is enabled, this error blocks until after receiving user
   // acknowledgement. Otherwise, the error is returned right away.
-  if (request_delegate_->DoesBlockRequestOnFailure(reason)) {
+  if (request_delegate_->DoesBlockRequestOnFailure(authenticator, reason)) {
     // Cancel pending authenticator requests before the error dialog is shown.
     request_->CancelActiveAuthenticators();
     return;
@@ -1424,6 +1431,7 @@
   }
 
   SignalFailureToRequestDelegate(
+      /*authenticator=*/nullptr,
       AuthenticatorRequestClientDelegate::InterestingFailureReason::kTimeout);
 }
 
diff --git a/content/browser/webauth/authenticator_common.h b/content/browser/webauth/authenticator_common.h
index 089bf8e..61d63111 100644
--- a/content/browser/webauth/authenticator_common.h
+++ b/content/browser/webauth/authenticator_common.h
@@ -176,6 +176,7 @@
   // acknowledgement before returning the error, and handles the error
   // appropriately.
   void SignalFailureToRequestDelegate(
+      const ::device::FidoAuthenticator* authenticator,
       AuthenticatorRequestClientDelegate::InterestingFailureReason reason);
 
   void InvokeCallbackAndCleanup(
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index cde3382b..b9b6dcfee 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -2390,7 +2390,9 @@
         failure_reasons_callback_(std::move(failure_reasons_callback)) {}
   ~MockAuthenticatorRequestDelegateObserver() override = default;
 
-  bool DoesBlockRequestOnFailure(InterestingFailureReason reason) override {
+  bool DoesBlockRequestOnFailure(
+      const ::device::FidoAuthenticator* authenticator,
+      InterestingFailureReason reason) override {
     CHECK(failure_reasons_callback_);
     std::move(failure_reasons_callback_).Run(reason);
     return false;
@@ -2897,10 +2899,12 @@
 
   void FinishCollectPIN() override {}
 
-  bool DoesBlockRequestOnFailure(InterestingFailureReason reason) override {
+  bool DoesBlockRequestOnFailure(
+      const ::device::FidoAuthenticator* authenticator,
+      InterestingFailureReason reason) override {
     *failure_reason_ = reason;
     return AuthenticatorRequestClientDelegate::DoesBlockRequestOnFailure(
-        reason);
+        authenticator, reason);
   }
 
  private:
@@ -3515,10 +3519,12 @@
     *might_create_resident_credential_ = v;
   }
 
-  bool DoesBlockRequestOnFailure(InterestingFailureReason reason) override {
+  bool DoesBlockRequestOnFailure(
+      const ::device::FidoAuthenticator* authenticator,
+      InterestingFailureReason reason) override {
     *failure_reason_ = reason;
     return AuthenticatorRequestClientDelegate::DoesBlockRequestOnFailure(
-        reason);
+        authenticator, reason);
   }
 
  private:
diff --git a/content/common/input/synthetic_gesture_params.h b/content/common/input/synthetic_gesture_params.h
index a648be6..041190f 100644
--- a/content/common/input/synthetic_gesture_params.h
+++ b/content/common/input/synthetic_gesture_params.h
@@ -41,6 +41,10 @@
     PINCH_GESTURE,
     TAP_GESTURE,
     POINTER_ACTION_LIST,
+
+    // Used to synchronize with the renderer to a known state. See
+    // WaitForInputProcessed in input_handler.mojom.
+    WAIT_FOR_INPUT_PROCESSED,
     SYNTHETIC_GESTURE_TYPE_MAX = POINTER_ACTION_LIST
   };
 
diff --git a/content/ppapi_plugin/OWNERS b/content/ppapi_plugin/OWNERS
index 8cdd175..7168f66 100644
--- a/content/ppapi_plugin/OWNERS
+++ b/content/ppapi_plugin/OWNERS
@@ -5,3 +5,4 @@
 per-file *.sb=rsesek@chromium.org
 
 # COMPONENT: Internals>Plugins>Pepper
+# TEAM: pepper-dev@chromium.org
diff --git a/content/public/app/content_renderer_manifest.cc b/content/public/app/content_renderer_manifest.cc
index 71ccdf0..3ffdc19 100644
--- a/content/public/app/content_renderer_manifest.cc
+++ b/content/public/app/content_renderer_manifest.cc
@@ -71,6 +71,7 @@
                   "blink.mojom.MediaDevicesListener",
                   "blink.mojom.MediaStreamDeviceObserver",
                   "blink.mojom.TextSuggestionBackend",
+                  "blink.mojom.WebLaunchService",
                   "content.mojom.FrameInputHandler",
                   "content.mojom.FullscreenVideoElementHandler",
                   "content.mojom.Widget", "viz.mojom.InputTargetClient"})
diff --git a/content/public/browser/authenticator_request_client_delegate.cc b/content/public/browser/authenticator_request_client_delegate.cc
index 8cf360fc..819996d5 100644
--- a/content/public/browser/authenticator_request_client_delegate.cc
+++ b/content/public/browser/authenticator_request_client_delegate.cc
@@ -17,6 +17,7 @@
     default;
 
 bool AuthenticatorRequestClientDelegate::DoesBlockRequestOnFailure(
+    const ::device::FidoAuthenticator* authenticator,
     InterestingFailureReason reason) {
   return false;
 }
@@ -102,7 +103,8 @@
 
 void AuthenticatorRequestClientDelegate::FidoAuthenticatorPairingModeChanged(
     base::StringPiece authenticator_id,
-    bool is_in_pairing_mode) {}
+    bool is_in_pairing_mode,
+    base::string16 display_name) {}
 
 bool AuthenticatorRequestClientDelegate::SupportsPIN() const {
   return false;
diff --git a/content/public/browser/authenticator_request_client_delegate.h b/content/public/browser/authenticator_request_client_delegate.h
index 6e82742..a23b507a3 100644
--- a/content/public/browser/authenticator_request_client_delegate.h
+++ b/content/public/browser/authenticator_request_client_delegate.h
@@ -54,14 +54,19 @@
   AuthenticatorRequestClientDelegate();
   ~AuthenticatorRequestClientDelegate() override;
 
-  // Called when the request fails for the given |reason|. Embedders may return
-  // true if they want AuthenticatorImpl to hold off from resolving the WebAuthn
-  // request with an error, e.g. because they want the user to dismiss an error
-  // dialog first. In this case, embedders *must* eventually invoke the
-  // FidoRequestHandlerBase::CancelCallback in order to resolve the request.
-  // Returning false causes AuthenticatorImpl to resolve the request with the
-  // error right away.
-  virtual bool DoesBlockRequestOnFailure(InterestingFailureReason reason);
+  // Called when the request fails for the given |reason|.  |authenticator|
+  // points to the FidoAuthenticator used in the request that resulted in the
+  // error. It may be nullptr if |reason| is kTimeout.
+  //
+  // Embedders may return true if they want AuthenticatorImpl to hold off from
+  // resolving the WebAuthn request with an error, e.g. because they want the
+  // user to dismiss an error dialog first. In this case, embedders *must*
+  // eventually invoke the FidoRequestHandlerBase::CancelCallback in order to
+  // resolve the request. Returning false causes AuthenticatorImpl to resolve
+  // the request with the error right away.
+  virtual bool DoesBlockRequestOnFailure(
+      const ::device::FidoAuthenticator* authenticator,
+      InterestingFailureReason reason);
 
   // Supplies callbacks that the embedder can invoke to initiate certain
   // actions, namely: cancel the request, start the request over, initiate BLE
@@ -172,8 +177,10 @@
   void FidoAuthenticatorRemoved(base::StringPiece device_id) override;
   void FidoAuthenticatorIdChanged(base::StringPiece old_authenticator_id,
                                   std::string new_authenticator_id) override;
-  void FidoAuthenticatorPairingModeChanged(base::StringPiece authenticator_id,
-                                           bool is_in_pairing_mode) override;
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id,
+      bool is_in_pairing_mode,
+      base::string16 display_name) override;
   bool SupportsPIN() const override;
   void CollectPIN(
       base::Optional<int> attempts,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index d0d0c9d..3c4af592 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -359,6 +359,16 @@
 #endif
 };
 
+// Enables process sharing for sites that do not require a dedicated process
+// by using a default SiteInstance. Default SiteInstances will only be used
+// on platforms that do not use full site isolation.
+// Note: This feature is mutally exclusive with
+// kProcessSharingWithStrictSiteInstances. Only one of these should be enabled
+// at a time.
+const base::Feature kProcessSharingWithDefaultSiteInstances{
+    "ProcessSharingWithDefaultSiteInstances",
+    base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Whether cross-site frames should get their own SiteInstance even when
 // strict site isolation is disabled. These SiteInstances will still be
 // grouped into a shared default process based on BrowsingInstance.
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 0395367..99f2a31 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -87,6 +87,8 @@
 CONTENT_EXPORT extern const base::Feature kPrioritizeBootstrapTasks;
 CONTENT_EXPORT extern const base::Feature kProactivelySwapBrowsingInstance;
 CONTENT_EXPORT extern const base::Feature
+    kProcessSharingWithDefaultSiteInstances;
+CONTENT_EXPORT extern const base::Feature
     kProcessSharingWithStrictSiteInstances;
 CONTENT_EXPORT extern const base::Feature kRasterInducingScroll;
 CONTENT_EXPORT extern const base::Feature kReducedReferrerGranularity;
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index cf8464ec..c554c356 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -345,9 +345,6 @@
 // just a keyboard. See https://crbug.com/977390 for links to i2i.
 const char kEnableCaretBrowsing[] = "enable-caret-browsing";
 
-// Enable default SiteInstance to be used for all unisolated sites.
-const char kEnableDefaultSiteInstance[] = "enable-default-site-instance";
-
 // Enables Web Platform features that are in development.
 const char kEnableExperimentalWebPlatformFeatures[] =
     "enable-experimental-web-platform-features";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 6a21e9b..20b8bcf1 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -112,7 +112,6 @@
 CONTENT_EXPORT extern const char kEnableBlinkFeatures[];
 CONTENT_EXPORT extern const char kEnableCaretBrowsing[];
 CONTENT_EXPORT extern const char kEnableDisplayList2dCanvas[];
-CONTENT_EXPORT extern const char kEnableDefaultSiteInstance[];
 CONTENT_EXPORT extern const char kEnableExperimentalWebPlatformFeatures[];
 CONTENT_EXPORT extern const char kEnableGpuMemoryBufferCompositorResources[];
 CONTENT_EXPORT extern const char kEnableGpuMemoryBufferVideoFrames[];
diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc
index 200324b..acaaaf6 100644
--- a/content/public/test/test_utils.cc
+++ b/content/public/test/test_utils.cc
@@ -34,6 +34,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/site_isolation_policy.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/process_type.h"
 #include "content/public/common/url_constants.h"
@@ -190,8 +191,8 @@
 
 bool AreDefaultSiteInstancesEnabled() {
   return !AreAllSitesIsolatedForTesting() &&
-         base::CommandLine::ForCurrentProcess()->HasSwitch(
-             switches::kEnableDefaultSiteInstance);
+         base::FeatureList::IsEnabled(
+             features::kProcessSharingWithDefaultSiteInstances);
 }
 
 void IsolateAllSitesForTesting(base::CommandLine* command_line) {
diff --git a/content/shell/android/OWNERS b/content/shell/android/OWNERS
index 9f1fcb9d..69e9a1a 100644
--- a/content/shell/android/OWNERS
+++ b/content/shell/android/OWNERS
@@ -4,3 +4,4 @@
 yfriedman@chromium.org
 
 # COMPONENT: Content>Core
+# TEAM: chromium-reviews@chromium.org
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 7d3f8cf..6bef582f 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1531,6 +1531,7 @@
     "../browser/browsing_data/browsing_data_remover_impl_unittest.cc",
     "../browser/browsing_data/clear_site_data_handler_unittest.cc",
     "../browser/browsing_data/clear_site_data_throttle_unittest.cc",
+    "../browser/browsing_data/same_site_data_remover_impl_unittest.cc",
     "../browser/byte_stream_unittest.cc",
     "../browser/cache_storage/cache_storage_blob_to_disk_cache_unittest.cc",
     "../browser/cache_storage/cache_storage_cache_unittest.cc",
diff --git a/content/test/data/infinite_load_2.html b/content/test/data/infinite_load_2.html
deleted file mode 100644
index c95a104c..0000000
--- a/content/test/data/infinite_load_2.html
+++ /dev/null
@@ -1 +0,0 @@
-<img src="/hung">
diff --git a/content/test/data/infinitely_loading_iframe.html b/content/test/data/infinitely_loading_iframe.html
new file mode 100644
index 0000000..aa20e22
--- /dev/null
+++ b/content/test/data/infinitely_loading_iframe.html
@@ -0,0 +1 @@
+<iframe src="/hung"></iframe>
diff --git a/content/test/data/infinite_load_1.html b/content/test/data/infinitely_loading_image.html
similarity index 100%
rename from content/test/data/infinite_load_1.html
rename to content/test/data/infinitely_loading_image.html
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index d35002a..05505a9 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -58,8 +58,12 @@
 crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebGLDefaultWorker [ Skip ]
 crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ]
 crbug.com/805739 [ android-webview-instrumentation ] Pixel_OffscreenCanvasWebglResizeOnWorker [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_CanvasLowLatencyWebGL [ Skip ]
-crbug.com/805739 [ android-webview-instrumentation ] Pixel_CanvasLowLatency2D [ Skip ]
+crbug.com/805739 [ android android-webview-instrumentation ] Pixel_CanvasLowLatencyWebGL [ Skip ]
+
+# Fails on Android WebView due to requiring embedding viz clients. crbug.com/805739
+# Produces black images on Nexus 5Xs in Android Webview (qualcomm-adreno-(tm)-418) crbug.com/984352
+# Fails on Pixel 2 (qualcomm-adreno-(tm)-540) crbug.com/966069
+crbug.com/805739 [ android ] Pixel_CanvasLowLatency2D [ Skip ]
 
 # Skip test that kills GPU process since Android Webview only supports
 # in-process GPU.
@@ -161,9 +165,6 @@
 # investigate later. Filed a bug to track the debug.
 crbug.com/984734 [ android-webview-instrumentation qualcomm-adreno-(tm)-418 ] Pixel_Video_Context_Loss_VP9 [ Failure ]
 
-# Failing on Pixel 2 FYI.
-crbug.com/966069 [ android-chromium qualcomm-adreno-(tm)-540 ] Pixel_CanvasLowLatency2D [ Failure ]
-
 # Failing on Linux and Windows, both Intel HD 630 and NVIDIA Quadro P400
 crbug.com/974380 [ linux ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing [ Skip ]
 crbug.com/974380 [ win ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositing [ Skip ]
@@ -177,6 +178,21 @@
 # Fails when the browser feature SkiaRenderer is enabled
 crbug.com/976370 [ skia-renderer ] Pixel_CSS3DBlueBox [ Skip ]
 
+# Fails when the browser features SkiaRenderer & Vulkan are enabled on Linux
+crbug.com/984954 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplayLinearRGBAccelerated2D [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplayLinearRGBUnaccelerated2D [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplayLinearRGBUnaccelerated2DGPUCompositing [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplaySRGBUnaccelerated2D [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasDisplaySRGBUnaccelerated2DGPUCompositing [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_CanvasUnacceleratedLowLatency2D [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasUnaccelerated2D [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasUnaccelerated2DWorker [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasWebGLSoftwareCompositing [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_OffscreenCanvasWebGLSoftwareCompositingWorker [ Skip ]
+crbug.com/984973 [ linux skia-renderer use-vulkan ] Pixel_RepeatedWebGLTo2D_SoftwareCompositing [ Skip ]
+crbug.com/985366 [ linux skia-renderer use-vulkan ] Pixel_CanvasLowLatency2D [ Skip ]
+crbug.com/985366 [ linux skia-renderer use-vulkan ] Pixel_CanvasLowLatencyWebGL [ Skip ]
+
 # Fails when the browser features SkiaRenderer & Vulkan are enabled on Android
 crbug.com/969864 [ android skia-renderer use-vulkan ] Pixel_2DCanvasWebGL [ Failure ]
 crbug.com/969864 [ android skia-renderer use-vulkan ] Pixel_BackgroundImage [ Skip ]
diff --git a/content/zygote/OWNERS b/content/zygote/OWNERS
index c830029..696f6885 100644
--- a/content/zygote/OWNERS
+++ b/content/zygote/OWNERS
@@ -1 +1,3 @@
-file://services/service_manager/zygote/OWNERS
\ No newline at end of file
+file://services/service_manager/zygote/OWNERS
+# COMPONENT: Internals>Sandbox
+# TEAM: security-dev@chromium.org
diff --git a/device/fido/ble_adapter_manager_unittest.cc b/device/fido/ble_adapter_manager_unittest.cc
index 572da48..30c78c3 100644
--- a/device/fido/ble_adapter_manager_unittest.cc
+++ b/device/fido/ble_adapter_manager_unittest.cc
@@ -53,8 +53,8 @@
   MOCK_METHOD2(FidoAuthenticatorIdChanged,
                void(base::StringPiece old_authenticator_id,
                     std::string new_authenticator_id));
-  MOCK_METHOD2(FidoAuthenticatorPairingModeChanged,
-               void(base::StringPiece, bool));
+  MOCK_METHOD3(FidoAuthenticatorPairingModeChanged,
+               void(base::StringPiece, bool, base::string16));
   MOCK_CONST_METHOD0(SupportsPIN, bool());
   MOCK_METHOD2(CollectPIN,
                void(base::Optional<int>,
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc
index dc5daba7..c10b539 100644
--- a/device/fido/fido_request_handler_base.cc
+++ b/device/fido/fido_request_handler_base.cc
@@ -308,9 +308,10 @@
   if (it == active_authenticators_.end())
     return;
 
-  if (observer_)
-    observer_->FidoAuthenticatorPairingModeChanged(device_id,
-                                                   is_in_pairing_mode);
+  if (observer_) {
+    observer_->FidoAuthenticatorPairingModeChanged(
+        device_id, is_in_pairing_mode, it->second->GetDisplayName());
+  }
 }
 
 void FidoRequestHandlerBase::AddAuthenticator(
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h
index bb52c1e..56523f39 100644
--- a/device/fido/fido_request_handler_base.h
+++ b/device/fido/fido_request_handler_base.h
@@ -140,7 +140,8 @@
         std::string new_authenticator_id) = 0;
     virtual void FidoAuthenticatorPairingModeChanged(
         base::StringPiece authenticator_id,
-        bool is_in_pairing_mode) = 0;
+        bool is_in_pairing_mode,
+        base::string16 display_name) = 0;
 
     // SupportsPIN returns true if this observer supports collecting a PIN from
     // the user. If this function returns false, |CollectPIN| and
diff --git a/device/fido/fido_request_handler_unittest.cc b/device/fido/fido_request_handler_unittest.cc
index 4779f13..5bb8f4a 100644
--- a/device/fido/fido_request_handler_unittest.cc
+++ b/device/fido/fido_request_handler_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
 #include "build/build_config.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
@@ -74,6 +75,8 @@
       FidoRequestHandlerBase::TransportAvailabilityInfo>;
   using AuthenticatorIdChangeNotificationReceiver =
       test::TestCallbackReceiver<std::string>;
+  using AuthenticatorPairingModeReceiver =
+      test::TestCallbackReceiver<std::string, bool, base::string16>;
 
   TestObserver() {}
   ~TestObserver() override {}
@@ -105,6 +108,21 @@
     EXPECT_EQ(expected_new_authenticator_id, result);
   }
 
+  void WaitForAuthenticatorPairingModeChanged(std::string authenticator_id,
+                                              bool is_in_pairing_mode,
+                                              base::string16 display_name) {
+    authenticator_pairing_mode_changed_receiver_.WaitForCallback();
+    auto id =
+        std::get<0>(*authenticator_pairing_mode_changed_receiver_.result());
+    EXPECT_EQ(authenticator_id, id);
+    bool pairing_mode =
+        std::get<1>(*authenticator_pairing_mode_changed_receiver_.result());
+    EXPECT_EQ(is_in_pairing_mode, pairing_mode);
+    auto name =
+        std::get<2>(*authenticator_pairing_mode_changed_receiver_.result());
+    EXPECT_EQ(display_name, name);
+  }
+
  protected:
   // FidoRequestHandlerBase::Observer:
   void OnTransportAvailabilityEnumerated(
@@ -126,8 +144,13 @@
     authenticator_id_change_notification_receiver_.callback().Run(
         std::move(new_authenticator_id));
   }
-  void FidoAuthenticatorPairingModeChanged(base::StringPiece authenticator_id,
-                                           bool is_in_pairing_mode) override {}
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id,
+      bool is_in_pairing_mode,
+      base::string16 display_name) override {
+    authenticator_pairing_mode_changed_receiver_.callback().Run(
+        authenticator_id.as_string(), is_in_pairing_mode, display_name);
+  }
 
   bool SupportsPIN() const override { return false; }
 
@@ -146,6 +169,7 @@
       transport_availability_notification_receiver_;
   AuthenticatorIdChangeNotificationReceiver
       authenticator_id_change_notification_receiver_;
+  AuthenticatorPairingModeReceiver authenticator_pairing_mode_changed_receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(TestObserver);
 };
@@ -318,6 +342,13 @@
                                             std::move(new_authenticator_id));
   }
 
+  void AuthenticatorPairingModeChanged(FakeFidoRequestHandler* request_handler,
+                                       std::string authenticator_id,
+                                       bool in_pairing_mode) {
+    request_handler->AuthenticatorPairingModeChanged(
+        ble_discovery_, authenticator_id, in_pairing_mode);
+  }
+
   test::FakeFidoDiscovery* discovery() const { return discovery_; }
   test::FakeFidoDiscovery* ble_discovery() const { return ble_discovery_; }
   scoped_refptr<::testing::NiceMock<MockBluetoothAdapter>> adapter() {
@@ -477,6 +508,8 @@
       CtapRequestCommand::kAuthenticatorGetInfo,
       test_data::kTestAuthenticatorGetInfoResponse);
   EXPECT_CALL(*device0, GetId()).WillRepeatedly(testing::Return("device0"));
+  EXPECT_CALL(*device0, GetDisplayName())
+      .WillRepeatedly(testing::Return(base::string16()));
   device0->ExpectRequestAndRespondWith(std::vector<uint8_t>(),
                                        CreateFakeDeviceProcesssingError());
 
@@ -487,6 +520,8 @@
       CtapRequestCommand::kAuthenticatorGetInfo,
       test_data::kTestAuthenticatorGetInfoResponse);
   EXPECT_CALL(*device1, GetId()).WillRepeatedly(testing::Return("device1"));
+  EXPECT_CALL(*device1, GetDisplayName())
+      .WillRepeatedly(testing::Return(base::string16()));
   device1->ExpectRequestAndRespondWith(std::vector<uint8_t>(),
                                        CreateFakeUserPresenceVerifiedError(),
                                        base::TimeDelta::FromMicroseconds(1));
@@ -498,6 +533,8 @@
       CtapRequestCommand::kAuthenticatorGetInfo,
       test_data::kTestAuthenticatorGetInfoResponse);
   EXPECT_CALL(*device2, GetId()).WillRepeatedly(testing::Return("device2"));
+  EXPECT_CALL(*device2, GetDisplayName())
+      .WillRepeatedly(testing::Return(base::string16()));
   device2->ExpectRequestAndRespondWith(std::vector<uint8_t>(),
                                        CreateFakeDeviceProcesssingError(),
                                        base::TimeDelta::FromMicroseconds(10));
@@ -735,4 +772,27 @@
 }
 #endif  // defined(OS_WIN)
 
+// Verify that a BLE device's display name propagates to the UI layer
+// when its pairing mode changes.
+TEST_F(FidoRequestHandlerTest, DisplayNameUpdatesWhenPairingModeChanges) {
+  constexpr char kDeviceId[] = "device0";
+  const base::string16 kDisplayName(base::ASCIIToUTF16("new_display_name"));
+  EXPECT_CALL(*adapter(), IsPresent()).WillOnce(::testing::Return(true));
+
+  TestObserver observer;
+  auto request_handler = CreateFakeHandler();
+  request_handler->set_observer(&observer);
+  ble_discovery()->WaitForCallToStartAndSimulateSuccess();
+
+  auto device = std::make_unique<MockFidoDevice>();
+  EXPECT_CALL(*device, GetId()).WillRepeatedly(testing::Return(kDeviceId));
+  EXPECT_CALL(*device, GetDisplayName())
+      .WillRepeatedly(testing::Return(kDisplayName));
+  ble_discovery()->AddDevice(std::move(device));
+
+  AuthenticatorPairingModeChanged(request_handler.get(), kDeviceId, true);
+  observer.WaitForAuthenticatorPairingModeChanged(kDeviceId, true,
+                                                  kDisplayName);
+}
+
 }  // namespace device
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc
index c8c075f..0e38841 100644
--- a/device/fido/get_assertion_handler_unittest.cc
+++ b/device/fido/get_assertion_handler_unittest.cc
@@ -852,8 +852,10 @@
   void FidoAuthenticatorRemoved(base::StringPiece device_id) override {}
   void FidoAuthenticatorIdChanged(base::StringPiece old_authenticator_id,
                                   std::string new_authenticator_id) override {}
-  void FidoAuthenticatorPairingModeChanged(base::StringPiece authenticator_id,
-                                           bool is_in_pairing_mode) override {}
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id,
+      bool is_in_pairing_mode,
+      base::string16 display_name) override {}
   bool SupportsPIN() const override { return false; }
   void CollectPIN(
       base::Optional<int> attempts,
diff --git a/device/fido/mock_fido_device.cc b/device/fido/mock_fido_device.cc
index 92c2370..cacb195 100644
--- a/device/fido/mock_fido_device.cc
+++ b/device/fido/mock_fido_device.cc
@@ -36,8 +36,10 @@
   if (!device_info) {
     device_info = DefaultAuthenticatorInfo();
   }
-  return std::make_unique<MockFidoDevice>(ProtocolVersion::kCtap2,
-                                          std::move(*device_info));
+  auto device = std::make_unique<MockFidoDevice>(ProtocolVersion::kCtap2,
+                                                 std::move(*device_info));
+  device->StubGetDisplayName();
+  return device;
 }
 
 // static
@@ -45,6 +47,7 @@
 MockFidoDevice::MakeU2fWithGetInfoExpectation() {
   auto device = std::make_unique<MockFidoDevice>();
   device->StubGetId();
+  device->StubGetDisplayName();
   device->ExpectCtap2CommandAndRespondWith(
       CtapRequestCommand::kAuthenticatorGetInfo, base::nullopt);
   return device;
@@ -61,6 +64,7 @@
   CHECK(get_info);
   auto device = MockFidoDevice::MakeCtap(std::move(*get_info));
   device->StubGetId();
+  device->StubGetDisplayName();
   device->ExpectCtap2CommandAndRespondWith(
       CtapRequestCommand::kAuthenticatorGetInfo, std::move(get_info_response));
   return device;
@@ -181,4 +185,9 @@
   transport_protocol_ = transport_protocol;
 }
 
+void MockFidoDevice::StubGetDisplayName() {
+  EXPECT_CALL(*this, GetDisplayName())
+      .WillRepeatedly(testing::Return(base::string16()));
+}
+
 }  // namespace device
diff --git a/device/fido/mock_fido_device.h b/device/fido/mock_fido_device.h
index 28c7a34..9c86d00 100644
--- a/device/fido/mock_fido_device.h
+++ b/device/fido/mock_fido_device.h
@@ -60,19 +60,19 @@
                  base::Optional<AuthenticatorGetInfoResponse> device_info);
   ~MockFidoDevice() override;
 
-  MOCK_METHOD1(Cancel, void(FidoDevice::CancelToken));
-
-  MOCK_CONST_METHOD0(GetId, std::string(void));
   // GMock cannot mock a method taking a move-only type.
   // TODO(crbug.com/729950): Remove these workarounds once support for move-only
   // types is added to GMock.
   MOCK_METHOD2(DeviceTransactPtr,
                CancelToken(const std::vector<uint8_t>& command,
                            DeviceCallback& cb));
-  CancelToken DeviceTransact(std::vector<uint8_t> command,
-                             DeviceCallback cb) override;
 
   // FidoDevice:
+  CancelToken DeviceTransact(std::vector<uint8_t> command,
+                             DeviceCallback cb) override;
+  MOCK_METHOD1(Cancel, void(FidoDevice::CancelToken));
+  MOCK_CONST_METHOD0(GetId, std::string(void));
+  MOCK_CONST_METHOD0(GetDisplayName, base::string16(void));
   FidoTransportProtocol DeviceTransport() const override;
   base::WeakPtr<FidoDevice> GetWeakPtr() override;
 
@@ -93,6 +93,7 @@
   void ExpectRequestAndDoNotRespond(base::span<const uint8_t> request);
   void StubGetId();
   void SetDeviceTransport(FidoTransportProtocol transport_protocol);
+  void StubGetDisplayName();
 
  private:
   FidoTransportProtocol transport_protocol_ =
diff --git a/docs/linux_build_instructions.md b/docs/linux_build_instructions.md
index 831f362a9..6cd0ae3 100644
--- a/docs/linux_build_instructions.md
+++ b/docs/linux_build_instructions.md
@@ -356,10 +356,10 @@
 
 ### Crostini (Debian based)
 
-First install the `file` command for the script to run properly:
+First install the `file` and `lsb-release` commands for the script to run properly:
 
 ```shell
-$ sudo apt-get install file
+$ sudo apt-get install file lsb-release
 ```
 
 Then invoke install-build-deps.sh with the `--no-arm` argument,
diff --git a/extensions/browser/device_local_account_util.cc b/extensions/browser/device_local_account_util.cc
index 1e7e917..70771a1 100644
--- a/extensions/browser/device_local_account_util.cc
+++ b/extensions/browser/device_local_account_util.cc
@@ -26,6 +26,9 @@
     "haeblkpifdemlfnkogkipmghfcbonief",  // Charismathics Smart Card Middleware
     "mpnkhdpphjiihmlmkcamhpogecnnfffa",  // Service NSW Kiosk Utility
     "npilppbicblkkgjfnbmibmhhgjhobpll",  // QwickACCESS
+    // TODO(isandrk): Only on the whitelist for the purpose of getting the soft MGS warning.  Remove
+    // once dynamic MGS warnings are implemented.
+    "ppkfnjlimknmjoaemnpidmdlfchhehel",  // VMware Horizon Client for Chrome
 
     // Libraries:
     "aclofikceldphonlfmghmimkodjdmhck",  // Ancoris login component
diff --git a/extensions/shell/installer/linux/BUILD.gn b/extensions/shell/installer/linux/BUILD.gn
index 1636733..029f9d2 100644
--- a/extensions/shell/installer/linux/BUILD.gn
+++ b/extensions/shell/installer/linux/BUILD.gn
@@ -62,7 +62,7 @@
 copy("common_packaging_files") {
   visibility = [ ":*" ]
   sources = [
-    "/usr/bin/eu-strip",
+    "//buildtools/third_party/eu-strip/bin/eu-strip",
     "common/installer.include",
     "common/wrapper",
   ]
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index be1ee05..96c3ceac 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -299,6 +299,7 @@
     ":service",
     "//base",
     "//base/third_party/dynamic_annotations",
+    "//components/crash/core/common",
     "//components/viz/common:resource_format_utils",
     "//gpu/command_buffer/client",
     "//gpu/command_buffer/common:gles2_utils",
diff --git a/gpu/command_buffer/service/DEPS b/gpu/command_buffer/service/DEPS
index 00595ba..ee6d2c14 100644
--- a/gpu/command_buffer/service/DEPS
+++ b/gpu/command_buffer/service/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+cc/paint",
   "+third_party/skia",
+  "+components/crash/core/common/crash_key.h",
   "+components/viz/common/gpu/metal_context_provider.h",
   "+components/viz/common/gpu/vulkan_context_provider.h",
   "+components/viz/common/resources/resource_format.h",
diff --git a/gpu/command_buffer/service/service_font_manager.cc b/gpu/command_buffer/service/service_font_manager.cc
index 3feef451..f025d0c 100644
--- a/gpu/command_buffer/service/service_font_manager.cc
+++ b/gpu/command_buffer/service/service_font_manager.cc
@@ -4,9 +4,13 @@
 
 #include "gpu/command_buffer/service/service_font_manager.h"
 
+#include <inttypes.h>
+
 #include "base/debug/dump_without_crashing.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
+#include "base/strings/stringprintf.h"
+#include "components/crash/core/common/crash_key.h"
 #include "gpu/command_buffer/common/buffer.h"
 #include "gpu/command_buffer/common/discardable_handle.h"
 
@@ -86,6 +90,8 @@
       : font_manager_(std::move(font_manager)) {}
   ~SkiaDiscardableManager() override = default;
 
+  static constexpr int kMaxDumps = 5;
+
   bool deleteHandle(SkDiscardableHandleId handle_id) override {
     if (!font_manager_)
       return true;
@@ -104,13 +110,29 @@
                               type == SkStrikeClient::kGlyphPath ||
                               type == SkStrikeClient::kGlyphImage);
 
-    constexpr int kMaxDumps = 5;
     if (no_fallback && dump_count_ < kMaxDumps && base::RandInt(1, 100) == 1) {
       ++dump_count_;
       base::debug::DumpWithoutCrashing();
     }
   }
 
+  void notifyReadFailure(
+      const DiscardableHandleManager::ReadFailureData& data) override {
+    if (dump_count_ >= kMaxDumps)
+      return;
+
+    std::string str = base::StringPrintf(
+        "ms: %zd, br: %zd, ts: %" PRIu64 ", sc: %" PRIu64 ", gic: %" PRIu64
+        ", gpc: %" PRIu64,
+        data.memorySize, data.bytesRead, data.typefaceSize, data.strikeCount,
+        data.glyphImagesCount, data.glyphPathsCount);
+    static crash_reporter::CrashKeyString<128> crash_key("oop_read_failure");
+    crash_reporter::ScopedCrashKeyString auto_clear(&crash_key, str);
+
+    ++dump_count_;
+    base::debug::DumpWithoutCrashing();
+  }
+
  private:
   int dump_count_ = 0;
   scoped_refptr<ServiceFontManager> font_manager_;
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn
index a66d46c..32996e8 100644
--- a/gpu/config/BUILD.gn
+++ b/gpu/config/BUILD.gn
@@ -173,6 +173,7 @@
 
   if (is_win) {
     libs = [
+      "cfgmgr32.lib",
       "dxguid.lib",
       "setupapi.lib",
     ]
diff --git a/gpu/config/gpu_info_collector_win.cc b/gpu/config/gpu_info_collector_win.cc
index 4220cd90..111220f 100644
--- a/gpu/config/gpu_info_collector_win.cc
+++ b/gpu/config/gpu_info_collector_win.cc
@@ -18,6 +18,12 @@
 #include <stddef.h>
 #include <stdint.h>
 
+// Initguid.h must come before Devpkey.h for DEFINE_DEVPROPKEY macros
+// to resolve without giving unresolved external externals linker errors.
+#include <initguid.h>
+
+#include <Devpkey.h>
+
 #include "base/file_version_info_win.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -108,6 +114,48 @@
   }
 }
 
+std::string GetDeviceStringProperty(DEVINST dev_inst,
+                                    const DEVPROPKEY* prop_key) {
+  ULONG buffer_size = 0;
+  DEVPROPTYPE prop_type;
+  // To find out how big to make the buffer that receives the string, we must
+  // first call CM_Get_DevNode_PropertyW with a nullptr buffer and zero buffer
+  // size. buffer_size will receive the number of bytes to make the buffer.
+  CONFIGRET config_ret = CM_Get_DevNode_PropertyW(
+      dev_inst, prop_key, &prop_type, nullptr, &buffer_size, 0);
+  if (config_ret != CR_BUFFER_SMALL)
+    return std::string();
+  std::vector<WCHAR> property_value;
+  property_value.resize(buffer_size / sizeof(WCHAR));
+  config_ret = CM_Get_DevNode_PropertyW(
+      dev_inst, prop_key, &prop_type,
+      reinterpret_cast<PBYTE>(property_value.data()), &buffer_size, 0);
+  if (config_ret != CR_SUCCESS)
+    return std::string();
+  DCHECK(prop_type == DEVPROP_TYPE_STRING);
+  return base::UTF16ToASCII(property_value.data());
+}
+
+std::string GetDeviceFileTimeProperty(DEVINST dev_inst,
+                                      const DEVPROPKEY* property_key) {
+  FILETIME file_time;
+  DEVPROPTYPE prop_type;
+  ULONG file_time_size = sizeof(file_time);
+  const CONFIGRET config_ret = CM_Get_DevNode_PropertyW(
+      dev_inst, property_key, &prop_type, reinterpret_cast<PBYTE>(&file_time),
+      &file_time_size, 0);
+  if (config_ret != CR_SUCCESS)
+    return std::string();
+  DCHECK(prop_type == DEVPROP_TYPE_FILETIME);
+  DCHECK(file_time_size == sizeof(file_time));
+  const base::Time time = base::Time::FromFileTime(file_time);
+  base::Time::Exploded time_exploded;
+  time.UTCExplode(&time_exploded);
+  // Software fallback list expects dates to be in month-day-year format.
+  return base::StringPrintf("%d-%d-%d", time_exploded.month,
+                            time_exploded.day_of_month, time_exploded.year);
+}
+
 }  // namespace
 
 #if defined(GOOGLE_CHROME_BUILD) && defined(OFFICIAL_BUILD)
@@ -151,13 +199,13 @@
 
   // Display adapter class GUID from
   // https://msdn.microsoft.com/en-us/library/windows/hardware/ff553426%28v=vs.85%29.aspx
-  GUID display_class = {0x4d36e968,
-                        0xe325,
-                        0x11ce,
-                        {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
+  const GUID display_class = {0x4d36e968,
+                              0xe325,
+                              0x11ce,
+                              {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
 
   // create device info for the display device
-  HDEVINFO device_info =
+  const HDEVINFO device_info =
       ::SetupDiGetClassDevs(&display_class, nullptr, nullptr, DIGCF_PRESENT);
   if (device_info == INVALID_HANDLE_VALUE) {
     LOG(ERROR) << "Creating device info failed";
@@ -175,82 +223,56 @@
   SP_DEVINFO_DATA device_info_data;
   device_info_data.cbSize = sizeof(device_info_data);
   while (SetupDiEnumDeviceInfo(device_info, index++, &device_info_data)) {
-    WCHAR value[255];
-    if (SetupDiGetDeviceRegistryPropertyW(
-            device_info, &device_info_data, SPDRP_DRIVER, nullptr,
-            reinterpret_cast<PBYTE>(value), sizeof(value), nullptr)) {
-      HKEY key;
-      std::wstring driver_key = L"System\\CurrentControlSet\\Control\\Class\\";
-      driver_key += value;
-      LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, driver_key.c_str(), 0,
-                                  KEY_QUERY_VALUE, &key);
-      if (result == ERROR_SUCCESS) {
-        GPUInfo::GPUDevice device;
-        DWORD dwcb_data = sizeof(value);
-        result = RegQueryValueExW(key, L"DriverVersion", nullptr, nullptr,
-                                  reinterpret_cast<LPBYTE>(value), &dwcb_data);
-        if (result == ERROR_SUCCESS)
-          device.driver_version = base::UTF16ToASCII(std::wstring(value));
+    GPUInfo::GPUDevice device;
+    device.driver_version = GetDeviceStringProperty(
+        device_info_data.DevInst, &DEVPKEY_Device_DriverVersion);
+    device.driver_vendor = GetDeviceStringProperty(
+        device_info_data.DevInst, &DEVPKEY_Device_DriverProvider);
+    device.driver_date = GetDeviceFileTimeProperty(device_info_data.DevInst,
+                                                   &DEVPKEY_Device_DriverDate);
 
-        dwcb_data = sizeof(value);
-        result = RegQueryValueExW(key, L"DriverDate", nullptr, nullptr,
-                                  reinterpret_cast<LPBYTE>(value), &dwcb_data);
-        if (result == ERROR_SUCCESS)
-          device.driver_date = base::UTF16ToASCII(std::wstring(value));
+    wchar_t new_device_id[MAX_DEVICE_ID_LEN];
+    const CONFIGRET status = CM_Get_Device_ID(
+        device_info_data.DevInst, new_device_id, MAX_DEVICE_ID_LEN, 0);
 
-        dwcb_data = sizeof(value);
-        result = RegQueryValueExW(key, L"ProviderName", nullptr, nullptr,
-                                  reinterpret_cast<LPBYTE>(value), &dwcb_data);
-        if (result == ERROR_SUCCESS)
-          device.driver_vendor = base::UTF16ToASCII(std::wstring(value));
-
-        wchar_t new_device_id[MAX_DEVICE_ID_LEN];
-        CONFIGRET status = CM_Get_Device_ID(
-            device_info_data.DevInst, new_device_id, MAX_DEVICE_ID_LEN, 0);
-
-        if (status == CR_SUCCESS) {
-          std::wstring id = new_device_id;
-          DeviceIDToVendorAndDevice(id, &(device.vendor_id),
-                                    &(device.device_id));
-          if (id.compare(0, device_id.size(), device_id) == 0) {
-            primary_device = devices.size();
-            if (device.vendor_id == 0x1002)
-              amd_is_primary = true;
-          }
-          if (device.vendor_id == 0x8086)
-            found_intel = true;
-          if (device.vendor_id == 0x1002)
-            found_amd = true;
-          if (device.vendor_id == 0x10de) {
-            std::string nvml_driver_version;
-            int major_cuda_compute_capability = 0;
-            int minor_cuda_compute_capability = 0;
-            bool nvml_success = GetNvmlDeviceInfo(
-                device.device_id, &nvml_driver_version,
-                &major_cuda_compute_capability, &minor_cuda_compute_capability);
-            if (nvml_success) {
-              // We use the NVML driver version instead of the registry version,
-              // since the registry version includes OS-specific digits that are
-              // not part of the actual driver version.
-              device.driver_version = nvml_driver_version;
-              device.cuda_compute_capability_major =
-                  major_cuda_compute_capability;
-            } else {
-              // If we can't get the actual driver version from NVML, do
-              // best-effort parsing of the actual driver version from the
-              // registry driver version.
-              device.driver_version =
-                  ParseNVIDIARegistryDriverVersion(device.driver_version);
-            }
-          }
-          devices.push_back(device);
-        }
-
-        RegCloseKey(key);
+    if (status == CR_SUCCESS) {
+      std::wstring id = new_device_id;
+      DeviceIDToVendorAndDevice(id, &(device.vendor_id), &(device.device_id));
+      if (id.compare(0, device_id.size(), device_id) == 0) {
+        primary_device = devices.size();
+        if (device.vendor_id == 0x1002)
+          amd_is_primary = true;
       }
+      if (device.vendor_id == 0x8086)
+        found_intel = true;
+      if (device.vendor_id == 0x1002)
+        found_amd = true;
+      if (device.vendor_id == 0x10de) {
+        std::string nvml_driver_version;
+        int major_cuda_compute_capability = 0;
+        int minor_cuda_compute_capability = 0;
+        bool nvml_success = GetNvmlDeviceInfo(
+            device.device_id, &nvml_driver_version,
+            &major_cuda_compute_capability, &minor_cuda_compute_capability);
+        if (nvml_success) {
+          // We use the NVML driver version instead of the registry version,
+          // since the registry version includes OS-specific digits that are
+          // not part of the actual driver version.
+          device.driver_version = nvml_driver_version;
+          device.cuda_compute_capability_major = major_cuda_compute_capability;
+        } else {
+          // If we can't get the actual driver version from NVML, do
+          // best-effort parsing of the actual driver version from the
+          // registry driver version.
+          device.driver_version =
+              ParseNVIDIARegistryDriverVersion(device.driver_version);
+        }
+      }
+      devices.push_back(device);
     }
   }
   SetupDiDestroyDeviceInfoList(device_info);
+
   if (found_amd && found_intel) {
     // Potential AMD Switchable system found.
     if (!amd_is_primary) {
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index eec0cfb..7a27466 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -2525,9 +2525,10 @@
     }
     builders {
       name: "MSAN Release (chained origins)"
-      dimensions: "os:Ubuntu-14.04"
       mixins: "fuzz-ci"
       mixins: "goma-rbe-prod"
+      mixins: "linux-xenial"
+      mixins: "builderless"
     }
     builders {
       name: "TSAN Release"
@@ -2565,10 +2566,11 @@
     }
     builders {
       name: "Libfuzzer Upload Linux MSan"
-      dimensions: "os:Ubuntu-14.04"
       mixins: "fuzz-ci"
       mixins: "libfuzzer"
       mixins: "goma-rbe-prod"
+      mixins: "linux-xenial"
+      mixins: "builderless"
     }
     builders {
       name: "TSAN Debug"
@@ -2734,8 +2736,9 @@
     }
     builders {
       name: "Linux MSan Tests"
-      dimensions: "os:Ubuntu-14.04"
       mixins: "memory-ci"
+      mixins: "linux-xenial"
+      mixins: "builderless"
     }
     builders {
       name: "Mac ASan 64 Tests (1)"
@@ -2771,9 +2774,10 @@
     }
     builders {
       name: "MSAN Release (no origins)"
-      dimensions: "os:Ubuntu-14.04"
       mixins: "fuzz-ci"
       mixins: "goma-rbe-prod"
+      mixins: "linux-xenial"
+      mixins: "builderless"
     }
     builders {
       name: "Linux Chromium OS ASan LSan Builder"
@@ -2948,8 +2952,9 @@
     }
     builders {
       name: "Linux MSan Builder"
-      dimensions: "os:Ubuntu-14.04"
       mixins: "memory-ci-goma-rbe-prod"
+      mixins: "linux-xenial"
+      mixins: "builderless"
     }
     builders {
       name: "ASan Release Media (32-bit x86 with V8-ARM)"
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm
index fcae8b74..d6559435 100644
--- a/ios/chrome/browser/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -195,4 +195,7 @@
 
   // Added 10/2018.
   prefs->ClearPref(kReverseAutologinEnabled);
+
+  // Added 07/2019.
+  syncer::MigrateSyncSuppressedPref(prefs);
 }
diff --git a/ios/web/OWNERS b/ios/web/OWNERS
index a7206ed..95ee43c 100644
--- a/ios/web/OWNERS
+++ b/ios/web/OWNERS
@@ -4,3 +4,4 @@
 
 # TEAM: ios-directory-owners@chromium.org
 # OS: iOS
+# COMPONENT: Mobile>iOSWeb
diff --git a/ios/web/service/service_manager_context.mm b/ios/web/service/service_manager_context.mm
index 017aab8..d639e2c 100644
--- a/ios/web/service/service_manager_context.mm
+++ b/ios/web/service/service_manager_context.mm
@@ -18,7 +18,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "ios/web/public/service/service_manager_connection.h"
-#include "ios/web/public/service_names.mojom.h"
+#include "ios/web/public/service/service_names.mojom.h"
 #include "ios/web/public/thread/web_task_traits.h"
 #include "ios/web/public/thread/web_thread.h"
 #include "ios/web/public/web_client.h"
diff --git a/ios/web/service/web_browser_manifest.mm b/ios/web/service/web_browser_manifest.mm
index c63ef915b..2907044e 100644
--- a/ios/web/service/web_browser_manifest.mm
+++ b/ios/web/service/web_browser_manifest.mm
@@ -5,7 +5,7 @@
 #import "ios/web/service/web_browser_manifest.h"
 
 #include "base/no_destructor.h"
-#include "ios/web/public/service_names.mojom.h"
+#include "ios/web/public/service/service_names.mojom.h"
 #include "ios/web/public/web_client.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/mojom/constants.mojom.h"
diff --git a/media/capture/video/chromeos/cros_image_capture_impl.cc b/media/capture/video/chromeos/cros_image_capture_impl.cc
index b0c3b19..e8f161ff 100644
--- a/media/capture/video/chromeos/cros_image_capture_impl.cc
+++ b/media/capture/video/chromeos/cros_image_capture_impl.cc
@@ -51,4 +51,11 @@
   std::move(callback).Run(std::move(camera_info));
 }
 
+void CrosImageCaptureImpl::OnIntentHandled(
+    uint32_t intent_id,
+    bool is_success,
+    const std::vector<uint8_t>& captured_data) {
+  NOTREACHED() << "Should be handled in RendererFacingCrosImageCapture";
+}
+
 }  // namespace media
diff --git a/media/capture/video/chromeos/cros_image_capture_impl.h b/media/capture/video/chromeos/cros_image_capture_impl.h
index 553a049a..c122c2e 100644
--- a/media/capture/video/chromeos/cros_image_capture_impl.h
+++ b/media/capture/video/chromeos/cros_image_capture_impl.h
@@ -17,6 +17,7 @@
 class CrosImageCaptureImpl : public cros::mojom::CrosImageCapture {
  public:
   explicit CrosImageCaptureImpl(ReprocessManager* reprocess_manager);
+
   ~CrosImageCaptureImpl() override;
 
   void BindRequest(cros::mojom::CrosImageCaptureRequest request);
@@ -25,9 +26,11 @@
 
   void GetCameraInfo(const std::string& device_id,
                      GetCameraInfoCallback callback) override;
+
   void SetReprocessOption(const std::string& device_id,
                           cros::mojom::Effect effect,
                           SetReprocessOptionCallback callback) override;
+
   void SetFpsRange(const std::string& device_id,
                    const uint32_t stream_width,
                    const uint32_t stream_height,
@@ -35,6 +38,10 @@
                    const int32_t max_fps,
                    SetFpsRangeCallback callback) override;
 
+  void OnIntentHandled(uint32_t intent_id,
+                       bool is_success,
+                       const std::vector<uint8_t>& captured_data) override;
+
  private:
   void OnGotCameraInfo(GetCameraInfoCallback callback,
                        cros::mojom::CameraInfoPtr camera_info);
diff --git a/media/capture/video/chromeos/mojo/cros_image_capture.mojom b/media/capture/video/chromeos/mojo/cros_image_capture.mojom
index dcdb702..3679647 100644
--- a/media/capture/video/chromeos/mojo/cros_image_capture.mojom
+++ b/media/capture/video/chromeos/mojo/cros_image_capture.mojom
@@ -21,8 +21,9 @@
 interface CrosImageCapture {
   // Gets camera information |camera_info| which includes camera facing,
   // characteristics, orientation, etc. The |source_id| might need translation
-  // to be actual video device id.
-  GetCameraInfo(string source_id) => (CameraInfo camera_info);
+  // to be actual video device id. For invalid |source_id|, the returned
+  // |camera_info| would be empty.
+  GetCameraInfo(string source_id) => (CameraInfo? camera_info);
 
   // Sets reprocess option to bind with the coming take photo request. When this
   // method is called, the reprocess option will be queued. All reprocess
@@ -30,8 +31,12 @@
   // Capture API is triggered and all the queued reprocess options will be bound
   // to that take photo request. The |source_id| might need translation to be
   // actual video device id.
+  // The result |status| would be set to 0 for success and the corresponding
+  // result will be put in |blob|. If it fails, the |status| indicates the error
+  // type and |blob| might be empty. For invalid |source_id|, it returns
+  // -EINVAL.
   SetReprocessOption(string source_id, Effect effect)
-      => (int32 status, media.mojom.Blob blob);
+      => (int32 status, media.mojom.Blob? blob);
 
   // Sets the fps range for upcoming configured camera stream.
   // The |source_id| might need translation to be actual video device id.
@@ -44,4 +49,16 @@
   SetFpsRange(string source_id, uint32 stream_width, uint32 stream_height,
               int32 min_fps, int32 max_fps)
       => (bool is_success);
+
+  // Invoked when the intent is fulfilled or is failed. For the intent which
+  // expects to have result, it is fulfilled when the captured is done and is
+  // failed if the session ends without finishing the capture. For the intent
+  // which don't expect any result, it is fulfilled when the camera app is
+  // successfully launched and is failed when the camera fails to launch.
+  // |intent_id| should be the same id that was specified in the query when
+  // launching the camera app. |is_success| indicates the result status of the
+  // intent. The |captured_data| will be delivered to the handler as a byte
+  // array.
+  OnIntentHandled(uint32 intent_id, bool is_success,
+                  array<uint8> captured_data);
 };
\ No newline at end of file
diff --git a/media/capture/video/chromeos/renderer_facing_cros_image_capture.cc b/media/capture/video/chromeos/renderer_facing_cros_image_capture.cc
index f48ea78..db146bf 100644
--- a/media/capture/video/chromeos/renderer_facing_cros_image_capture.cc
+++ b/media/capture/video/chromeos/renderer_facing_cros_image_capture.cc
@@ -4,6 +4,8 @@
 
 #include "media/capture/video/chromeos/renderer_facing_cros_image_capture.h"
 
+#include <errno.h>
+
 #include <memory>
 #include <string>
 #include <utility>
@@ -11,14 +13,18 @@
 
 #include "base/task/post_task.h"
 #include "media/base/bind_to_current_loop.h"
+#include "media/capture/mojom/image_capture.mojom.h"
+#include "media/capture/video/chromeos/mojo/camera_common.mojom.h"
 
 namespace media {
 
 RendererFacingCrosImageCapture::RendererFacingCrosImageCapture(
     cros::mojom::CrosImageCapturePtr api_ptr,
-    DeviceIdMappingCallback mapping_callback)
+    DeviceIdMappingCallback mapping_callback,
+    IntentCallback intent_callback)
     : cros_image_capture_(std::move(api_ptr)),
       mapping_callback_(std::move(mapping_callback)),
+      intent_callback_(std::move(intent_callback)),
       weak_ptr_factory_(this) {}
 
 RendererFacingCrosImageCapture::~RendererFacingCrosImageCapture() = default;
@@ -26,7 +32,10 @@
 void RendererFacingCrosImageCapture::GetCameraInfoWithRealId(
     GetCameraInfoCallback callback,
     const base::Optional<std::string>& device_id) {
-  DCHECK(device_id.has_value());
+  if (!device_id.has_value()) {
+    std::move(callback).Run({});
+    return;
+  }
   cros_image_capture_->GetCameraInfo(*device_id, std::move(callback));
 }
 
@@ -34,7 +43,10 @@
     cros::mojom::Effect effect,
     SetReprocessOptionCallback callback,
     const base::Optional<std::string>& device_id) {
-  DCHECK(device_id.has_value());
+  if (!device_id.has_value()) {
+    std::move(callback).Run(-EINVAL, {});
+    return;
+  }
   cros_image_capture_->SetReprocessOption(*device_id, effect,
                                           std::move(callback));
 }
@@ -46,7 +58,10 @@
     const int32_t max_frame_rate,
     SetFpsRangeCallback callback,
     const base::Optional<std::string>& device_id) {
-  DCHECK(device_id.has_value());
+  if (!device_id.has_value()) {
+    std::move(callback).Run(false);
+    return;
+  }
   cros_image_capture_->SetFpsRange(*device_id, stream_width, stream_height,
                                    min_frame_rate, max_frame_rate,
                                    std::move(callback));
@@ -86,4 +101,11 @@
           min_frame_rate, max_frame_rate, std::move(callback))));
 }
 
+void RendererFacingCrosImageCapture::OnIntentHandled(
+    uint32_t intent_id,
+    bool is_success,
+    const std::vector<uint8_t>& captured_data) {
+  intent_callback_.Run(intent_id, is_success, captured_data);
+}
+
 }  // namespace media
\ No newline at end of file
diff --git a/media/capture/video/chromeos/renderer_facing_cros_image_capture.h b/media/capture/video/chromeos/renderer_facing_cros_image_capture.h
index cc951e8..21f8e10 100644
--- a/media/capture/video/chromeos/renderer_facing_cros_image_capture.h
+++ b/media/capture/video/chromeos/renderer_facing_cros_image_capture.h
@@ -23,6 +23,8 @@
       base::OnceCallback<void(const base::Optional<std::string>&)>;
   using DeviceIdMappingCallback =
       base::RepeatingCallback<void(const std::string&, WithRealIdCallback)>;
+  using IntentCallback = base::RepeatingCallback<
+      void(uint32_t, bool, const std::vector<uint8_t>&)>;
 
   // Create an intermediate layer between renderer to the actual
   // CrosImageCapture implementation. This class should use |api_ptr| to
@@ -30,7 +32,8 @@
   // |mapping_callback| to map the device id for every calls that inputs device
   // id.
   RendererFacingCrosImageCapture(cros::mojom::CrosImageCapturePtr api_ptr,
-                                 DeviceIdMappingCallback mapping_callback);
+                                 DeviceIdMappingCallback mapping_callback,
+                                 IntentCallback intent_callback);
   ~RendererFacingCrosImageCapture() override;
 
   void GetCameraInfoWithRealId(GetCameraInfoCallback callback,
@@ -61,11 +64,17 @@
                    const int32_t max_frame_rate,
                    SetFpsRangeCallback callback) override;
 
+  void OnIntentHandled(uint32_t intent_id,
+                       bool is_success,
+                       const std::vector<uint8_t>& captured_data) override;
+
  private:
   cros::mojom::CrosImageCapturePtr cros_image_capture_;
 
   DeviceIdMappingCallback mapping_callback_;
 
+  IntentCallback intent_callback_;
+
   base::WeakPtrFactory<RendererFacingCrosImageCapture> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(RendererFacingCrosImageCapture);
diff --git a/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc
index 70dae27..d0fe84f 100644
--- a/media/capture/video/chromeos/request_manager.cc
+++ b/media/capture/video/chromeos/request_manager.cc
@@ -816,7 +816,7 @@
   gfx::GpuMemoryBuffer* gmb = stream_buffer_manager_->GetGpuMemoryBufferById(
       StreamType::kJpegOutput, buffer_ipc_id);
   CHECK(gmb);
-  if (!gmb->Map()) {
+  if (video_capture_use_gmb_ && !gmb->Map()) {
     device_context_->SetErrorState(
         media::VideoCaptureError::
             kCrosHalV3BufferManagerFailedToCreateGpuMemoryBuffer,
@@ -830,7 +830,9 @@
     device_context_->SetErrorState(
         media::VideoCaptureError::kCrosHalV3BufferManagerInvalidJpegBlob,
         FROM_HERE, "Invalid JPEG blob");
-    gmb->Unmap();
+    if (video_capture_use_gmb_) {
+      gmb->Unmap();
+    }
     return;
   }
   // Still capture result from HALv3 already has orientation info in EXIF,
@@ -865,7 +867,9 @@
   }
   stream_buffer_manager_->ReleaseBufferFromCaptureResult(
       StreamType::kJpegOutput, buffer_ipc_id);
-  gmb->Unmap();
+  if (video_capture_use_gmb_) {
+    gmb->Unmap();
+  }
 }
 
 void RequestManager::UpdateCaptureSettings(
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index ba4aa20..a16a600 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -605,7 +605,6 @@
     "test:video_player",
     "test:video_player_test_environment",
     "test:video_player_thumbnail_renderer",
-    "//base/test:test_support",
     "//media:test_support",
     "//testing/gtest",
   ]
@@ -622,7 +621,6 @@
     ":buildflags",
     "test:video_player",
     "test:video_player_test_environment",
-    "//base/test:test_support",
     "//media:test_support",
     "//testing/gtest",
   ]
diff --git a/media/gpu/image_processor_test.cc b/media/gpu/image_processor_test.cc
index b56823d..0a358c9e 100644
--- a/media/gpu/image_processor_test.cc
+++ b/media/gpu/image_processor_test.cc
@@ -6,12 +6,10 @@
 #include <string>
 #include <tuple>
 
-#include "base/at_exit.h"
 #include "base/files/file_path.h"
 #include "base/hash/md5.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "base/test/test_timeouts.h"
 #include "build/build_config.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_frame_layout.h"
@@ -157,12 +155,6 @@
   testing::InitGoogleTest(&argc, argv);
   base::CommandLine::Init(argc, argv);
 
-  // Initialize test timeouts and set up an exit manager which is required to
-  // run callbacks on shutdown.
-  // TODO(dstaessens): Use base::TestSuite which performs initialization.
-  TestTimeouts::Initialize();
-  base::AtExitManager at_exit_manager;
-
   auto* const test_environment = new media::test::VideoTestEnvironment;
   testing::AddGlobalTestEnvironment(test_environment);
   return RUN_ALL_TESTS();
diff --git a/media/gpu/linux/BUILD.gn b/media/gpu/linux/BUILD.gn
index a65c022..0173322 100644
--- a/media/gpu/linux/BUILD.gn
+++ b/media/gpu/linux/BUILD.gn
@@ -58,12 +58,17 @@
   testonly = true
   sources = [
     "platform_video_frame_pool_unittest.cc",
+    "platform_video_frame_utils_unittest.cc",
   ]
   deps = [
     ":common",
     "//base",
     "//base/test:test_support",
+    "//media",
+    "//media/gpu:common",
     "//skia",
     "//testing/gtest",
+    "//ui/gfx:memory_buffer",
+    "//ui/gfx/geometry",
   ]
 }
diff --git a/media/gpu/linux/platform_video_frame_utils.cc b/media/gpu/linux/platform_video_frame_utils.cc
index 5056c713..c51c66bf 100644
--- a/media/gpu/linux/platform_video_frame_utils.cc
+++ b/media/gpu/linux/platform_video_frame_utils.cc
@@ -13,6 +13,7 @@
 #include "media/gpu/format_utils.h"
 #include "media/gpu/macros.h"
 #include "ui/gfx/gpu_memory_buffer.h"
+#include "ui/gfx/linux/native_pixmap_dmabuf.h"
 #include "ui/gfx/native_pixmap.h"
 
 #if defined(USE_OZONE)
@@ -139,7 +140,7 @@
   return handle;
 }
 
-scoped_refptr<gfx::NativePixmap> CreateNativePixmap(
+scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf(
     const VideoFrame* video_frame) {
   DCHECK(video_frame);
 
@@ -158,18 +159,9 @@
     return nullptr;
   }
 
-  scoped_refptr<gfx::NativePixmap> native_pixmap;
-#if defined(USE_OZONE)
-  ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance();
-  ui::SurfaceFactoryOzone* factory = platform->GetSurfaceFactoryOzone();
-  native_pixmap = factory->CreateNativePixmapFromHandle(
-      gfx::kNullAcceleratedWidget, video_frame->layout().coded_size(),
-      *buffer_format, std::move(gpu_memory_buffer_handle.native_pixmap_handle));
-#endif
-  if (!native_pixmap) {
-    VLOGF(1) << "Failed to create pixmap from native handle";
-    return nullptr;
-  }
+  auto native_pixmap = base::MakeRefCounted<gfx::NativePixmapDmaBuf>(
+      video_frame->coded_size(), *buffer_format,
+      std::move(gpu_memory_buffer_handle.native_pixmap_handle));
 
   DCHECK(native_pixmap->AreDmaBufFdsValid());
   return native_pixmap;
diff --git a/media/gpu/linux/platform_video_frame_utils.h b/media/gpu/linux/platform_video_frame_utils.h
index 4d13814..046fe96 100644
--- a/media/gpu/linux/platform_video_frame_utils.h
+++ b/media/gpu/linux/platform_video_frame_utils.h
@@ -5,13 +5,14 @@
 #ifndef MEDIA_GPU_LINUX_PLATFORM_VIDEO_FRAME_UTILS_H_
 #define MEDIA_GPU_LINUX_PLATFORM_VIDEO_FRAME_UTILS_H_
 
+#include "base/memory/scoped_refptr.h"
 #include "media/base/video_frame.h"
 #include "media/gpu/media_gpu_export.h"
 #include "ui/gfx/buffer_types.h"
 
 namespace gfx {
 struct GpuMemoryBufferHandle;
-class NativePixmap;
+class NativePixmapDmaBuf;
 }  // namespace gfx
 
 namespace media {
@@ -38,10 +39,11 @@
 MEDIA_GPU_EXPORT gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle(
     const VideoFrame* video_frame);
 
-// Create a native pixmap from the specified |video_frame|. The video frame's
-// data will not be copied, the pixmap will point to the same GPU memory buffer.
-scoped_refptr<gfx::NativePixmap> CreateNativePixmap(
-    const VideoFrame* video_frame);
+// Create a NativePixmap that references the DMA Bufs of |video_frame|. The
+// returned pixmap is only a DMA Buf container and should not be used for
+// compositing/scanout.
+MEDIA_GPU_EXPORT scoped_refptr<gfx::NativePixmapDmaBuf>
+CreateNativePixmapDmaBuf(const VideoFrame* video_frame);
 
 }  // namespace media
 
diff --git a/media/gpu/linux/platform_video_frame_utils_unittest.cc b/media/gpu/linux/platform_video_frame_utils_unittest.cc
new file mode 100644
index 0000000..1517c0f
--- /dev/null
+++ b/media/gpu/linux/platform_video_frame_utils_unittest.cc
@@ -0,0 +1,102 @@
+// Copyright 2019 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 <stddef.h>
+#include <stdint.h>
+
+#include <utility>
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/scoped_file.h"
+#include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "media/base/video_frame.h"
+#include "media/base/video_frame_layout.h"
+#include "media/base/video_types.h"
+#include "media/gpu/format_utils.h"
+#include "media/gpu/linux/platform_video_frame_utils.h"
+#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/linux/native_pixmap_dmabuf.h"
+#include "ui/gfx/native_pixmap_handle.h"
+
+namespace media {
+
+namespace {
+
+// Creates mock FDs and wrap them into a VideoFrame.
+scoped_refptr<VideoFrame> CreateMockDmaBufVideoFrame(
+    VideoPixelFormat pixel_format,
+    const gfx::Size& coded_size,
+    const gfx::Rect& visible_rect,
+    const gfx::Size& natural_size) {
+  const base::Optional<VideoFrameLayout> layout =
+      VideoFrameLayout::Create(pixel_format, coded_size);
+  if (!layout) {
+    LOG(ERROR) << "Failed to create video frame layout";
+    return nullptr;
+  }
+  std::vector<base::ScopedFD> dmabuf_fds;
+  for (size_t i = 0; i < layout->num_planes(); i++) {
+    base::File file(base::FilePath("/dev/null"),
+                    base::File::FLAG_OPEN | base::File::FLAG_READ);
+    if (!file.IsValid()) {
+      LOG(ERROR) << "Failed to open a file";
+      return nullptr;
+    }
+    dmabuf_fds.emplace_back(file.TakePlatformFile());
+    if (!dmabuf_fds.back().is_valid()) {
+      LOG(ERROR) << "The FD taken from file is not valid";
+      return nullptr;
+    }
+  }
+  return VideoFrame::WrapExternalDmabufs(*layout, visible_rect, natural_size,
+                                         std::move(dmabuf_fds),
+                                         base::TimeDelta());
+}
+
+}  // namespace
+
+TEST(PlatformVideoFrameUtilsTest, CreateNativePixmapDmaBuf) {
+  constexpr VideoPixelFormat kPixelFormat = PIXEL_FORMAT_NV12;
+  constexpr gfx::Size kCodedSize(320, 240);
+
+  const base::Optional<gfx::BufferFormat> gfx_format =
+      VideoPixelFormatToGfxBufferFormat(kPixelFormat);
+  ASSERT_TRUE(gfx_format) << "Invalid pixel format: " << kPixelFormat;
+
+  scoped_refptr<VideoFrame> video_frame = CreateMockDmaBufVideoFrame(
+      kPixelFormat, kCodedSize, gfx::Rect(kCodedSize), kCodedSize);
+  ASSERT_TRUE(video_frame);
+
+  // Create a native pixmap and verify its metadata.
+  scoped_refptr<gfx::NativePixmapDmaBuf> native_pixmap =
+      CreateNativePixmapDmaBuf(video_frame.get());
+  ASSERT_TRUE(native_pixmap);
+  EXPECT_EQ(native_pixmap->GetBufferFormat(), *gfx_format);
+  EXPECT_EQ(native_pixmap->GetBufferFormatModifier(),
+            video_frame->layout().modifier());
+
+  // Verify the DMA Buf layouts are the same.
+  const size_t num_planes = video_frame->layout().num_planes();
+  ASSERT_EQ(native_pixmap->ExportHandle().planes.size(), num_planes);
+  for (size_t i = 0; i < num_planes; i++) {
+    const VideoFrameLayout::Plane& plane = video_frame->layout().planes()[i];
+    // The original and duplicated FDs should be different.
+    EXPECT_NE(native_pixmap->GetDmaBufFd(i), video_frame->DmabufFds()[i].get());
+    EXPECT_EQ(native_pixmap->GetDmaBufPitch(i),
+              base::checked_cast<uint32_t>(plane.stride));
+    EXPECT_EQ(native_pixmap->GetDmaBufOffset(i), plane.offset);
+    EXPECT_EQ(native_pixmap->GetDmaBufPlaneSize(i), plane.size);
+  }
+}
+
+}  // namespace media
diff --git a/media/gpu/test/video_test_environment.cc b/media/gpu/test/video_test_environment.cc
index 03bcd002..db830a1 100644
--- a/media/gpu/test/video_test_environment.cc
+++ b/media/gpu/test/video_test_environment.cc
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
+#include "base/test/test_timeouts.h"
 #include "build/build_config.h"
 #include "media/gpu/buildflags.h"
 #include "mojo/core/embedder/embedder.h"
@@ -44,6 +45,7 @@
   // Setting up a task environment will create a task runner for the current
   // thread and allow posting tasks to other threads. This is required for video
   // tests to function correctly.
+  TestTimeouts::Initialize();
   task_environment_ = std::make_unique<base::test::ScopedTaskEnvironment>(
       base::test::ScopedTaskEnvironment::MainThreadType::UI);
 
diff --git a/media/gpu/test/video_test_environment.h b/media/gpu/test/video_test_environment.h
index 7e5aecb..76838d7 100644
--- a/media/gpu/test/video_test_environment.h
+++ b/media/gpu/test/video_test_environment.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 
+#include "base/at_exit.h"
 #include "base/files/file_path.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -44,6 +45,9 @@
   // Whether the test environment has been initialized.
   bool initialized_ = false;
 
+  // An exit manager is required to run callbacks on shutdown.
+  base::AtExitManager at_exit_manager;
+
   std::unique_ptr<base::test::ScopedTaskEnvironment> task_environment_;
 
 #if defined(USE_OZONE)
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 208f085c..5364cd3 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -23,6 +23,7 @@
 #include "media/gpu/vaapi/vaapi_vp8_accelerator.h"
 #include "media/gpu/vaapi/vaapi_vp9_accelerator.h"
 #include "media/gpu/vaapi/vaapi_wrapper.h"
+#include "ui/gfx/linux/native_pixmap_dmabuf.h"
 #include "ui/gfx/native_pixmap.h"
 
 namespace media {
@@ -415,7 +416,7 @@
 
   // Create a native pixmap from the video frame.
   scoped_refptr<gfx::NativePixmap> native_pixmap =
-      CreateNativePixmap(frame.get());
+      CreateNativePixmapDmaBuf(frame.get());
   if (!native_pixmap) {
     VLOGF(1) << "Failed to create NativePixmap from VideoFrame";
     SetState(State::kError);
diff --git a/media/gpu/video_decode_accelerator_perf_tests.cc b/media/gpu/video_decode_accelerator_perf_tests.cc
index c0675f2..12c424c7 100644
--- a/media/gpu/video_decode_accelerator_perf_tests.cc
+++ b/media/gpu/video_decode_accelerator_perf_tests.cc
@@ -10,8 +10,6 @@
 #include "base/files/file_util.h"
 #include "base/json/json_writer.h"
 #include "base/strings/stringprintf.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
 #include "media/base/test_data_util.h"
 #include "media/gpu/test/video_player/frame_renderer_dummy.h"
 #include "media/gpu/test/video_player/video.h"
@@ -379,7 +377,7 @@
   LOG_ASSERT(cmd_line);
   if (cmd_line->HasSwitch("help")) {
     std::cout << media::test::usage_msg << "\n" << media::test::help_msg;
-    return EXIT_SUCCESS;
+    return 0;
   }
 
   // Check if a video was specified on the command line.
@@ -395,11 +393,8 @@
   base::CommandLine::SwitchMap switches = cmd_line->GetSwitches();
   for (base::CommandLine::SwitchMap::const_iterator it = switches.begin();
        it != switches.end(); ++it) {
-    // Ignore arguments handled by Chrome, GoogleTest, and base::TestLauncher.
-    if (it->first == "v" || it->first == "vmodule" ||
-        it->first.find("gtest_") == 0 ||
-        it->first.find("test-launcher") != std::string::npos ||
-        it->first == "single-process-tests") {
+    if (it->first.find("gtest_") == 0 ||               // Handled by GoogleTest
+        it->first == "v" || it->first == "vmodule") {  // Handled by Chrome
       continue;
     }
 
@@ -427,9 +422,5 @@
   media::test::g_env = static_cast<media::test::VideoPlayerTestEnvironment*>(
       testing::AddGlobalTestEnvironment(test_environment));
 
-  // Launch all tests sequentially and disable batching.
-  base::TestSuite test_suite(argc, argv);
-  return base::LaunchUnitTestsWithOptions(
-      argc, argv, 1, 0, true,
-      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
+  return RUN_ALL_TESTS();
 }
diff --git a/media/gpu/video_decode_accelerator_tests.cc b/media/gpu/video_decode_accelerator_tests.cc
index 6e608f2..261ada7 100644
--- a/media/gpu/video_decode_accelerator_tests.cc
+++ b/media/gpu/video_decode_accelerator_tests.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 #include "base/command_line.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
 #include "media/base/test_data_util.h"
 #include "media/gpu/test/video_frame_file_writer.h"
 #include "media/gpu/test/video_frame_validator.h"
@@ -326,7 +324,7 @@
   LOG_ASSERT(cmd_line);
   if (cmd_line->HasSwitch("help")) {
     std::cout << media::test::usage_msg << "\n" << media::test::help_msg;
-    return EXIT_SUCCESS;
+    return 0;
   }
 
   // Check if a video was specified on the command line.
@@ -344,11 +342,8 @@
   base::CommandLine::SwitchMap switches = cmd_line->GetSwitches();
   for (base::CommandLine::SwitchMap::const_iterator it = switches.begin();
        it != switches.end(); ++it) {
-    // Ignore arguments handled by Chrome, GoogleTest, and base::TestLauncher.
-    if (it->first == "v" || it->first == "vmodule" ||
-        it->first.find("gtest_") == 0 ||
-        it->first.find("test-launcher") != std::string::npos ||
-        it->first == "single-process-tests") {
+    if (it->first.find("gtest_") == 0 ||               // Handled by GoogleTest
+        it->first == "v" || it->first == "vmodule") {  // Handled by Chrome
       continue;
     }
 
@@ -380,9 +375,5 @@
   media::test::g_env = static_cast<media::test::VideoPlayerTestEnvironment*>(
       testing::AddGlobalTestEnvironment(test_environment));
 
-  // Launch all tests sequentially and disable batching.
-  base::TestSuite test_suite(argc, argv);
-  return base::LaunchUnitTestsWithOptions(
-      argc, argv, 1, 0, true,
-      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
+  return RUN_ALL_TESTS();
 }
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc
index f7afe401..7b4910f 100644
--- a/media/mojo/services/gpu_mojo_media_client.cc
+++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -228,7 +228,7 @@
         auto frame_converter = std::make_unique<MailboxVideoFrameConverter>(
             base::BindRepeating(&DmabufVideoFramePool::UnwrapFrame,
                                 base::Unretained(frame_pool.get())),
-            std::move(gpu_task_runner_),
+            gpu_task_runner_,
             base::BindOnce(&GetCommandBufferStub, gpu_task_runner_,
                            media_gpu_channel_manager_,
                            command_buffer_id->channel_token,
diff --git a/net/cert/cert_verify_proc_blacklist.inc b/net/cert/cert_verify_proc_blacklist.inc
index 4014d81..e5be854 100644
--- a/net/cert/cert_verify_proc_blacklist.inc
+++ b/net/cert/cert_verify_proc_blacklist.inc
@@ -117,6 +117,10 @@
         {0x71, 0x65, 0xe9, 0x91, 0xad, 0xe7, 0x91, 0x6d, 0x86, 0xb4, 0x66,
          0xab, 0xeb, 0xb6, 0xe4, 0x57, 0xca, 0x93, 0x1c, 0x80, 0x4e, 0x58,
          0xce, 0x1f, 0xba, 0xba, 0xe5, 0x09, 0x15, 0x6f, 0xfb, 0x43},
+        // 3ae699d94e8febdacb86d4f90d40903333478e65e0655c432451197e33fa07f2.pem
+        {0x78, 0x1a, 0x4c, 0xf2, 0xe9, 0x24, 0x52, 0xf3, 0xee, 0x01, 0xd0,
+         0xc3, 0x81, 0xa4, 0x21, 0x4f, 0x39, 0x04, 0x16, 0x5c, 0x39, 0x0a,
+         0xdb, 0xd6, 0x1f, 0xcd, 0x11, 0x24, 0x4e, 0x09, 0xb2, 0xdc},
         // 8b45da1c06f791eb0cabf26be588f5fb23165c2e614bf885562d0dce50b29b02.pem
         {0x7a, 0xed, 0xdd, 0xf3, 0x6b, 0x18, 0xf8, 0xac, 0xb7, 0x37, 0x9f,
          0xe1, 0xce, 0x18, 0x32, 0x12, 0xb2, 0x35, 0x0d, 0x07, 0x88, 0xab,
@@ -203,6 +207,10 @@
         {0xb4, 0xd5, 0xc9, 0x20, 0x41, 0x5e, 0xd0, 0xcc, 0x4f, 0x5d, 0xbc,
          0x7f, 0x54, 0x26, 0x36, 0x76, 0x2e, 0x80, 0xda, 0x66, 0x25, 0xf3,
          0x3f, 0x2b, 0x6a, 0xd6, 0xdb, 0x68, 0xbd, 0xba, 0xb2, 0x9a},
+        // d8888f4a84f74c974dffb573a1bf5bbbacd1713b905096f8eb015062bf396c4d.pem
+        {0xc0, 0xed, 0x20, 0x53, 0x46, 0xbb, 0xbd, 0xe0, 0x6e, 0xb5, 0x60,
+         0xf5, 0xce, 0xe0, 0x2a, 0x36, 0x34, 0xe2, 0x47, 0x4a, 0x7e, 0x76,
+         0xcf, 0x8f, 0xbe, 0xf5, 0x63, 0xbb, 0x11, 0x7d, 0xd0, 0xe3},
         // 372447c43185c38edd2ce0e9c853f9ac1576ddd1704c2f54d96076c089cb4227.pem
         {0xc1, 0x73, 0xf0, 0x62, 0x64, 0x56, 0xca, 0x85, 0x4f, 0xf2, 0xa7,
          0xf0, 0xb1, 0x33, 0xa7, 0xcf, 0x4d, 0x02, 0x11, 0xe5, 0x52, 0xf2,
@@ -299,4 +307,8 @@
         {0xfa, 0x00, 0xbe, 0xc7, 0x3d, 0xd9, 0x97, 0x95, 0xdf, 0x11, 0x62,
          0xc7, 0x89, 0x98, 0x70, 0x04, 0xc2, 0x6c, 0xbf, 0x90, 0xaf, 0x4d,
          0xb4, 0x42, 0xf6, 0x62, 0x20, 0xde, 0x41, 0x35, 0x4a, 0xc9},
+        // a25a19546819d048000ef9c6577c4bcd8d2155b1e4346a4599d6c8b79799d4a1.pem
+        {0xfc, 0xd7, 0x6c, 0xca, 0x23, 0x47, 0xe5, 0xcd, 0x5b, 0x39, 0x34,
+         0x7f, 0x51, 0xcf, 0x43, 0x65, 0x4b, 0x69, 0xa2, 0xbf, 0xc9, 0x07,
+         0x36, 0x70, 0xa6, 0xbe, 0x47, 0xd8, 0x70, 0x1e, 0x6e, 0x0e},
 };
diff --git a/net/data/ssl/blacklist/3ae699d94e8febdacb86d4f90d40903333478e65e0655c432451197e33fa07f2.pem b/net/data/ssl/blacklist/3ae699d94e8febdacb86d4f90d40903333478e65e0655c432451197e33fa07f2.pem
new file mode 100644
index 0000000..ddd2df8a7
--- /dev/null
+++ b/net/data/ssl/blacklist/3ae699d94e8febdacb86d4f90d40903333478e65e0655c432451197e33fa07f2.pem
@@ -0,0 +1,151 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            14:ed:7e:90:75:b6:ae:86:8e:1a:3b:02:4f:8a:94:af:c8:f5:db:ba
+        Signature Algorithm: sha384WithRSAEncryption
+        Issuer: C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 G3
+        Validity
+            Not Before: Apr 19 18:20:31 2017 GMT
+            Not After : Apr 19 18:20:31 2025 GMT
+        Subject: C = AE, O = DarkMatter LLC, CN = DarkMatter High Assurance CA
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (4096 bit)
+                Modulus:
+                    00:84:e0:4e:84:58:b4:e5:9a:f5:a9:2f:d3:34:10:
+                    72:47:7e:d8:6c:7a:ef:74:3d:04:6d:c8:25:fc:7e:
+                    21:c4:9d:77:17:f0:3d:68:5c:93:3d:f9:8c:15:cd:
+                    44:22:fb:ca:44:9e:35:37:6d:a4:ed:92:c0:0b:48:
+                    50:0e:48:c0:6c:90:50:eb:d3:54:6b:21:97:1f:04:
+                    44:c8:fb:f8:fc:71:1c:e4:58:90:74:0c:48:c6:33:
+                    94:78:9e:61:3b:f7:25:9e:2a:a3:96:1f:93:6b:60:
+                    04:c9:aa:13:70:95:fa:76:2a:00:fd:9c:d3:75:ac:
+                    01:1a:b4:5e:43:f2:10:ec:70:b7:a1:03:fa:3c:b9:
+                    5a:45:64:e4:a4:3d:25:2d:96:85:2d:49:ce:74:39:
+                    39:3b:28:0a:12:a0:16:6d:92:dd:85:da:e5:1d:ec:
+                    3e:69:fc:8a:2a:83:3a:ad:60:b8:08:d1:6b:69:c8:
+                    c0:85:4c:a0:6e:6d:83:a5:36:df:fd:ff:86:7b:e3:
+                    7b:63:da:55:a7:45:96:05:0a:93:39:41:03:53:37:
+                    52:83:36:92:e2:d4:f0:7e:b9:4c:5e:b3:db:0e:4d:
+                    2c:66:f9:98:b6:6d:d9:5e:a1:bd:f8:de:b2:9f:f9:
+                    95:94:a8:35:29:30:bd:63:c7:b4:2f:18:d7:02:ee:
+                    09:03:c7:e8:85:68:03:57:ae:2a:fc:04:7c:2c:e5:
+                    35:98:a5:78:fe:a0:94:da:6c:0e:a0:93:e6:f1:5e:
+                    5e:25:8d:eb:9c:db:bf:96:4b:bf:ae:19:02:7c:7f:
+                    d2:27:8d:ba:a0:f7:7b:c8:98:d6:39:23:bb:8f:7e:
+                    33:2c:7e:62:60:55:7f:89:54:a1:9b:3e:00:a0:6e:
+                    fc:36:c1:bd:e0:5f:f3:77:3f:22:6e:32:d3:f2:38:
+                    ee:f5:fb:13:de:5e:91:b4:d1:66:cf:5c:71:7d:28:
+                    94:ee:2a:59:89:fb:54:75:6b:08:7c:8c:c1:b2:db:
+                    dc:53:17:0a:ed:1f:07:26:fe:24:0d:1e:45:49:24:
+                    58:13:ee:df:02:6c:5d:e4:bc:32:b5:65:20:4a:4b:
+                    84:53:86:ba:ed:76:94:a9:87:13:cb:ce:cd:b5:83:
+                    3e:9b:ac:2a:53:6b:c0:6a:34:cb:13:4e:8b:cb:8c:
+                    d3:11:86:d4:bd:7d:58:54:aa:05:a9:95:b0:8c:0e:
+                    70:f2:45:bb:39:ee:cf:26:74:f8:4c:0d:70:9f:92:
+                    63:e7:10:6b:05:41:8f:3a:3a:7d:73:ea:18:1a:06:
+                    fc:92:b6:c3:f1:e7:6d:a9:d4:d9:90:a4:e9:ed:e7:
+                    8d:9d:d4:25:f2:4e:30:b1:91:63:19:2c:a8:52:9c:
+                    09:3e:9b
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:TRUE, pathlen:0
+            X509v3 Certificate Policies: 
+                Policy: 1.3.6.1.4.1.8024.0.2.100.1.2
+                  CPS: https://ca.darkmatter.ae/iCPS
+                Policy: 2.23.140.1.1
+                Policy: 2.16.784.1.1.7.35.2.2.1.1
+
+            Authority Information Access: 
+                OCSP - URI:http://ocsp.quovadisglobal.com
+                CA Issuers - URI:http://cacerts.darkmatter.ae/qvrca2g3.crt
+
+            X509v3 Key Usage: critical
+                Digital Signature, Certificate Sign, CRL Sign
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication, OCSP Signing
+            X509v3 Authority Key Identifier: 
+                keyid:ED:E7:6F:76:5A:BF:60:EC:49:5B:C6:A5:77:BB:72:16:71:9B:C4:3D
+
+            X509v3 CRL Distribution Points: 
+
+                Full Name:
+                  URI:http://crl1.darkmatter.ae/qvrca2g3.crl
+
+                Full Name:
+                  URI:http://crl2.darkmatter.ae/qvrca2g3.crl
+
+            X509v3 Subject Key Identifier: 
+                5D:F1:FB:6A:67:81:E6:84:5B:57:37:5C:0F:99:B5:DC:9D:44:3B:55
+    Signature Algorithm: sha384WithRSAEncryption
+         7a:e5:0b:18:d1:70:38:9b:26:5e:a0:ad:4b:ce:9d:d0:7e:83:
+         30:e4:0f:af:88:01:51:cd:ed:bc:b8:f6:e0:5c:5b:6c:81:19:
+         76:86:1e:9b:fe:04:d4:85:47:07:6b:7e:5b:af:b0:88:b6:aa:
+         9a:11:d6:f1:c2:f6:fb:0e:70:3e:fa:79:b3:ab:d2:c8:23:a9:
+         5d:24:0b:22:27:25:a2:05:a0:7e:b3:0e:9b:40:dd:84:85:6d:
+         0f:f1:6e:7e:a9:25:aa:04:16:3f:04:77:0c:f3:2c:e2:c3:f4:
+         d0:72:71:69:83:f0:42:70:86:35:51:02:50:42:ea:f8:bc:c2:
+         3b:fd:ea:52:57:6a:bd:bf:0c:16:7b:1b:c1:3d:91:c1:cf:b9:
+         b5:b1:18:13:4a:9f:88:b3:37:79:49:cf:91:95:c4:5f:3d:db:
+         82:a0:83:d9:75:0b:da:d9:7d:76:bc:5b:c7:f1:7a:bd:9f:b5:
+         f6:0a:fd:fd:8a:e6:1c:7e:d4:9b:c9:95:50:30:73:f3:50:dd:
+         b2:2e:e4:57:c1:02:4f:8f:e4:fd:13:0a:ab:8c:e4:ca:5d:e6:
+         8b:ca:63:21:f4:d0:44:19:46:c4:05:db:44:37:ee:e3:d2:06:
+         24:18:07:5d:7c:ee:79:c4:7f:9f:ba:de:52:92:82:76:00:e8:
+         03:e2:c0:69:4f:42:1b:ca:d2:52:09:54:8e:88:c3:4a:17:66:
+         65:fd:78:14:bc:ec:5c:42:88:16:89:d4:ca:05:eb:2d:a1:2c:
+         52:ca:a8:86:49:ae:e0:24:1d:2f:ce:03:75:e2:54:bc:78:b6:
+         c2:4b:41:1a:47:e6:3e:5f:b3:40:7a:e8:67:5f:a1:67:8d:07:
+         09:53:87:35:74:f2:33:a3:0b:f8:d1:e7:6f:57:b6:da:45:2a:
+         94:46:80:89:45:32:1f:11:26:2a:19:be:1f:45:ec:e2:c2:df:
+         a4:5c:df:fb:9f:e9:75:18:52:dc:b9:e1:5c:b7:14:5a:62:31:
+         bd:6b:37:6d:3b:06:36:1f:76:ab:ec:8f:32:25:f5:cf:2b:e2:
+         12:f1:3b:3e:f5:13:16:e8:a6:cb:a7:f9:94:96:5e:88:51:fb:
+         e9:4b:24:8f:8c:41:dd:b6:15:ee:44:cf:8f:b6:4e:a7:9e:77:
+         ab:27:cb:14:86:61:eb:54:ab:c5:f4:16:42:47:1a:e4:9f:fb:
+         35:2c:7f:38:82:c2:17:11:ed:7c:83:49:1c:ba:46:3d:28:8d:
+         67:0d:79:59:fb:43:7f:4b:de:2f:f4:ea:d2:b7:49:32:fe:4b:
+         73:86:de:57:5b:7a:fa:86:9e:01:01:c7:47:16:6f:d3:22:fa:
+         2c:c3:51:22:e9:fa:1b:0d
+-----BEGIN CERTIFICATE-----
+MIIG8DCCBNigAwIBAgIUFO1+kHW2roaOGjsCT4qUr8j127owDQYJKoZIhvcNAQEM
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xNzA0MTkxODIwMzFaFw0y
+NTA0MTkxODIwMzFaME0xCzAJBgNVBAYTAkFFMRcwFQYDVQQKDA5EYXJrTWF0dGVy
+IExMQzElMCMGA1UEAwwcRGFya01hdHRlciBIaWdoIEFzc3VyYW5jZSBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAITgToRYtOWa9akv0zQQckd+2Gx6
+73Q9BG3IJfx+IcSddxfwPWhckz35jBXNRCL7ykSeNTdtpO2SwAtIUA5IwGyQUOvT
+VGshlx8ERMj7+PxxHORYkHQMSMYzlHieYTv3JZ4qo5Yfk2tgBMmqE3CV+nYqAP2c
+03WsARq0XkPyEOxwt6ED+jy5WkVk5KQ9JS2WhS1JznQ5OTsoChKgFm2S3YXa5R3s
+Pmn8iiqDOq1guAjRa2nIwIVMoG5tg6U23/3/hnvje2PaVadFlgUKkzlBA1M3UoM2
+kuLU8H65TF6z2w5NLGb5mLZt2V6hvfjesp/5lZSoNSkwvWPHtC8Y1wLuCQPH6IVo
+A1euKvwEfCzlNZileP6glNpsDqCT5vFeXiWN65zbv5ZLv64ZAnx/0ieNuqD3e8iY
+1jkju49+Myx+YmBVf4lUoZs+AKBu/DbBveBf83c/Im4y0/I47vX7E95ekbTRZs9c
+cX0olO4qWYn7VHVrCHyMwbLb3FMXCu0fByb+JA0eRUkkWBPu3wJsXeS8MrVlIEpL
+hFOGuu12lKmHE8vOzbWDPpusKlNrwGo0yxNOi8uM0xGG1L19WFSqBamVsIwOcPJF
+uznuzyZ0+EwNcJ+SY+cQawVBjzo6fXPqGBoG/JK2w/HnbanU2ZCk6e3njZ3UJfJO
+MLGRYxksqFKcCT6bAgMBAAGjggHLMIIBxzASBgNVHRMBAf8ECDAGAQH/AgEAMF4G
+A1UdIARXMFUwOwYMKwYBBAG+WAACZAECMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8v
+Y2EuZGFya21hdHRlci5hZS9pQ1BTMAcGBWeBDAEBMA0GC2CGEAEBByMCAgEBMHEG
+CCsGAQUFBwEBBGUwYzAqBggrBgEFBQcwAYYeaHR0cDovL29jc3AucXVvdmFkaXNn
+bG9iYWwuY29tMDUGCCsGAQUFBzAChilodHRwOi8vY2FjZXJ0cy5kYXJrbWF0dGVy
+LmFlL3F2cmNhMmczLmNydDAOBgNVHQ8BAf8EBAMCAYYwJwYDVR0lBCAwHgYIKwYB
+BQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDCTAfBgNVHSMEGDAWgBTt5292Wr9g7Elb
+xqV3u3IWcZvEPTBlBgNVHR8EXjBcMCygKqAohiZodHRwOi8vY3JsMS5kYXJrbWF0
+dGVyLmFlL3F2cmNhMmczLmNybDAsoCqgKIYmaHR0cDovL2NybDIuZGFya21hdHRl
+ci5hZS9xdnJjYTJnMy5jcmwwHQYDVR0OBBYEFF3x+2pngeaEW1c3XA+ZtdydRDtV
+MA0GCSqGSIb3DQEBDAUAA4ICAQB65QsY0XA4myZeoK1Lzp3QfoMw5A+viAFRze28
+uPbgXFtsgRl2hh6b/gTUhUcHa35br7CItqqaEdbxwvb7DnA++nmzq9LII6ldJAsi
+JyWiBaB+sw6bQN2EhW0P8W5+qSWqBBY/BHcM8yziw/TQcnFpg/BCcIY1UQJQQur4
+vMI7/epSV2q9vwwWexvBPZHBz7m1sRgTSp+Iszd5Sc+RlcRfPduCoIPZdQva2X12
+vFvH8Xq9n7X2Cv39iuYcftSbyZVQMHPzUN2yLuRXwQJPj+T9EwqrjOTKXeaLymMh
+9NBEGUbEBdtEN+7j0gYkGAddfO55xH+fut5SkoJ2AOgD4sBpT0IbytJSCVSOiMNK
+F2Zl/XgUvOxcQogWidTKBestoSxSyqiGSa7gJB0vzgN14lS8eLbCS0EaR+Y+X7NA
+euhnX6FnjQcJU4c1dPIzowv40edvV7baRSqURoCJRTIfESYqGb4fReziwt+kXN/7
+n+l1GFLcueFctxRaYjG9azdtOwY2H3ar7I8yJfXPK+IS8Ts+9RMW6KbLp/mUll6I
+UfvpSySPjEHdthXuRM+Ptk6nnnerJ8sUhmHrVKvF9BZCRxrkn/s1LH84gsIXEe18
+g0kcukY9KI1nDXlZ+0N/S94v9OrSt0ky/ktzht5XW3r6hp4BAcdHFm/TIvosw1Ei
+6fobDQ==
+-----END CERTIFICATE-----
diff --git a/net/data/ssl/blacklist/a25a19546819d048000ef9c6577c4bcd8d2155b1e4346a4599d6c8b79799d4a1.pem b/net/data/ssl/blacklist/a25a19546819d048000ef9c6577c4bcd8d2155b1e4346a4599d6c8b79799d4a1.pem
new file mode 100644
index 0000000..9057e67e
--- /dev/null
+++ b/net/data/ssl/blacklist/a25a19546819d048000ef9c6577c4bcd8d2155b1e4346a4599d6c8b79799d4a1.pem
@@ -0,0 +1,150 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            62:7a:61:b1:0e:7f:5f:27:be:3b:eb:5e:94:cf:7f:f4:48:de:e1:c5
+        Signature Algorithm: sha384WithRSAEncryption
+        Issuer: C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 G3
+        Validity
+            Not Before: Apr 19 18:27:31 2017 GMT
+            Not After : Apr 19 18:27:31 2025 GMT
+        Subject: C = AE, O = DarkMatter LLC, CN = DarkMatter Secure CA
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (4096 bit)
+                Modulus:
+                    00:93:2f:2e:6d:82:b3:37:53:c3:d7:80:53:bc:01:
+                    ab:4c:3a:ce:a9:d9:0e:73:8e:e7:d6:8c:25:91:08:
+                    49:3f:f5:c8:35:51:a0:e2:1e:62:75:da:e3:44:f5:
+                    f9:e1:20:67:54:eb:20:85:b5:be:ef:f4:11:cb:0b:
+                    4b:18:47:53:c6:66:fa:60:dc:74:13:dc:92:7e:4f:
+                    73:d7:ec:99:f6:42:38:e9:be:1f:b7:d6:00:c4:6e:
+                    8f:46:0c:4c:f8:1f:f5:d9:e7:b1:6f:10:f9:f1:e0:
+                    9d:46:e5:04:e3:a0:bd:a5:84:32:dc:be:89:6e:71:
+                    11:29:88:d3:24:1d:51:e0:ea:cc:e7:4b:50:5e:a7:
+                    92:f8:ed:99:1b:f2:b1:28:89:19:45:79:db:2c:0b:
+                    5b:3b:87:53:15:74:c4:02:16:13:7d:cd:47:29:fc:
+                    b5:4a:2b:93:f9:d0:7a:92:f6:cc:da:8b:e9:95:65:
+                    7d:1d:3a:15:3c:7a:ca:be:90:4a:ca:00:8f:f9:34:
+                    3c:d4:ff:86:5d:4b:ac:3e:00:27:c5:94:e5:11:ad:
+                    4c:e6:94:0a:83:17:89:7e:61:09:a1:55:2c:87:11:
+                    4f:cf:bc:1a:ae:f3:33:3d:fb:8f:94:19:45:b1:c3:
+                    33:90:22:a9:19:87:52:db:a8:60:33:72:92:d1:4e:
+                    75:be:e3:c5:e8:87:73:a5:ea:dd:91:ae:63:07:a7:
+                    e5:b6:df:30:51:60:bc:66:e6:50:11:2a:eb:65:b3:
+                    24:33:e1:7a:7d:15:20:45:50:df:8e:ff:01:31:b2:
+                    f7:86:a3:a9:ff:fa:aa:3a:d8:ea:e4:af:89:58:57:
+                    6a:22:47:29:7b:68:1b:45:a1:89:db:34:ac:f9:aa:
+                    31:d7:b5:3f:4a:64:77:e9:c4:0c:75:5f:92:a4:72:
+                    54:3a:44:10:bc:eb:e9:e9:8a:27:33:12:cd:8f:b5:
+                    9f:2a:14:4e:d4:1f:36:71:0d:e6:29:60:7e:03:32:
+                    39:fd:03:0c:d2:68:c1:5b:77:84:c6:be:a2:5d:1f:
+                    b0:c2:43:8e:82:fc:fd:8a:27:f2:59:dc:a3:cb:ba:
+                    92:59:2f:d3:48:65:2e:c1:d5:c2:77:07:87:5e:d8:
+                    b4:a4:29:c5:dd:b3:ef:f6:c5:c8:ea:36:1e:94:e5:
+                    bd:08:9c:04:0e:2b:1f:f1:df:7e:68:41:c2:aa:05:
+                    94:0d:d3:40:b4:a5:66:7f:b3:7b:24:fc:b2:89:e3:
+                    19:83:98:d3:90:06:8d:78:10:d9:be:73:62:5e:46:
+                    bb:27:dd:f2:0b:ac:db:38:b1:96:35:3f:33:ea:fb:
+                    eb:25:97:ef:41:b3:c0:f9:64:9d:62:07:02:71:82:
+                    88:95:29
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:TRUE, pathlen:0
+            X509v3 Certificate Policies: 
+                Policy: 2.16.784.1.1.7.35.2.2.1.2
+                  CPS: https://ca.darkmatter.ae/iCPS
+                Policy: 2.23.140.1.2.2
+                Policy: 2.23.140.1.2.3
+
+            Authority Information Access: 
+                OCSP - URI:http://ocsp.quovadisglobal.com
+                CA Issuers - URI:http://cacerts.darkmatter.ae/qvrca2g3.crt
+
+            X509v3 Key Usage: critical
+                Digital Signature, Certificate Sign, CRL Sign
+            X509v3 Extended Key Usage: 
+                TLS Web Server Authentication, TLS Web Client Authentication, OCSP Signing
+            X509v3 Authority Key Identifier: 
+                keyid:ED:E7:6F:76:5A:BF:60:EC:49:5B:C6:A5:77:BB:72:16:71:9B:C4:3D
+
+            X509v3 CRL Distribution Points: 
+
+                Full Name:
+                  URI:http://crl1.darkmatter.ae/qvrca2g3.crl
+
+                Full Name:
+                  URI:http://crl2.darkmatter.ae/qvrca2g3.crl
+
+            X509v3 Subject Key Identifier: 
+                A2:50:A4:70:CB:3B:B5:CA:61:94:27:13:96:3A:74:76:AA:9D:EC:34
+    Signature Algorithm: sha384WithRSAEncryption
+         72:e3:c5:33:02:2b:cd:b4:91:bc:65:ca:95:ad:b5:90:fe:ee:
+         ac:f1:95:92:12:1e:85:fb:58:64:bf:43:a8:49:ad:56:3c:85:
+         65:d5:40:7d:09:83:d5:67:bf:b4:d3:62:72:d3:7e:c7:9e:d4:
+         ac:1d:62:95:c6:f2:06:5d:b9:36:2f:b5:d0:06:73:f6:78:17:
+         3d:34:56:76:fa:a5:15:77:89:af:40:c5:c0:56:34:02:f9:80:
+         45:e2:a5:49:40:84:6f:7e:fc:22:d7:f4:12:53:e7:1c:b2:f1:
+         e0:84:92:76:0b:54:e5:1b:5c:9f:c2:54:6e:09:8c:17:b8:f1:
+         14:0b:16:dc:e0:ed:17:00:66:6f:ea:26:cf:9c:07:c7:86:46:
+         9a:b4:85:ca:2d:18:4f:c0:a7:81:2b:89:54:81:f3:e1:a1:7b:
+         60:67:fc:8b:02:e3:2f:92:85:de:e0:c9:0e:1b:f1:4c:f0:3f:
+         7b:8d:b4:f1:32:9a:2f:64:24:81:b9:46:4b:1d:da:c3:a1:ac:
+         19:93:92:85:95:f8:98:88:b4:52:21:3b:f4:50:35:50:fb:86:
+         81:52:9e:81:a5:43:db:a9:ac:38:53:c3:28:e0:b9:e0:6e:4c:
+         49:b2:18:cf:53:44:cc:ab:10:89:7b:c6:55:55:6d:44:91:1b:
+         8c:61:4b:f8:78:93:9e:7a:3d:72:e2:d2:e8:5e:2d:e5:fb:09:
+         0f:a3:3b:1a:d9:22:34:75:da:1b:2e:c7:e7:44:2e:10:b7:25:
+         b1:10:9a:ea:73:8b:b9:87:41:5b:3f:43:a7:e2:50:a6:28:98:
+         67:92:74:f8:35:67:41:d8:b2:84:cc:72:d6:99:45:20:96:05:
+         c2:8a:da:72:72:42:2f:47:e1:7f:b5:22:11:50:40:6d:d9:1b:
+         c1:5a:21:67:a0:18:7a:9a:6c:72:50:42:6c:bb:f9:6f:eb:9a:
+         f9:e6:b0:4c:76:6f:9f:9f:db:68:05:fc:63:95:58:ef:f4:1c:
+         94:33:b1:dc:6d:73:1d:92:f3:00:19:65:36:fc:fa:69:1d:d0:
+         42:98:e4:c1:3d:d9:d5:67:02:3a:99:a0:4c:52:2f:03:d6:4c:
+         6b:fd:80:b3:7f:31:66:ad:50:1d:ba:fa:17:14:cf:b2:43:be:
+         8d:2a:bc:74:7f:f4:9c:22:f2:a9:8b:1e:cf:07:89:df:8d:1e:
+         59:28:96:25:2c:09:7c:9f:81:0e:d5:56:fa:fa:57:a8:5f:3a:
+         40:e8:55:4b:31:0e:8c:37:61:17:3f:aa:62:79:5a:70:4b:9d:
+         97:a1:d8:19:e3:ca:75:aa:20:c1:7c:80:b0:37:b6:8f:99:5a:
+         48:97:cb:d4:d5:80:98:c7
+-----BEGIN CERTIFICATE-----
+MIIG4zCCBMugAwIBAgIUYnphsQ5/Xye+O+telM9/9Eje4cUwDQYJKoZIhvcNAQEM
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xNzA0MTkxODI3MzFaFw0y
+NTA0MTkxODI3MzFaMEUxCzAJBgNVBAYTAkFFMRcwFQYDVQQKDA5EYXJrTWF0dGVy
+IExMQzEdMBsGA1UEAwwURGFya01hdHRlciBTZWN1cmUgQ0EwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQCTLy5tgrM3U8PXgFO8AatMOs6p2Q5zjufWjCWR
+CEk/9cg1UaDiHmJ12uNE9fnhIGdU6yCFtb7v9BHLC0sYR1PGZvpg3HQT3JJ+T3PX
+7Jn2Qjjpvh+31gDEbo9GDEz4H/XZ57FvEPnx4J1G5QTjoL2lhDLcvolucREpiNMk
+HVHg6sznS1Bep5L47Zkb8rEoiRlFedssC1s7h1MVdMQCFhN9zUcp/LVKK5P50HqS
+9szai+mVZX0dOhU8esq+kErKAI/5NDzU/4ZdS6w+ACfFlOURrUzmlAqDF4l+YQmh
+VSyHEU/PvBqu8zM9+4+UGUWxwzOQIqkZh1LbqGAzcpLRTnW+48Xoh3Ol6t2RrmMH
+p+W23zBRYLxm5lARKutlsyQz4Xp9FSBFUN+O/wExsveGo6n/+qo62Orkr4lYV2oi
+Ryl7aBtFoYnbNKz5qjHXtT9KZHfpxAx1X5KkclQ6RBC86+npiiczEs2PtZ8qFE7U
+HzZxDeYpYH4DMjn9AwzSaMFbd4TGvqJdH7DCQ46C/P2KJ/JZ3KPLupJZL9NIZS7B
+1cJ3B4de2LSkKcXds+/2xcjqNh6U5b0InAQOKx/x335oQcKqBZQN00C0pWZ/s3sk
+/LKJ4xmDmNOQBo14ENm+c2JeRrsn3fILrNs4sZY1PzPq++sll+9Bs8D5ZJ1iBwJx
+goiVKQIDAQABo4IBxjCCAcIwEgYDVR0TAQH/BAgwBgEB/wIBADBZBgNVHSAEUjBQ
+MDoGC2CGEAEBByMCAgECMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vY2EuZGFya21h
+dHRlci5hZS9pQ1BTMAgGBmeBDAECAjAIBgZngQwBAgMwcQYIKwYBBQUHAQEEZTBj
+MCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wNQYI
+KwYBBQUHMAKGKWh0dHA6Ly9jYWNlcnRzLmRhcmttYXR0ZXIuYWUvcXZyY2EyZzMu
+Y3J0MA4GA1UdDwEB/wQEAwIBhjAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUH
+AwIGCCsGAQUFBwMJMB8GA1UdIwQYMBaAFO3nb3Zav2DsSVvGpXe7chZxm8Q9MGUG
+A1UdHwReMFwwLKAqoCiGJmh0dHA6Ly9jcmwxLmRhcmttYXR0ZXIuYWUvcXZyY2Ey
+ZzMuY3JsMCygKqAohiZodHRwOi8vY3JsMi5kYXJrbWF0dGVyLmFlL3F2cmNhMmcz
+LmNybDAdBgNVHQ4EFgQUolCkcMs7tcphlCcTljp0dqqd7DQwDQYJKoZIhvcNAQEM
+BQADggIBAHLjxTMCK820kbxlypWttZD+7qzxlZISHoX7WGS/Q6hJrVY8hWXVQH0J
+g9Vnv7TTYnLTfsee1KwdYpXG8gZduTYvtdAGc/Z4Fz00Vnb6pRV3ia9AxcBWNAL5
+gEXipUlAhG9+/CLX9BJT5xyy8eCEknYLVOUbXJ/CVG4JjBe48RQLFtzg7RcAZm/q
+Js+cB8eGRpq0hcotGE/Ap4EriVSB8+Ghe2Bn/IsC4y+Shd7gyQ4b8UzwP3uNtPEy
+mi9kJIG5Rksd2sOhrBmTkoWV+JiItFIhO/RQNVD7hoFSnoGlQ9uprDhTwyjgueBu
+TEmyGM9TRMyrEIl7xlVVbUSRG4xhS/h4k556PXLi0uheLeX7CQ+jOxrZIjR12hsu
+x+dELhC3JbEQmupzi7mHQVs/Q6fiUKYomGeSdPg1Z0HYsoTMctaZRSCWBcKK2nJy
+Qi9H4X+1IhFQQG3ZG8FaIWegGHqabHJQQmy7+W/rmvnmsEx2b5+f22gF/GOVWO/0
+HJQzsdxtcx2S8wAZZTb8+mkd0EKY5ME92dVnAjqZoExSLwPWTGv9gLN/MWatUB26
++hcUz7JDvo0qvHR/9Jwi8qmLHs8Hid+NHlkoliUsCXyfgQ7VVvr6V6hfOkDoVUsx
+Dow3YRc/qmJ5WnBLnZeh2BnjynWqIMF8gLA3to+ZWkiXy9TVgJjH
+-----END CERTIFICATE-----
diff --git a/net/data/ssl/blacklist/d8888f4a84f74c974dffb573a1bf5bbbacd1713b905096f8eb015062bf396c4d.pem b/net/data/ssl/blacklist/d8888f4a84f74c974dffb573a1bf5bbbacd1713b905096f8eb015062bf396c4d.pem
new file mode 100644
index 0000000..0ee8245
--- /dev/null
+++ b/net/data/ssl/blacklist/d8888f4a84f74c974dffb573a1bf5bbbacd1713b905096f8eb015062bf396c4d.pem
@@ -0,0 +1,149 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number:
+            19:ff:34:56:9d:36:6b:a1:f6:6e:8d:95:32:ee:05:d0:55:b9:dd:1d
+        Signature Algorithm: sha384WithRSAEncryption
+        Issuer: C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 3 G3
+        Validity
+            Not Before: Apr 19 18:38:50 2017 GMT
+            Not After : Apr 19 18:38:50 2025 GMT
+        Subject: C = AE, O = DarkMatter LLC, CN = DarkMatter Assured CA
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                RSA Public-Key: (4096 bit)
+                Modulus:
+                    00:89:14:f9:94:77:15:68:79:c0:1b:95:4c:72:c0:
+                    f7:40:b1:01:c8:f6:90:f8:1d:d4:8a:47:23:4e:7c:
+                    4b:7e:73:3f:e1:65:16:db:42:c4:0e:ec:ec:d0:99:
+                    ef:27:5d:f3:b1:fc:4c:3e:bb:48:2c:e8:1e:81:94:
+                    dd:a7:3e:66:eb:0f:66:2b:89:22:62:af:1d:da:82:
+                    82:1b:8b:35:34:35:46:19:73:23:27:95:67:72:b1:
+                    e6:59:02:7d:cb:02:7c:e8:51:b2:0b:be:48:31:03:
+                    86:ef:e9:bf:fd:99:b4:00:2d:57:2e:49:b0:a1:fd:
+                    67:65:a7:90:ee:7a:3a:93:33:e8:f3:fb:26:4c:8c:
+                    12:4d:8f:0b:d1:04:c9:7a:47:28:f5:48:9d:4d:6d:
+                    6e:0b:03:9b:b1:23:86:c8:de:e8:73:fc:53:23:be:
+                    50:33:0c:77:37:57:89:88:30:57:75:f3:03:8c:cc:
+                    fe:4c:be:14:3a:1f:1a:e3:6e:57:14:7b:12:b7:96:
+                    ea:b3:8b:ed:88:05:d5:75:f2:f6:0a:2d:2b:e7:14:
+                    44:9a:ea:17:04:fb:4b:b2:84:10:68:5e:a0:e3:c5:
+                    88:17:f4:4f:c4:1d:c1:b6:c4:f3:50:58:81:8d:a7:
+                    d5:19:9a:dc:f6:1f:54:0a:87:7d:19:a8:17:68:89:
+                    9d:41:ef:5f:71:7f:52:fb:11:c7:ba:88:a7:5e:79:
+                    2a:93:96:22:41:36:8d:41:4b:52:76:b8:d6:d6:41:
+                    32:47:aa:a7:ef:81:07:12:d1:9a:0b:99:06:ca:9c:
+                    5e:ce:e4:5f:8d:2d:82:a9:cf:0d:59:b7:26:11:ae:
+                    4c:c8:d7:e2:b8:70:d0:a1:46:1f:1d:c8:17:c8:a1:
+                    ff:1a:a9:25:59:1a:48:dd:69:72:9a:59:e0:e3:74:
+                    4b:0d:63:85:2a:6d:b7:45:05:92:6d:cd:30:5b:5e:
+                    fa:0c:12:96:42:d1:f7:46:ee:d5:6b:5c:b5:3e:5d:
+                    2f:dc:ac:c8:e4:ba:f2:5c:d9:6d:49:09:ee:ba:b3:
+                    6e:ed:c4:86:11:59:25:f8:9b:98:83:c5:21:1b:de:
+                    78:94:5f:19:40:18:40:7e:40:3a:54:cf:39:6c:ef:
+                    8a:aa:80:17:b4:20:8a:64:f5:a2:73:0c:f4:47:67:
+                    68:a4:ee:da:08:84:bd:c4:a4:4e:a4:8f:db:c4:ae:
+                    5c:d5:39:88:ab:b9:10:61:1f:54:54:7f:69:24:32:
+                    5f:fd:51:98:fb:39:44:0e:16:d4:7e:79:3b:a9:40:
+                    00:e0:0c:74:ca:a5:e9:de:22:78:83:d9:f9:35:04:
+                    43:fd:27:97:8e:14:e3:62:7c:7b:ee:33:1c:e2:c1:
+                    c0:ab:73
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:TRUE, pathlen:0
+            X509v3 Certificate Policies: 
+                Policy: 2.16.784.1.1.7.35.2.2.2
+                  CPS: https://ca.darkmatter.ae/iCPS
+                Policy: 1.3.6.1.4.1.8024.1.300
+
+            Authority Information Access: 
+                OCSP - URI:http://ocsp.quovadisglobal.com
+                CA Issuers - URI:http://cacerts.darkmatter.ae/qvrca3g3.crt
+
+            X509v3 Key Usage: critical
+                Digital Signature, Certificate Sign, CRL Sign
+            X509v3 Extended Key Usage: 
+                TLS Web Client Authentication, OCSP Signing, E-mail Protection, 1.3.6.1.4.1.311.10.3.12
+            X509v3 Authority Key Identifier: 
+                keyid:C6:17:D0:BC:A8:EA:02:43:F2:1B:06:99:5D:2B:90:20:B9:D7:9C:E4
+
+            X509v3 CRL Distribution Points: 
+
+                Full Name:
+                  URI:http://crl1.darkmatter.ae/qvrca3g3.crl
+
+                Full Name:
+                  URI:http://crl2.darkmatter.ae/qvrca3g3.crl
+
+            X509v3 Subject Key Identifier: 
+                05:61:41:C6:3D:0D:28:BE:62:9F:98:F3:AF:A3:33:EA:C0:FD:F0:E9
+    Signature Algorithm: sha384WithRSAEncryption
+         7e:30:5a:ca:6c:5d:00:d9:94:38:c3:ca:b7:ca:50:c1:d1:c5:
+         45:93:f7:76:1b:bb:26:d8:63:f2:a0:3e:44:97:60:d1:be:04:
+         ba:a3:77:9f:f5:57:cb:be:e6:57:72:20:5c:81:5d:39:68:e5:
+         b7:e4:1d:ac:43:c3:48:37:45:f4:f1:f4:cd:e0:ca:f1:3c:65:
+         3a:af:e6:3e:ce:cd:28:47:ed:d1:e7:24:fd:08:32:e4:89:15:
+         fd:30:d7:48:84:eb:75:7c:3e:e4:55:42:b4:b8:1b:98:7b:6b:
+         cb:91:ff:34:f9:d3:ec:d4:3b:a2:e4:5b:4c:34:e6:6a:ec:ca:
+         46:a5:47:e1:fa:b6:1b:1e:95:f2:d7:a1:eb:8d:40:38:c3:d2:
+         f7:07:63:31:2d:93:cc:71:a6:e1:41:a3:f6:31:22:67:c8:3b:
+         65:fd:4d:c8:4b:07:2a:52:f6:51:9a:2d:9f:b3:94:e9:a2:35:
+         70:08:a2:a7:b2:ab:c6:fd:e9:62:74:07:5c:eb:2d:19:c4:8d:
+         10:10:d1:f5:f4:80:b2:2f:00:ff:c4:94:30:b2:b5:db:be:e0:
+         9c:b9:ff:2f:7c:dc:96:ae:06:c0:0a:93:2e:19:7c:f8:28:79:
+         02:ac:c5:59:14:cd:63:24:f3:6e:c4:87:80:19:ce:ea:00:72:
+         9e:87:7d:02:5c:34:01:74:f7:a8:6e:66:b4:d3:99:4e:57:d7:
+         43:32:3b:c1:9d:08:65:06:f7:e2:e0:35:22:88:2f:9c:fd:5e:
+         95:ee:d9:38:90:17:0b:ee:87:81:47:13:de:42:8e:48:1a:c1:
+         0f:93:f3:b4:3a:28:5a:8d:66:6c:1d:9f:95:b7:75:41:d0:cf:
+         9d:30:2e:5d:a6:af:3b:05:e1:0c:ff:1f:a1:c1:e7:3e:3e:14:
+         6d:01:52:e0:b8:40:12:fe:c4:4c:48:88:0f:ad:43:c9:06:54:
+         b1:76:a4:3f:24:16:62:08:bb:51:ff:81:86:b4:af:eb:d3:62:
+         ad:df:41:bb:58:85:42:cf:1b:6d:a9:32:8b:39:fb:7d:e9:2e:
+         cc:58:fb:bb:e5:da:35:89:38:7e:18:85:dd:80:2a:08:d6:0d:
+         8b:25:b4:34:9f:c3:46:bf:ad:af:87:89:59:26:8d:17:f4:7f:
+         42:dd:54:b2:40:1d:82:95:a1:40:bb:33:57:fa:c1:c4:fb:e6:
+         4c:4b:ef:e8:03:dc:09:d4:83:17:97:67:ad:f3:e3:31:1b:19:
+         28:3e:63:4d:1e:9c:de:be:0f:0d:cd:72:9c:0f:5f:2c:7d:0d:
+         67:14:aa:a5:8b:37:da:c0:66:a6:2a:05:16:3d:f7:3c:42:cf:
+         99:50:d9:06:15:23:3b:2a
+-----BEGIN CERTIFICATE-----
+MIIG6TCCBNGgAwIBAgIUGf80Vp02a6H2bo2VMu4F0FW53R0wDQYJKoZIhvcNAQEM
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xNzA0MTkxODM4NTBaFw0y
+NTA0MTkxODM4NTBaMEYxCzAJBgNVBAYTAkFFMRcwFQYDVQQKDA5EYXJrTWF0dGVy
+IExMQzEeMBwGA1UEAwwVRGFya01hdHRlciBBc3N1cmVkIENBMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAiRT5lHcVaHnAG5VMcsD3QLEByPaQ+B3Uikcj
+TnxLfnM/4WUW20LEDuzs0JnvJ13zsfxMPrtILOgegZTdpz5m6w9mK4kiYq8d2oKC
+G4s1NDVGGXMjJ5VncrHmWQJ9ywJ86FGyC75IMQOG7+m//Zm0AC1XLkmwof1nZaeQ
+7no6kzPo8/smTIwSTY8L0QTJekco9UidTW1uCwObsSOGyN7oc/xTI75QMwx3N1eJ
+iDBXdfMDjMz+TL4UOh8a425XFHsSt5bqs4vtiAXVdfL2Ci0r5xREmuoXBPtLsoQQ
+aF6g48WIF/RPxB3BtsTzUFiBjafVGZrc9h9UCod9GagXaImdQe9fcX9S+xHHuoin
+Xnkqk5YiQTaNQUtSdrjW1kEyR6qn74EHEtGaC5kGypxezuRfjS2Cqc8NWbcmEa5M
+yNfiuHDQoUYfHcgXyKH/GqklWRpI3Wlymlng43RLDWOFKm23RQWSbc0wW176DBKW
+QtH3Ru7Va1y1Pl0v3KzI5LryXNltSQnuurNu7cSGEVkl+JuYg8UhG954lF8ZQBhA
+fkA6VM85bO+KqoAXtCCKZPWicwz0R2dopO7aCIS9xKROpI/bxK5c1TmIq7kQYR9U
+VH9pJDJf/VGY+zlEDhbUfnk7qUAA4Ax0yqXp3iJ4g9n5NQRD/SeXjhTjYnx77jMc
+4sHAq3MCAwEAAaOCAcswggHHMBIGA1UdEwEB/wQIMAYBAf8CAQAwUgYDVR0gBEsw
+STA5BgpghhABAQcjAgICMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vY2EuZGFya21h
+dHRlci5hZS9pQ1BTMAwGCisGAQQBvlgBgiwwcQYIKwYBBQUHAQEEZTBjMCoGCCsG
+AQUFBzABhh5odHRwOi8vb2NzcC5xdW92YWRpc2dsb2JhbC5jb20wNQYIKwYBBQUH
+MAKGKWh0dHA6Ly9jYWNlcnRzLmRhcmttYXR0ZXIuYWUvcXZyY2EzZzMuY3J0MA4G
+A1UdDwEB/wQEAwIBhjAzBgNVHSUELDAqBggrBgEFBQcDAgYIKwYBBQUHAwkGCCsG
+AQUFBwMEBgorBgEEAYI3CgMMMB8GA1UdIwQYMBaAFMYX0Lyo6gJD8hsGmV0rkCC5
+15zkMGUGA1UdHwReMFwwLKAqoCiGJmh0dHA6Ly9jcmwxLmRhcmttYXR0ZXIuYWUv
+cXZyY2EzZzMuY3JsMCygKqAohiZodHRwOi8vY3JsMi5kYXJrbWF0dGVyLmFlL3F2
+cmNhM2czLmNybDAdBgNVHQ4EFgQUBWFBxj0NKL5in5jzr6Mz6sD98OkwDQYJKoZI
+hvcNAQEMBQADggIBAH4wWspsXQDZlDjDyrfKUMHRxUWT93YbuybYY/KgPkSXYNG+
+BLqjd5/1V8u+5ldyIFyBXTlo5bfkHaxDw0g3RfTx9M3gyvE8ZTqv5j7OzShH7dHn
+JP0IMuSJFf0w10iE63V8PuRVQrS4G5h7a8uR/zT50+zUO6LkW0w05mrsykalR+H6
+thselfLXoeuNQDjD0vcHYzEtk8xxpuFBo/YxImfIO2X9TchLBypS9lGaLZ+zlOmi
+NXAIoqeyq8b96WJ0B1zrLRnEjRAQ0fX0gLIvAP/ElDCytdu+4Jy5/y983JauBsAK
+ky4ZfPgoeQKsxVkUzWMk827Eh4AZzuoAcp6HfQJcNAF096huZrTTmU5X10MyO8Gd
+CGUG9+LgNSKIL5z9XpXu2TiQFwvuh4FHE95CjkgawQ+T87Q6KFqNZmwdn5W3dUHQ
+z50wLl2mrzsF4Qz/H6HB5z4+FG0BUuC4QBL+xExIiA+tQ8kGVLF2pD8kFmIIu1H/
+gYa0r+vTYq3fQbtYhULPG22pMos5+33pLsxY+7vl2jWJOH4Yhd2AKgjWDYsltDSf
+w0a/ra+HiVkmjRf0f0LdVLJAHYKVoUC7M1f6wcT75kxL7+gD3AnUgxeXZ63z4zEb
+GSg+Y00enN6+Dw3NcpwPXyx9DWcUqqWLN9rAZqYqBRY99zxCz5lQ2QYVIzsq
+-----END CERTIFICATE-----
diff --git a/net/dns/context_host_resolver_unittest.cc b/net/dns/context_host_resolver_unittest.cc
index 6109aee..7f00e24 100644
--- a/net/dns/context_host_resolver_unittest.cc
+++ b/net/dns/context_host_resolver_unittest.cc
@@ -51,7 +51,6 @@
         std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
     dns_client_ = dns_client.get();
     manager_->SetDnsClientForTesting(std::move(dns_client));
-    manager_->SetInsecureDnsClientEnabled(true);
 
     scoped_refptr<HostResolverProc> proc = CreateCatchAllHostResolverProc();
     manager_->set_proc_params_for_test(ProcTaskParams(proc.get(), 1u));
diff --git a/net/dns/fuzzed_host_resolver_util.cc b/net/dns/fuzzed_host_resolver_util.cc
index b76c8809..c384abf 100644
--- a/net/dns/fuzzed_host_resolver_util.cc
+++ b/net/dns/fuzzed_host_resolver_util.cc
@@ -85,62 +85,6 @@
   return FuzzIPv6Address(data_provider);
 }
 
-DnsConfig GetFuzzedDnsConfig(FuzzedDataProvider* data_provider) {
-  // Fuzz DNS configuration.
-  DnsConfig config;
-
-  // Fuzz name servers.
-  uint32_t num_nameservers = data_provider->ConsumeIntegralInRange(0, 4);
-  for (uint32_t i = 0; i < num_nameservers; ++i) {
-    config.nameservers.push_back(
-        IPEndPoint(FuzzIPAddress(data_provider), FuzzPort(data_provider)));
-  }
-
-  // Fuzz suffix search list.
-  switch (data_provider->ConsumeIntegralInRange(0, 3)) {
-    case 3:
-      config.search.push_back("foo.com");
-      FALLTHROUGH;
-    case 2:
-      config.search.push_back("bar");
-      FALLTHROUGH;
-    case 1:
-      config.search.push_back("com");
-      FALLTHROUGH;
-    default:
-      break;
-  }
-
-  net::DnsHosts hosts;
-  // Fuzz hosts file.
-  uint8_t num_hosts_entries = data_provider->ConsumeIntegral<uint8_t>();
-  for (uint8_t i = 0; i < num_hosts_entries; ++i) {
-    const char* kHostnames[] = {"foo", "foo.com",   "a.foo.com",
-                                "bar", "localhost", "localhost6"};
-    const char* hostname = data_provider->PickValueInArray(kHostnames);
-    net::IPAddress address = FuzzIPAddress(data_provider);
-    config.hosts[net::DnsHostsKey(hostname, net::GetAddressFamily(address))] =
-        address;
-  }
-
-  config.unhandled_options = data_provider->ConsumeBool();
-  config.append_to_multi_label_name = data_provider->ConsumeBool();
-  config.randomize_ports = data_provider->ConsumeBool();
-  config.ndots = data_provider->ConsumeIntegralInRange(0, 3);
-  config.attempts = data_provider->ConsumeIntegralInRange(1, 3);
-
-  // Timeouts don't really work for fuzzing. Even a timeout of 0 milliseconds
-  // will be increased after the first timeout, resulting in inconsistent
-  // behavior.
-  config.timeout = base::TimeDelta::FromDays(10);
-
-  config.rotate = data_provider->ConsumeBool();
-
-  config.use_local_ipv6 = data_provider->ConsumeBool();
-
-  return config;
-}
-
 // HostResolverProc that returns a random set of results, and can succeed or
 // fail. Must only be run on the thread it's created on.
 class FuzzedHostResolverProc : public HostResolverProc {
@@ -367,6 +311,9 @@
         socket_factory_(data_provider_),
         net_log_(net_log),
         data_provider_weak_factory_(data_provider) {
+    // Use SetDnsClientEnabled() to ensure fuzzed client is used.
+    DCHECK(!options.dns_client_enabled);
+
     ProcTaskParams proc_task_params(
         new FuzzedHostResolverProc(data_provider_weak_factory_.GetWeakPtr()),
         // Retries are only used when the original request hangs, which this
@@ -376,20 +323,16 @@
     SetTaskRunnerForTesting(base::SequencedTaskRunnerHandle::Get());
     SetMdnsSocketFactoryForTesting(
         std::make_unique<FuzzedMdnsSocketFactory>(data_provider_));
-    std::unique_ptr<DnsClient> dns_client = DnsClient::CreateClientForTesting(
-        net_log_, &socket_factory_,
-        base::Bind(&FuzzedDataProvider::ConsumeIntegralInRange<int32_t>,
-                   base::Unretained(data_provider_)));
-    dns_client->SetConfig(GetFuzzedDnsConfig(data_provider_));
-    HostResolverManager::SetDnsClientForTesting(std::move(dns_client));
   }
 
   ~FuzzedHostResolverManager() override = default;
 
+  // Enable / disable the async resolver. When enabled, installs a
+  // DnsClient with fuzzed UDP and TCP sockets.
+  void SetDnsClientEnabled(bool enabled) override;
+
   void SetDnsClientForTesting(std::unique_ptr<DnsClient> dns_client) {
-    // The only DnsClient that is supported is the one created by the
-    // FuzzedHostResolverManager since that DnsClient contains the necessary
-    // fuzzing logic.
+    // Should only call SetDnsClientEnabled() to ensure a fuzzed client is used.
     NOTREACHED();
   }
 
@@ -419,6 +362,73 @@
   DISALLOW_COPY_AND_ASSIGN(FuzzedHostResolverManager);
 };
 
+void FuzzedHostResolverManager::SetDnsClientEnabled(bool enabled) {
+  if (!enabled) {
+    HostResolverManager::SetDnsClientEnabled(false);
+    return;
+  }
+
+  // Fuzz DNS configuration.
+
+  DnsConfig config;
+
+  // Fuzz name servers.
+  uint32_t num_nameservers = data_provider_->ConsumeIntegralInRange(0, 4);
+  for (uint32_t i = 0; i < num_nameservers; ++i) {
+    config.nameservers.push_back(
+        IPEndPoint(FuzzIPAddress(data_provider_), FuzzPort(data_provider_)));
+  }
+
+  // Fuzz suffix search list.
+  switch (data_provider_->ConsumeIntegralInRange(0, 3)) {
+    case 3:
+      config.search.push_back("foo.com");
+      FALLTHROUGH;
+    case 2:
+      config.search.push_back("bar");
+      FALLTHROUGH;
+    case 1:
+      config.search.push_back("com");
+      FALLTHROUGH;
+    default:
+      break;
+  }
+
+  net::DnsHosts hosts;
+  // Fuzz hosts file.
+  uint8_t num_hosts_entries = data_provider_->ConsumeIntegral<uint8_t>();
+  for (uint8_t i = 0; i < num_hosts_entries; ++i) {
+    const char* kHostnames[] = {"foo", "foo.com",   "a.foo.com",
+                                "bar", "localhost", "localhost6"};
+    const char* hostname = data_provider_->PickValueInArray(kHostnames);
+    net::IPAddress address = FuzzIPAddress(data_provider_);
+    config.hosts[net::DnsHostsKey(hostname, net::GetAddressFamily(address))] =
+        address;
+  }
+
+  config.unhandled_options = data_provider_->ConsumeBool();
+  config.append_to_multi_label_name = data_provider_->ConsumeBool();
+  config.randomize_ports = data_provider_->ConsumeBool();
+  config.ndots = data_provider_->ConsumeIntegralInRange(0, 3);
+  config.attempts = data_provider_->ConsumeIntegralInRange(1, 3);
+
+  // Timeouts don't really work for fuzzing. Even a timeout of 0 milliseconds
+  // will be increased after the first timeout, resulting in inconsistent
+  // behavior.
+  config.timeout = base::TimeDelta::FromDays(10);
+
+  config.rotate = data_provider_->ConsumeBool();
+
+  config.use_local_ipv6 = data_provider_->ConsumeBool();
+
+  std::unique_ptr<DnsClient> dns_client = DnsClient::CreateClientForTesting(
+      net_log_, &socket_factory_,
+      base::Bind(&FuzzedDataProvider::ConsumeIntegralInRange<int32_t>,
+                 base::Unretained(data_provider_)));
+  dns_client->SetConfig(config);
+  HostResolverManager::SetDnsClientForTesting(std::move(dns_client));
+}
+
 }  // namespace
 
 std::unique_ptr<ContextHostResolver> CreateFuzzedContextHostResolver(
@@ -426,8 +436,16 @@
     NetLog* net_log,
     FuzzedDataProvider* data_provider,
     bool enable_caching) {
-  auto manager = std::make_unique<FuzzedHostResolverManager>(options, net_log,
-                                                             data_provider);
+  // FuzzedHostResolverManager only handles fuzzing DnsClient when enabled
+  // through SetDnsClientEnabled().
+  bool enable_dns_client = options.dns_client_enabled;
+  HostResolver::ManagerOptions filtered_options(options);
+  filtered_options.dns_client_enabled = false;
+
+  auto manager = std::make_unique<FuzzedHostResolverManager>(
+      filtered_options, net_log, data_provider);
+  manager->SetDnsClientEnabled(enable_dns_client);
+
   return std::make_unique<ContextHostResolver>(
       std::move(manager),
       enable_caching ? HostCache::CreateDefaultCache() : nullptr);
diff --git a/net/dns/fuzzed_host_resolver_util.h b/net/dns/fuzzed_host_resolver_util.h
index 337955e..11ac006 100644
--- a/net/dns/fuzzed_host_resolver_util.h
+++ b/net/dns/fuzzed_host_resolver_util.h
@@ -20,11 +20,9 @@
 // return. It inherits from ContextHostResolver, unlike MockHostResolver, so
 // more closely matches real behavior.
 //
-// By default uses a mocked out system resolver, though can be configured to use
-// the built-in async resolver (Built in DNS stub resolver) with a fuzzed set
-// of UDP/TCP sockets by setting ManagerOptions.insecure_dns_client_enabled to
-// true or calling SetInsecureDnsClientEnabled on the underlying
-// HostResolverManager.
+// By default uses a mocked out system resolver, though can be configured (using
+// SetDnsClientEnabled() on the underlying manager) to use the built-in async
+// resolver (Built in DNS stub resolver) with a fuzzed set of UDP/TCP sockets.
 //
 // To make behavior most deterministic, does not use the WorkerPool to run its
 // simulated platform host resolver calls, instead runs them on the thread it is
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index d445710..46550c3 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -69,9 +69,6 @@
     // an incompatible IP literal (e.g. IPv6 is disabled and it is an IPv6
     // literal).
     //
-    // Results in ERR_DNS_CACHE_MISS if only fast local sources are to be
-    // queried and a cache lookup attempt fails.
-    //
     // The parent HostResolver must still be alive when Start() is called,  but
     // if it is destroyed before an asynchronous result completes, the request
     // will be automatically cancelled.
@@ -134,10 +131,10 @@
     // |kDefaultRetryAttempts| for the resolver to choose a default value.
     size_t max_system_retry_attempts = kDefaultRetryAttempts;
 
-    // Initial setting for whether the insecure portion of the built-in
-    // asynchronous DnsClient is enabled or disabled. See HostResolverManager::
-    // SetInsecureDnsClientEnabled() for details.
-    bool insecure_dns_client_enabled = false;
+    // Initial setting for whether the built-in asynchronous DnsClient is
+    // enabled or disabled. See HostResolverManager::SetDnsClientEnabled() for
+    // details.
+    bool dns_client_enabled = false;
 
     // Initial configuration overrides for the built-in asynchronous DnsClient.
     // See HostResolverManager::SetDnsConfigOverrides() for details.
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 9a81b86af..b629c8b9 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -535,7 +535,7 @@
   return true;
 }
 
-const unsigned HostResolverManager::kMaximumInsecureDnsTaskFailures = 16;
+const unsigned HostResolverManager::kMaximumDnsFailures = 16;
 
 // Holds the callback and request parameters for an outstanding request.
 //
@@ -568,7 +568,30 @@
         priority_(parameters_.initial_priority),
         job_(nullptr),
         resolver_(resolver),
-        complete_(false) {}
+        complete_(false) {
+    // If the query name matches one of the DoH server names, set the
+    // secure_dns_mode_override field in ResolveHostParameters to OFF to avoid
+    // infinite recursion.
+    // TODO(crbug.com/878582): Add a URLRequest-level parameter to skip DoH that
+    // can be set when a URLRequest to a DoH server is built. This will avoid
+    // unnecessarily skipping DoH when a connection to the DoH server has been
+    // established but the query happens to be for a DoH server hostname.
+    DCHECK(resolver_);
+    if (resolver_->HaveDnsConfig()) {
+      std::unique_ptr<base::Value> dns_config =
+          resolver_->GetDnsConfigAsValue();
+      for (const base::Value& doh_server :
+           dns_config->FindKey("doh_servers")->GetList()) {
+        if (request_host_.host().compare(
+                GURL(GetURLFromTemplateWithoutParameters(
+                         doh_server.FindKey("server_template")->GetString()))
+                    .host()) == 0) {
+          parameters_.secure_dns_mode_override = DnsConfig::SecureDnsMode::OFF;
+          break;
+        }
+      }
+    }
+  }
 
   ~RequestImpl() override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -1024,8 +1047,6 @@
     return needs_two_transactions() && !transaction2_;
   }
 
-  bool secure() const { return secure_; }
-
   void StartFirstTransaction() {
     DCHECK(client_);
     DCHECK_EQ(0u, num_completed_transactions_);
@@ -1446,17 +1467,15 @@
 
 struct HostResolverManager::JobKey {
   bool operator<(const JobKey& other) const {
-    return std::tie(query_type, flags, source, secure_dns_mode, request_context,
-                    hostname) < std::tie(other.query_type, other.flags,
-                                         other.source, other.secure_dns_mode,
-                                         other.request_context, other.hostname);
+    return std::tie(query_type, flags, source, request_context, hostname) <
+           std::tie(other.query_type, other.flags, other.source,
+                    other.request_context, other.hostname);
   }
 
   std::string hostname;
   DnsQueryType query_type;
   HostResolverFlags flags;
   HostResolverSource source;
-  DnsConfig::SecureDnsMode secure_dns_mode;
   URLRequestContext* request_context;
 };
 
@@ -1620,32 +1639,30 @@
     CompleteRequestsWithError(ERR_NETWORK_CHANGED);
   }
 
-  // Gets a closure that will abort an insecure DnsTask (see
-  // AbortInsecureDnsTask()) iff |this| is still valid. Useful if aborting a
-  // list of Jobs as some may be cancelled while aborting others.
-  base::OnceClosure GetAbortInsecureDnsTaskClosure(int error,
-                                                   bool fallback_only) {
-    return base::BindOnce(&Job::AbortInsecureDnsTask,
-                          weak_ptr_factory_.GetWeakPtr(), error, fallback_only);
+  // Gets a closure that will abort a DnsTask (see AbortDnsTask()) iff |this| is
+  // still valid. Useful if aborting a list of Jobs as some may be cancelled
+  // while aborting others.
+  base::OnceClosure GetAbortDnsTaskClosure(int error, bool fallback_only) {
+    return base::BindOnce(&Job::AbortDnsTask, weak_ptr_factory_.GetWeakPtr(),
+                          error, fallback_only);
   }
 
-  // Aborts or removes any current/future insecure DnsTasks if a ProcTask is
-  // available for fallback. If no fallback is available and |fallback_only| is
-  // false, a job that is currently running an insecure DnsTask will be
-  // completed with |error|.
-  void AbortInsecureDnsTask(int error, bool fallback_only) {
+  // Aborts or removes any current/future DnsTasks if a ProcTask is available
+  // for fallback. If no fallback is available and |fallback_only| is false, a
+  // job that is currently running a DnsTask will be completed with |error|.
+  void AbortDnsTask(int error, bool fallback_only) {
     bool has_proc_fallback =
         std::find(tasks_.begin(), tasks_.end(), TaskType::PROC) != tasks_.end();
     if (has_proc_fallback) {
       for (auto it = tasks_.begin(); it != tasks_.end();) {
-        if (*it == TaskType::DNS)
+        if (*it == TaskType::DNS || *it == TaskType::SECURE_DNS)
           it = tasks_.erase(it);
         else
           ++it;
       }
     }
 
-    if (dns_task_ && !dns_task_->secure()) {
+    if (dns_task_) {
       if (has_proc_fallback) {
         KillDnsTask();
         dns_task_error_ = OK;
@@ -1690,8 +1707,7 @@
     DCHECK_GT(num_active_requests(), 0u);
     base::Optional<HostCache::Entry> results = resolver_->ServeFromHosts(
         hostname_, query_type_,
-        host_resolver_flags_ & HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6,
-        tasks_);
+        host_resolver_flags_ & HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
     if (results) {
       // This will destroy the Job.
       CompleteRequests(results.value(), base::TimeDelta(),
@@ -1852,8 +1868,7 @@
     DCHECK(proc_task_);
 
     if (dns_task_error_ != OK) {
-      // This ProcTask was a fallback resolution after a failed insecure
-      // DnsTask.
+      // This ProcTask was a fallback resolution after a failed DnsTask.
       if (net_error == OK) {
         resolver_->OnFallbackResolve(dns_task_error_);
       }
@@ -1899,17 +1914,28 @@
 
   void StartDnsTask(bool secure) {
     DCHECK_EQ(1u, num_occupied_job_slots_);
-    DCHECK(resolver_->HaveDnsConfig());
-    DCHECK(!resolver_->HaveTestProcOverride());
     // Need to create the task even if we're going to post a failure instead of
     // running it, as a "started" job needs a task to be properly cleaned up.
     dns_task_.reset(new DnsTask(resolver_->dns_client_.get(), hostname_,
                                 query_type_, request_context_, secure, this,
                                 net_log_, tick_clock_));
-    dns_task_->StartFirstTransaction();
-    // Schedule a second transaction, if needed.
-    if (dns_task_->needs_two_transactions())
-      Schedule(true);
+
+    if (resolver_->HaveDnsConfig()) {
+      dns_task_->StartFirstTransaction();
+      // Schedule a second transaction, if needed.
+      if (dns_task_->needs_two_transactions())
+        Schedule(true);
+    } else {
+      // Cannot start a DNS task when DnsClient or config is not available.
+      // Since we cannot complete synchronously from here, post a failure.
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE,
+          base::BindOnce(
+              &Job::OnDnsTaskFailure, weak_ptr_factory_.GetWeakPtr(),
+              dns_task_->AsWeakPtr(), base::TimeDelta(),
+              HostCache::Entry(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN),
+              secure));
+    }
   }
 
   void StartSecondDnsTransaction() {
@@ -1971,10 +1997,7 @@
 
     UMA_HISTOGRAM_LONG_TIMES_100("Net.DNS.DnsTask.SuccessTime", duration);
 
-    // Reset the insecure DNS failure counter if an insecure DnsTask completed
-    // successfully.
-    if (!secure)
-      resolver_->num_insecure_dns_task_failures_ = 0;
+    resolver_->OnDnsTaskResolve();
 
     base::TimeDelta bounded_ttl = std::max(
         results.ttl(), base::TimeDelta::FromSeconds(kMinimumTTLSeconds));
@@ -2326,20 +2349,22 @@
 
 HostResolverManager::HostResolverManager(
     const HostResolver::ManagerOptions& options,
-    NetLog* net_log)
+    NetLog* net_log,
+    DnsClientFactory dns_client_factory_for_testing)
     : max_queued_jobs_(0),
       proc_params_(nullptr, options.max_system_retry_attempts),
       net_log_(net_log),
+      dns_client_factory_for_testing_(
+          std::move(dns_client_factory_for_testing)),
       received_dns_config_(false),
       dns_config_overrides_(options.dns_config_overrides),
-      num_insecure_dns_task_failures_(0),
+      num_dns_failures_(0),
       check_ipv6_on_wifi_(options.check_ipv6_on_wifi),
       use_local_ipv6_(false),
       last_ipv6_probe_result_(true),
       additional_resolver_flags_(0),
+      use_proctask_by_default_(false),
       allow_fallback_to_proctask_(true),
-      bypass_insecure_dns_client_(false),
-      insecure_dns_client_enabled_(false),
       tick_clock_(base::DefaultTickClock::GetInstance()),
       invalidation_in_progress_(false) {
   PrioritizedDispatcher::Limits job_limits = GetDispatcherLimits(options);
@@ -2369,17 +2394,15 @@
 
   OnConnectionTypeChanged(NetworkChangeNotifier::GetConnectionType());
 
-  DnsConfig dns_config = GetBaseDnsConfig(false);
+  SetDnsClientEnabled(options.dns_client_enabled);
 
-#if defined(ENABLE_BUILT_IN_DNS)
-  dns_client_ = DnsClient::CreateClient(net_log_);
-  DCHECK(dns_client_);
-  if (!dns_client_->GetConfig())
-    dns_client_->SetConfig(dns_config);
-#endif
+  {
+    DnsConfig dns_config = GetBaseDnsConfig(false);
+    // Conservatively assume local IPv6 is needed when DnsConfig is not valid.
+    use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6;
+    UpdateModeForHistogram(dns_config);
+  }
 
-  use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6;
-  SetInsecureDnsClientEnabled(options.insecure_dns_client_enabled);
   allow_fallback_to_proctask_ = !ConfigureAsyncDnsNoFallbackFieldTrial();
 }
 
@@ -2438,23 +2461,34 @@
   return listener;
 }
 
-void HostResolverManager::SetInsecureDnsClientEnabled(bool enabled) {
+void HostResolverManager::SetDnsClientEnabled(bool enabled) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (insecure_dns_client_enabled_ == enabled)
+
+  if (enabled && !dns_client_) {
+    if (dns_client_factory_for_testing_) {
+      SetDnsClient(dns_client_factory_for_testing_.Run(net_log_));
+    } else {
+#if defined(ENABLE_BUILT_IN_DNS)
+      SetDnsClient(DnsClient::CreateClient(net_log_));
+#endif
+    }
     return;
+  }
 
-  insecure_dns_client_enabled_ = enabled;
-  AbortInsecureDnsTasks(ERR_NETWORK_CHANGED, false /* fallback_only */);
-
-  DnsConfig dns_config = GetBaseDnsConfig(false);
-  UpdateModeForHistogram(dns_config);
+  if (!enabled && dns_client_) {
+    SetDnsClient(nullptr);
+  }
 }
 
 std::unique_ptr<base::Value> HostResolverManager::GetDnsConfigAsValue() const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // Check if async DNS is disabled.
   if (!dns_client_.get())
     return nullptr;
 
+  // Check if async DNS is enabled, but we currently have no configuration
+  // for it.
   const DnsConfig* dns_config = dns_client_->GetConfig();
   if (!dns_config)
     return std::make_unique<base::DictionaryValue>();
@@ -2484,17 +2518,6 @@
   host_cache_invalidators_.RemoveObserver(invalidator);
 }
 
-bool HostResolverManager::GetInsecureDnsClientEnabledForTesting() {
-  return insecure_dns_client_enabled_;
-}
-
-DnsConfig::SecureDnsMode HostResolverManager::GetSecureDnsModeForTesting() {
-  if (!HaveDnsConfig())
-    return DnsConfig::SecureDnsMode::OFF;
-
-  return dns_client_->GetConfig()->secure_dns_mode;
-}
-
 const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
 HostResolverManager::GetDnsOverHttpsServersForTesting() const {
   if (!dns_config_overrides_.dns_over_https_servers ||
@@ -2542,8 +2565,10 @@
 
 void HostResolverManager::SetDnsClientForTesting(
     std::unique_ptr<DnsClient> dns_client) {
+  // Use SetDnsClientEnabled(false) to disable.
   DCHECK(dns_client);
-  dns_client_ = std::move(dns_client);
+
+  SetDnsClient(std::move(dns_client));
 }
 
 void HostResolverManager::SetTaskRunnerForTesting(
@@ -2571,7 +2596,6 @@
 
   DnsQueryType effective_query_type;
   HostResolverFlags effective_host_resolver_flags;
-  DnsConfig::SecureDnsMode effective_secure_dns_mode;
   std::deque<TaskType> tasks;
   base::Optional<HostCache::EntryStaleness> stale_info;
   HostCache::Entry results = ResolveLocally(
@@ -2580,11 +2604,9 @@
       request->parameters().secure_dns_mode_override,
       request->parameters().cache_usage, request->source_net_log(),
       request->host_cache(), &effective_query_type,
-      &effective_host_resolver_flags, &effective_secure_dns_mode, &tasks,
-      &stale_info);
+      &effective_host_resolver_flags, &tasks, &stale_info);
   if (results.error() != ERR_DNS_CACHE_MISS ||
-      request->parameters().source == HostResolverSource::LOCAL_ONLY ||
-      tasks.empty()) {
+      request->parameters().source == HostResolverSource::LOCAL_ONLY) {
     if (results.error() == OK && !request->parameters().is_speculative) {
       request->set_results(
           results.CopyWithDefaultPort(request->request_host().port()));
@@ -2599,7 +2621,7 @@
 
   int rv =
       CreateAndStartJob(effective_query_type, effective_host_resolver_flags,
-                        effective_secure_dns_mode, std::move(tasks), request);
+                        std::move(tasks), request);
   // At this point, expect only async or errors.
   DCHECK_NE(OK, rv);
 
@@ -2617,7 +2639,6 @@
     HostCache* cache,
     DnsQueryType* out_effective_query_type,
     HostResolverFlags* out_effective_host_resolver_flags,
-    DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
     std::deque<TaskType>* out_tasks,
     base::Optional<HostCache::EntryStaleness>* out_stale_info) {
   DCHECK(out_stale_info);
@@ -2644,8 +2665,7 @@
   GetEffectiveParametersForRequest(
       hostname, dns_query_type, source, flags, secure_dns_mode_override,
       cache_usage, ip_address_ptr, source_net_log, out_effective_query_type,
-      out_effective_host_resolver_flags, out_effective_secure_dns_mode,
-      out_tasks);
+      out_effective_host_resolver_flags, out_tasks);
 
   bool resolve_canonname =
       *out_effective_host_resolver_flags & HOST_RESOLVER_CANONNAME;
@@ -2707,7 +2727,7 @@
   // TODO(szym): Do not do this if nsswitch.conf instructs not to.
   // http://crbug.com/117655
   resolved = ServeFromHosts(hostname, *out_effective_query_type,
-                            default_family_due_to_no_ipv6, *out_tasks);
+                            default_family_due_to_no_ipv6);
   if (resolved) {
     NetLogHostCacheEntry(source_net_log,
                          NetLogEventType::HOST_RESOLVER_IMPL_HOSTS_HIT,
@@ -2721,13 +2741,12 @@
 int HostResolverManager::CreateAndStartJob(
     DnsQueryType effective_query_type,
     HostResolverFlags effective_host_resolver_flags,
-    DnsConfig::SecureDnsMode effective_secure_dns_mode,
     std::deque<TaskType> tasks,
     RequestImpl* request) {
   DCHECK(!tasks.empty());
   JobKey key = {request->request_host().host(), effective_query_type,
-                effective_host_resolver_flags,  request->parameters().source,
-                effective_secure_dns_mode,      request->request_context()};
+                effective_host_resolver_flags, request->parameters().source,
+                request->request_context()};
 
   auto jobit = jobs_.find(key);
   Job* job;
@@ -2839,12 +2858,8 @@
 base::Optional<HostCache::Entry> HostResolverManager::ServeFromHosts(
     base::StringPiece hostname,
     DnsQueryType query_type,
-    bool default_family_due_to_no_ipv6,
-    const std::deque<TaskType>& tasks) {
-  // Don't attempt a HOSTS lookup if there is no DnsConfig or the HOSTS lookup
-  // is going to be done next as part of a system lookup.
-  if (!HaveDnsConfig() || !IsAddressType(query_type) ||
-      (!tasks.empty() && tasks.front() == TaskType::PROC))
+    bool default_family_due_to_no_ipv6) {
+  if (!HaveDnsConfig() || !IsAddressType(query_type))
     return base::nullopt;
 
   // HOSTS lookups are case-insensitive.
@@ -2875,7 +2890,7 @@
   // If got only loopback addresses and the family was restricted, resolve
   // again, without restrictions. See SystemHostResolverCall for rationale.
   if (default_family_due_to_no_ipv6 && IsAllIPv4Loopback(addresses)) {
-    return ServeFromHosts(hostname, DnsQueryType::UNSPECIFIED, false, tasks);
+    return ServeFromHosts(hostname, DnsQueryType::UNSPECIFIED, false);
   }
 
   if (!addresses.empty()) {
@@ -2974,13 +2989,12 @@
 }
 
 bool HostResolverManager::HasAvailableDohServer() {
-  // TODO(crbug.com/985589): Once DoH probes are sent, update this such that a
+  // TODO(crbug.com/878582): Once DoH probes are sent, update this such that a
   // DoH server is considered successful if it has a successful probe state.
   return dns_client_->GetConfig()->dns_over_https_servers.size() > 0;
 }
 
 DnsConfig::SecureDnsMode HostResolverManager::GetEffectiveSecureDnsMode(
-    const std::string& hostname,
     base::Optional<DnsConfig::SecureDnsMode> secure_dns_mode_override) {
   DnsConfig::SecureDnsMode secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
   if (secure_dns_mode_override) {
@@ -2988,107 +3002,64 @@
   } else if (HaveDnsConfig()) {
     secure_dns_mode = dns_client_->GetConfig()->secure_dns_mode;
   }
-
-  // If the query name matches one of the DoH server names, downgrade to OFF to
-  // avoid infinite recursion.
-  // TODO(crbug.com/985589): Add a URLRequest-level parameter to skip DoH that
-  // can be set when a URLRequest to a DoH server is built, and use this
-  // parameters to set |secure_dns_mode_override| in ResolveHostParameters. This
-  // improvement will prevent us from unnecessarily skipping DoH when a
-  // connection to the DoH server has been established but the query happens to
-  // be for a DoH server hostname.
-  if (HaveDnsConfig()) {
-    for (auto& server : dns_client_->GetConfig()->dns_over_https_servers) {
-      if (hostname.compare(
-              GURL(GetURLFromTemplateWithoutParameters(server.server_template))
-                  .host()) == 0) {
-        secure_dns_mode = DnsConfig::SecureDnsMode::OFF;
-        break;
-      }
-    }
-  }
-
   return secure_dns_mode;
 }
 
-bool HostResolverManager::HaveTestProcOverride() {
-  return !proc_params_.resolver_proc && HostResolverProc::GetDefault();
-}
-
 void HostResolverManager::PushDnsTasks(
-    bool proc_task_allowed,
+    bool allow_proc_fallback,
     DnsConfig::SecureDnsMode secure_dns_mode,
-    bool insecure_tasks_allowed,
     ResolveHostParameters::CacheUsage cache_usage,
     std::deque<TaskType>* out_tasks) {
-  DCHECK(HaveDnsConfig());
   bool allow_cache =
       cache_usage != ResolveHostParameters::CacheUsage::DISALLOWED;
-  // If a catch-all DNS block has been set for unit tests, we shouldn't send
-  // DnsTasks. It is still necessary to call this method, however, so that the
-  // correct cache tasks for the secure dns mode are added.
-  bool dns_tasks_allowed = !HaveTestProcOverride();
   // Upgrade the insecure DnsTask depending on the secure dns mode.
   switch (secure_dns_mode) {
     case DnsConfig::SecureDnsMode::SECURE:
       DCHECK(dns_client_->GetConfig()->dns_over_https_servers.size() != 0);
+      // Replace the insecure DnsTask with a secure cache lookup followed
+      // by a secure DnsTask.
       if (allow_cache)
         out_tasks->push_back(TaskType::SECURE_CACHE_LOOKUP);
-      if (dns_tasks_allowed)
-        out_tasks->push_back(TaskType::SECURE_DNS);
+      out_tasks->push_back(TaskType::SECURE_DNS);
       break;
     case DnsConfig::SecureDnsMode::AUTOMATIC:
-      // TODO(crbug.com/985589): For a DnsTask in AUTOMATIC mode, the async
+      // TODO(crbug.com/878582): For a DnsTask in AUTOMATIC mode, the async
       // resolver should only send insecure requests if it is enabled on this
       // platform.
       if (!HasAvailableDohServer()) {
         // Don't run a secure DnsTask if there are no available DoH servers.
         if (allow_cache)
           out_tasks->push_back(TaskType::CACHE_LOOKUP);
-        if (dns_tasks_allowed && insecure_tasks_allowed)
-          out_tasks->push_back(TaskType::DNS);
+        out_tasks->push_back(TaskType::DNS);
       } else if (cache_usage == HostResolver::ResolveHostParameters::
                                     CacheUsage::STALE_ALLOWED) {
         // If stale results are allowed, the cache should be checked for both
         // secure and insecure results prior to running a secure DnsTask.
         out_tasks->push_back(TaskType::CACHE_LOOKUP);
-        if (dns_tasks_allowed) {
-          out_tasks->push_back(TaskType::SECURE_DNS);
-          if (insecure_tasks_allowed)
-            out_tasks->push_back(TaskType::DNS);
-        }
+        out_tasks->push_back(TaskType::SECURE_DNS);
+        out_tasks->push_back(TaskType::DNS);
       } else {
         if (allow_cache)
           out_tasks->push_back(TaskType::SECURE_CACHE_LOOKUP);
-        if (dns_tasks_allowed)
-          out_tasks->push_back(TaskType::SECURE_DNS);
+        out_tasks->push_back(TaskType::SECURE_DNS);
         if (allow_cache)
           out_tasks->push_back(TaskType::INSECURE_CACHE_LOOKUP);
-        if (dns_tasks_allowed && insecure_tasks_allowed)
-          out_tasks->push_back(TaskType::DNS);
+        out_tasks->push_back(TaskType::DNS);
       }
       break;
     case DnsConfig::SecureDnsMode::OFF:
       if (allow_cache)
         out_tasks->push_back(TaskType::CACHE_LOOKUP);
-      if (dns_tasks_allowed && insecure_tasks_allowed)
-        out_tasks->push_back(TaskType::DNS);
+      out_tasks->push_back(TaskType::DNS);
       break;
     default:
       NOTREACHED();
       break;
   }
 
-  bool added_dns_task = false;
-  for (auto it = out_tasks->begin(); it != out_tasks->end(); ++it) {
-    if (*it == TaskType::DNS || *it == TaskType::SECURE_DNS) {
-      added_dns_task = true;
-      break;
-    }
-  }
-  // The system resolver can be used as a fallback for a non-existent or
-  // failing DnsTask if allowed by the request parameters.
-  if (proc_task_allowed && (!added_dns_task || allow_fallback_to_proctask_))
+  // The system resolver can be used as a fallback if allowed by the request
+  // parameters.
+  if (allow_proc_fallback && allow_fallback_to_proctask_)
     out_tasks->push_back(TaskType::PROC);
 }
 
@@ -3099,11 +3070,10 @@
     HostResolverFlags flags,
     base::Optional<DnsConfig::SecureDnsMode> secure_dns_mode_override,
     ResolveHostParameters::CacheUsage cache_usage,
-    DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
     std::deque<TaskType>* out_tasks) {
   DCHECK(out_tasks->empty());
-  *out_effective_secure_dns_mode =
-      GetEffectiveSecureDnsMode(hostname, secure_dns_mode_override);
+  DnsConfig::SecureDnsMode secure_dns_mode =
+      GetEffectiveSecureDnsMode(secure_dns_mode_override);
 
   // A cache lookup should generally be performed first. For jobs involving a
   // DnsTask, this task will be removed before DnsTasks and other related tasks
@@ -3124,24 +3094,22 @@
       if ((flags & HOST_RESOLVER_CANONNAME) && IsAddressType(dns_query_type)) {
         out_tasks->push_back(TaskType::PROC);
       } else if (!ResemblesMulticastDNSName(hostname)) {
-        bool proc_task_allowed =
+        bool allow_proc_fallback =
             IsAddressType(dns_query_type) &&
-            *out_effective_secure_dns_mode != DnsConfig::SecureDnsMode::SECURE;
-        if (HaveDnsConfig()) {
+            secure_dns_mode != DnsConfig::SecureDnsMode::SECURE;
+        // DnsClient or config is not available, but we're allowed to switch to
+        // ProcTask instead.
+        if ((!HaveDnsConfig() || use_proctask_by_default_) &&
+            allow_proc_fallback) {
+          out_tasks->push_back(TaskType::PROC);
+        } else {
           // Remove the initial cache lookup task.
           if (!out_tasks->empty())
             out_tasks->pop_front();
-          PushDnsTasks(
-              proc_task_allowed, *out_effective_secure_dns_mode,
-              insecure_dns_client_enabled_ && !bypass_insecure_dns_client_,
-              cache_usage, out_tasks);
-        } else if (proc_task_allowed) {
-          out_tasks->push_back(TaskType::PROC);
+          PushDnsTasks(allow_proc_fallback, secure_dns_mode, cache_usage,
+                       out_tasks);
         }
       } else if (IsAddressType(dns_query_type)) {
-        // For *.local address queries, try the system resolver even if the
-        // secure dns mode is SECURE. Public recursive resolvers aren't expected
-        // to handle these queries.
         out_tasks->push_back(TaskType::PROC);
       } else {
         out_tasks->push_back(TaskType::MDNS);
@@ -3151,14 +3119,11 @@
       out_tasks->push_back(TaskType::PROC);
       break;
     case HostResolverSource::DNS:
-      if (HaveDnsConfig()) {
-        // Remove the initial cache lookup task.
-        if (!out_tasks->empty())
-          out_tasks->pop_front();
-        PushDnsTasks(false /* proc_task_allowed */,
-                     *out_effective_secure_dns_mode,
-                     insecure_dns_client_enabled_, cache_usage, out_tasks);
-      }
+      // Remove the initial cache lookup task.
+      if (!out_tasks->empty())
+        out_tasks->pop_front();
+      PushDnsTasks(false /* allow_proc_fallback */, secure_dns_mode,
+                   cache_usage, out_tasks);
       break;
     case HostResolverSource::MULTICAST_DNS:
       out_tasks->push_back(TaskType::MDNS);
@@ -3180,7 +3145,6 @@
     const NetLogWithSource& net_log,
     DnsQueryType* out_effective_type,
     HostResolverFlags* out_effective_flags,
-    DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
     std::deque<TaskType>* out_tasks) {
   *out_effective_flags = flags | additional_resolver_flags_;
   *out_effective_type = dns_query_type;
@@ -3198,7 +3162,7 @@
 
   CreateTaskSequence(hostname, *out_effective_type, source,
                      *out_effective_flags, secure_dns_mode_override,
-                     cache_usage, out_effective_secure_dns_mode, out_tasks);
+                     cache_usage, out_tasks);
 }
 
 bool HostResolverManager::IsIPv6Reachable(const NetLogWithSource& net_log) {
@@ -3297,13 +3261,35 @@
     dispatcher_->SetLimits(limits);
 }
 
-void HostResolverManager::AbortInsecureDnsTasks(int error, bool fallback_only) {
+void HostResolverManager::SetDnsClient(std::unique_ptr<DnsClient> dns_client) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // DnsClient and config must be updated before aborting DnsTasks, since doing
+  // so may start new jobs.
+  dns_client_ = std::move(dns_client);
+  if (dns_client_ && !dns_client_->GetConfig() &&
+      num_dns_failures_ < kMaximumDnsFailures) {
+    dns_client_->SetConfig(GetBaseDnsConfig(false));
+    num_dns_failures_ = 0;
+  }
+
+  AbortDnsTasks(ERR_NETWORK_CHANGED, false /* fallback_only */);
+  DnsConfig dns_config;
+  if (!HaveDnsConfig()) {
+    // UpdateModeForHistogram() needs to know the DnsConfig when
+    // !HaveDnsConfig()
+    dns_config = GetBaseDnsConfig(false);
+  }
+  UpdateModeForHistogram(dns_config);
+}
+
+void HostResolverManager::AbortDnsTasks(int error, bool fallback_only) {
   // Aborting jobs potentially modifies |jobs_| and may even delete some jobs.
   // Create safe closures of all current jobs.
   std::vector<base::OnceClosure> job_abort_closures;
   for (auto& job : jobs_) {
     job_abort_closures.push_back(
-        job.second->GetAbortInsecureDnsTaskClosure(error, fallback_only));
+        job.second->GetAbortDnsTaskClosure(error, fallback_only));
   }
 
   // Pause the dispatcher so it won't start any new dispatcher jobs while
@@ -3392,7 +3378,6 @@
     received_dns_config_ = dns_config.IsValid();
   }
 
-  // TODO(crbug.com/985589): Upgrade DoH servers for automatic mode here.
   return dns_config_overrides_.ApplyOverrides(dns_config);
 }
 
@@ -3402,6 +3387,8 @@
   // Conservatively assume local IPv6 is needed when DnsConfig is not valid.
   use_local_ipv6_ = !dns_config.IsValid() || dns_config.use_local_ipv6;
 
+  num_dns_failures_ = 0;
+
   // We want a new DnsSession in place, before we Abort running Jobs, so that
   // the newly started jobs use the new config.
   if (dns_client_.get()) {
@@ -3411,14 +3398,11 @@
            dns_client_->GetConfig()->Equals(dns_config));
     dns_client_->SetConfig(dns_config);
   }
+  use_proctask_by_default_ = false;
 
   if (config_changed) {
     InvalidateCaches();
 
-    // Reset the insecure DNS task failure counter.
-    num_insecure_dns_task_failures_ = 0;
-    bypass_insecure_dns_client_ = false;
-
     // Life check to bail once |this| is deleted.
     base::WeakPtr<HostResolverManager> self = weak_ptr_factory_.GetWeakPtr();
 
@@ -3435,25 +3419,35 @@
 }
 
 bool HostResolverManager::HaveDnsConfig() const {
-  return dns_client_ && dns_client_->GetConfig();
+  // Use DnsClient only if it's fully configured and there is no override by
+  // ScopedDefaultHostResolverProc.
+  // The alternative is to use NetworkChangeNotifier to override DnsConfig,
+  // but that would introduce construction order requirements for NCN and SDHRP.
+  return dns_client_ && dns_client_->GetConfig() &&
+         (proc_params_.resolver_proc || !HostResolverProc::GetDefault());
+}
+
+void HostResolverManager::OnDnsTaskResolve() {
+  DCHECK(dns_client_);
+  num_dns_failures_ = 0;
 }
 
 void HostResolverManager::OnFallbackResolve(int dns_task_error) {
   DCHECK(dns_client_);
   DCHECK_NE(OK, dns_task_error);
 
-  ++num_insecure_dns_task_failures_;
-  if (num_insecure_dns_task_failures_ < kMaximumInsecureDnsTaskFailures)
+  ++num_dns_failures_;
+  if (num_dns_failures_ < kMaximumDnsFailures)
     return;
 
-  // Skip insecure DNS lookups until the next DNS config change.  Must be done
-  // before aborting DnsTasks, since doing so may start new jobs.  Do not fully
-  // clear out or disable the DnsClient as some requests (e.g. those specifying
-  // DNS source) are not allowed to fallback and will continue using DnsTask.
-  bypass_insecure_dns_client_ = true;
+  // Force fallback until the next DNS change.  Must be done before aborting
+  // DnsTasks, since doing so may start new jobs.  Do not fully clear out or
+  // disable the DnsClient as some requests (e.g. those specifying DNS source)
+  // are not allowed to fallback and will continue using DnsTask.
+  use_proctask_by_default_ = true;
 
-  // Fallback all fallback-allowed insecure DnsTasks to ProcTasks.
-  AbortInsecureDnsTasks(ERR_FAILED, true /* fallback_only */);
+  // Fallback all fallback-allowed DnsTasks to ProcTasks.
+  AbortDnsTasks(ERR_FAILED, true /* fallback_only */);
 }
 
 int HostResolverManager::GetOrCreateMdnsClient(MDnsClient** out_client) {
@@ -3480,10 +3474,9 @@
 #endif
 }
 
-// TODO(crbug.com/985589): Update these metrics for DoH.
 void HostResolverManager::UpdateModeForHistogram(const DnsConfig& dns_config) {
   // Resolving with Async DNS resolver?
-  if (HaveDnsConfig() && insecure_dns_client_enabled_) {
+  if (HaveDnsConfig()) {
     mode_for_histogram_ = MODE_FOR_HISTOGRAM_ASYNC_DNS;
     for (const auto& dns_server : dns_client_->GetConfig()->nameservers) {
       if (DnsServerSupportsDoh(dns_server.address())) {
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index b83f4f8..8f904491 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -89,6 +89,8 @@
   using MdnsListener = HostResolver::MdnsListener;
   using ResolveHostRequest = HostResolver::ResolveHostRequest;
   using ResolveHostParameters = HostResolver::ResolveHostParameters;
+  using DnsClientFactory =
+      base::RepeatingCallback<std::unique_ptr<DnsClient>(NetLog*)>;
   using SecureDnsMode = DnsConfig::SecureDnsMode;
 
   class CancellableRequest : public ResolveHostRequest {
@@ -110,8 +112,14 @@
   // outstanding DNS transactions (not counting retransmissions and retries).
   //
   // |net_log| must remain valid for the life of the HostResolverManager.
-  HostResolverManager(const HostResolver::ManagerOptions& options,
-                      NetLog* net_log);
+  //
+  // |dns_client_factory_for_testing| may be used to inject a factory to be used
+  // for ManagerOptions::dns_client_enabled and SetDnsClientEnabled(). If not
+  // set, standard DnsClient::CreateClient() will be used.
+  HostResolverManager(
+      const HostResolver::ManagerOptions& options,
+      NetLog* net_log,
+      DnsClientFactory dns_client_factory_for_testing = base::NullCallback());
 
   // If any completion callbacks are pending when the resolver is destroyed,
   // the host resolutions are cancelled, and the completion callbacks will not
@@ -140,7 +148,7 @@
   // DnsConfig, a new config is fetched from NetworkChangeNotifier.
   //
   // Setting to |true| has no effect if |ENABLE_BUILT_IN_DNS| not defined.
-  virtual void SetInsecureDnsClientEnabled(bool enabled);
+  virtual void SetDnsClientEnabled(bool enabled);
 
   std::unique_ptr<base::Value> GetDnsConfigAsValue() const;
 
@@ -162,13 +170,6 @@
   void AddHostCacheInvalidator(HostCache::Invalidator* invalidator);
   void RemoveHostCacheInvalidator(const HostCache::Invalidator* invalidator);
 
-  // Returns the state of the insecure part of the DnsClient.
-  bool GetInsecureDnsClientEnabledForTesting();
-
-  // Returns the currently configured secure dns mode.  Returns OFF if there is
-  // not a valid config.
-  SecureDnsMode GetSecureDnsModeForTesting();
-
   // Returns the currently configured DNS over HTTPS servers. Returns nullptr if
   // DNS over HTTPS is not enabled.
   const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
@@ -192,6 +193,8 @@
 
   void SetBaseDnsConfigForTesting(const DnsConfig& base_config);
 
+  // Similar to SetDnsClientEnabled(true) except allows setting |dns_client|
+  // as the instance to be used.
   void SetDnsClientForTesting(std::unique_ptr<DnsClient> dns_client);
 
   // Allows the tests to catch slots leaking out of the dispatcher.  One
@@ -214,7 +217,6 @@
 
  private:
   friend class HostResolverManagerTest;
-  friend class HostResolverManagerDnsTest;
   FRIEND_TEST_ALL_PREFIXES(HostResolverManagerDnsTest, ModeForHistogram);
   class Job;
   struct JobKey;
@@ -251,10 +253,9 @@
     SECURE_CACHE_LOOKUP,
   };
 
-  // Number of consecutive failures of an insecure DnsTask (with successful
-  // fallback to ProcTask) before the insecure portion of the DnsClient is
-  // disabled until the next DNS change.
-  static const unsigned kMaximumInsecureDnsTaskFailures;
+  // Number of consecutive failures of DnsTask (with successful fallback to
+  // ProcTask) before the DnsClient is disabled until the next DNS change.
+  static const unsigned kMaximumDnsFailures;
 
   // Attempts host resolution for |request|. Generally only expected to be
   // called from RequestImpl::Start().
@@ -267,9 +268,9 @@
   // sources.
   //
   // On ERR_DNS_CACHE_MISS and OK, effective request parameters are written to
-  // |out_effective_query_type|, |out_effective_host_resolver_flags|, and
-  // |out_effective_secure_dns_mode|. |out_tasks| contains the tentative
-  // sequence of tasks that a future job should run.
+  // |out_effective_query_type| and |out_effective_host_resolver_flags|.
+  // |out_tasks| contains the tentative sequence of tasks that a future job
+  // should run.
   //
   // If results are returned from the host cache, |out_stale_info| will be
   // filled in with information on how stale or fresh the result is. Otherwise,
@@ -288,7 +289,6 @@
       HostCache* cache,
       DnsQueryType* out_effective_query_type,
       HostResolverFlags* out_effective_host_resolver_flags,
-      DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
       std::deque<TaskType>* out_tasks,
       base::Optional<HostCache::EntryStaleness>* out_stale_info);
 
@@ -297,7 +297,6 @@
   // |request|. On error, marks |request| completed and returns the error.
   int CreateAndStartJob(DnsQueryType effective_query_type,
                         HostResolverFlags effective_host_resolver_flags,
-                        DnsConfig::SecureDnsMode effective_secure_dns_mode,
                         std::deque<TaskType> tasks,
                         RequestImpl* request);
 
@@ -319,14 +318,12 @@
       const NetLogWithSource& source_net_log,
       base::Optional<HostCache::EntryStaleness>* out_stale_info);
 
-  // Iff we have a DnsClient with a valid DnsConfig and we're not about to
-  // attempt a system lookup, then try to resolve the query using the HOSTS
-  // file.
+  // Iff we have a DnsClient with a valid DnsConfig, and |key| can be resolved
+  // from the HOSTS file, return the results.
   base::Optional<HostCache::Entry> ServeFromHosts(
       base::StringPiece hostname,
       DnsQueryType query_type,
-      bool default_family_due_to_no_ipv6,
-      const std::deque<TaskType>& tasks);
+      bool default_family_due_to_no_ipv6);
 
   // Iff |key| is for a localhost name (RFC 6761) and address DNS query type,
   // returns a results entry with the loopback IP.
@@ -340,21 +337,14 @@
   bool HasAvailableDohServer();
 
   // Returns the secure dns mode to use for a job, taking into account the
-  // global DnsConfig mode and any per-request override. Requests matching DoH
-  // server hostnames are downgraded to off mode to avoid infinite loops.
+  // global DnsConfig mode and any per-request override.
   SecureDnsMode GetEffectiveSecureDnsMode(
-      const std::string& hostname,
       base::Optional<SecureDnsMode> secure_dns_mode_override);
 
-  // Returns true if a catch-all DNS block has been set for unit tests. No
-  // DnsTasks should be issued in this case.
-  bool HaveTestProcOverride();
-
   // Helper method to add DnsTasks and related tasks based on the SecureDnsMode
   // and fallback parameters.
-  void PushDnsTasks(bool proc_task_allowed,
+  void PushDnsTasks(bool allow_proc_fallback,
                     SecureDnsMode secure_dns_mode,
-                    bool insecure_tasks_allowed,
                     ResolveHostParameters::CacheUsage cache_usage,
                     std::deque<TaskType>* out_tasks);
 
@@ -367,7 +357,6 @@
       HostResolverFlags flags,
       base::Optional<SecureDnsMode> secure_dns_mode_override,
       ResolveHostParameters::CacheUsage cache_usage,
-      DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
       std::deque<TaskType>* out_tasks);
 
   // Determines "effective" request parameters using manager properties and IPv6
@@ -383,7 +372,6 @@
       const NetLogWithSource& net_log,
       DnsQueryType* out_effective_type,
       HostResolverFlags* out_effective_flags,
-      DnsConfig::SecureDnsMode* out_effective_secure_dns_mode,
       std::deque<TaskType>* out_tasks);
 
   // Probes IPv6 support and returns true if IPv6 support is enabled.
@@ -417,13 +405,14 @@
   // true. Might start new jobs.
   void AbortAllJobs(bool in_progress_only);
 
-  // Aborts all in progress insecure DnsTasks. In-progress jobs will fall back
-  // to ProcTasks if able and otherwise abort with |error|. Might start new
-  // jobs, if any jobs were taking up two dispatcher slots.
+  void SetDnsClient(std::unique_ptr<DnsClient> dns_client);
+
+  // Aborts all in progress DnsTasks. In-progress jobs will fall back to
+  // ProcTasks if able and otherwise abort with |error|. Might start new jobs,
+  // if any jobs were taking up two dispatcher slots.
   //
-  // If |fallback_only|, insecure DnsTasks will only abort if they can fallback
-  // to ProcTask.
-  void AbortInsecureDnsTasks(int error, bool fallback_only);
+  // If |fallback_only|, tasks will only abort if they can fallback to ProcTask.
+  void AbortDnsTasks(int error, bool fallback_only);
 
   // Attempts to serve each Job in |jobs_| from the HOSTS file if we have
   // a DnsClient with a valid DnsConfig.
@@ -448,6 +437,8 @@
   // True if have a DnsClient with a valid DnsConfig.
   bool HaveDnsConfig() const;
 
+  // Called on successful DnsTask resolve.
+  void OnDnsTaskResolve();
   // Called on successful resolve after falling back to ProcTask after a failed
   // DnsTask resolve.
   void OnFallbackResolve(int dns_task_error);
@@ -479,6 +470,9 @@
 
   NetLog* net_log_;
 
+  // If set, used for construction of DnsClients for SetDnsClientEnabled().
+  const DnsClientFactory dns_client_factory_for_testing_;
+
   // If present, used by DnsTask and ServeFromHosts to resolve requests.
   std::unique_ptr<DnsClient> dns_client_;
 
@@ -495,9 +489,8 @@
   // resolution.
   DnsConfigOverrides dns_config_overrides_;
 
-  // Number of consecutive failures of insecure DnsTask, counted when fallback
-  // succeeds.
-  unsigned num_insecure_dns_task_failures_;
+  // Number of consecutive failures of DnsTask, counted when fallback succeeds.
+  unsigned num_dns_failures_;
 
   // False if IPv6 should not be attempted and assumed unreachable when on a
   // WiFi connection. See https://crbug.com/696569 for further context.
@@ -513,14 +506,15 @@
   // Any resolver flags that should be added to a request by default.
   HostResolverFlags additional_resolver_flags_;
 
+  // |true| if requests that would otherwise be handled via DnsTask should
+  // instead use ProcTask when able.  Used in cases where there have been
+  // multiple failures in DnsTask that succeeded in ProcTask, leading to the
+  // conclusion that the resolver has a bad DNS configuration.
+  bool use_proctask_by_default_;
+
   // Allow fallback to ProcTask if DnsTask fails.
   bool allow_fallback_to_proctask_;
 
-  // Whether insecure DnsTasks should not be added to the task sequence even if
-  // the insecure part of the DnsClient is enabled. This is set to true when
-  // there are too many successive insecure DnsTask failures.
-  bool bypass_insecure_dns_client_;
-
   // Task runner used for DNS lookups using the system resolver. Normally a
   // ThreadPool task runner, but can be overridden for tests.
   scoped_refptr<base::TaskRunner> proc_task_runner_;
@@ -528,13 +522,6 @@
   // Current resolver mode, useful for breaking down histogram data.
   ModeForHistogram mode_for_histogram_;
 
-  // Whether insecure requests should be issued by DnsClient. This field is
-  // complementary to the SecureDnsMode in DnsConfig. If we're in AUTOMATIC
-  // mode, |insecure_dns_client_enabled_| will determine whether or not we
-  // fallback to the insecure part of DnsClient before falling back to the
-  // system resolver.
-  bool insecure_dns_client_enabled_;
-
   // Shared tick clock, overridden for testing.
   const base::TickClock* tick_clock_;
 
diff --git a/net/dns/host_resolver_manager_fuzzer.cc b/net/dns/host_resolver_manager_fuzzer.cc
index 23795a6..0606e0a 100644
--- a/net/dns/host_resolver_manager_fuzzer.cc
+++ b/net/dns/host_resolver_manager_fuzzer.cc
@@ -205,7 +205,7 @@
     net::HostResolver::ManagerOptions options;
     options.max_concurrent_resolves =
         data_provider.ConsumeIntegralInRange(1, 8);
-    options.insecure_dns_client_enabled = data_provider.ConsumeBool();
+    options.dns_client_enabled = data_provider.ConsumeBool();
     bool enable_caching = data_provider.ConsumeBool();
     std::unique_ptr<net::ContextHostResolver> host_resolver =
         net::CreateFuzzedContextHostResolver(options, &net_log, &data_provider,
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc
index 860fca3..f332b9c 100644
--- a/net/dns/host_resolver_manager_unittest.cc
+++ b/net/dns/host_resolver_manager_unittest.cc
@@ -426,10 +426,12 @@
                           NetLog* net_log)
       : TestHostResolverManager(options, net_log, true) {}
 
-  TestHostResolverManager(const HostResolver::ManagerOptions& options,
-                          NetLog* net_log,
-                          bool ipv6_reachable)
-      : HostResolverManager(options, net_log),
+  TestHostResolverManager(
+      const HostResolver::ManagerOptions& options,
+      NetLog* net_log,
+      bool ipv6_reachable,
+      DnsClientFactory dns_client_factory_for_testing = base::NullCallback())
+      : HostResolverManager(options, net_log, dns_client_factory_for_testing),
         ipv6_reachable_(ipv6_reachable) {}
 
   ~TestHostResolverManager() override = default;
@@ -539,7 +541,7 @@
       const ProcTaskParams& params,
       bool ipv6_reachable) {
     // Use HostResolverManagerDnsTest if enabling DNS client.
-    DCHECK(!options.insecure_dns_client_enabled);
+    DCHECK(!options.dns_client_enabled);
 
     DestroyResolver();
 
@@ -562,8 +564,8 @@
     resolver_->allow_fallback_to_proctask_ = allow_fallback_to_proctask;
   }
 
-  static unsigned maximum_insecure_dns_task_failures() {
-    return HostResolverManager::kMaximumInsecureDnsTaskFailures;
+  static unsigned maximum_dns_failures() {
+    return HostResolverManager::kMaximumDnsFailures;
   }
 
   bool IsIPv6Reachable(const NetLogWithSource& net_log) {
@@ -3404,21 +3406,28 @@
   HostResolver::ManagerOptions DefaultOptions() override {
     HostResolver::ManagerOptions options =
         HostResolverManagerTest::DefaultOptions();
-    options.insecure_dns_client_enabled = true;
+    options.dns_client_enabled = true;
     return options;
   }
 
+  // Implements HostResolverManager::DnsClientFactory to create a MockDnsClient
+  // with empty config and default rules.
+  std::unique_ptr<DnsClient> CreateMockClient(NetLog* net_log) {
+    auto dns_client =
+        std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
+    dns_client_ = dns_client.get();
+    return dns_client;
+  }
+
   void CreateResolverWithOptionsAndParams(HostResolver::ManagerOptions options,
                                           const ProcTaskParams& params,
                                           bool ipv6_reachable) override {
     DestroyResolver();
 
     resolver_ = std::make_unique<TestHostResolverManager>(
-        options, nullptr /* net_log */, ipv6_reachable);
-    auto dns_client =
-        std::make_unique<MockDnsClient>(DnsConfig(), CreateDefaultDnsRules());
-    dns_client_ = dns_client.get();
-    resolver_->SetDnsClientForTesting(std::move(dns_client));
+        options, nullptr /* net_log */, ipv6_reachable,
+        base::BindRepeating(&HostResolverManagerDnsTest::CreateMockClient,
+                            base::Unretained(this)));
     resolver_->set_proc_params_for_test(params);
 
     if (host_cache_)
@@ -3434,7 +3443,6 @@
         std::make_unique<MockDnsClient>(DnsConfig(), std::move(rules));
     dns_client_ = dns_client.get();
     resolver_->SetDnsClientForTesting(std::move(dns_client));
-    resolver_->SetInsecureDnsClientEnabled(true);
     if (!config.Equals(DnsConfig()))
       ChangeDnsConfig(config);
   }
@@ -3529,11 +3537,6 @@
     AddDnsRule(&rules, "insecure_automatic", dns_protocol::kTypeAAAA,
                MockDnsClientRule::OK, false /* delay */);
 
-    AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeA,
-                     MockDnsClientRule::OK, false /* delay */);
-    AddSecureDnsRule(&rules, "secure", dns_protocol::kTypeAAAA,
-                     MockDnsClientRule::OK, false /* delay */);
-
     return rules;
   }
 
@@ -3597,7 +3600,7 @@
   MockDnsClient* dns_client_;
 };
 
-TEST_F(HostResolverManagerDnsTest, DisableAndEnableInsecureDnsClient) {
+TEST_F(HostResolverManagerDnsTest, DisableAndEnableDnsClient) {
   // Disable fallback to allow testing how requests are initially handled.
   set_allow_fallback_to_proctask(false);
 
@@ -3605,7 +3608,7 @@
   proc_->AddRuleForAllFamilies("nx_succeed", "192.168.2.47");
   proc_->SignalMultiple(1u);
 
-  resolver_->SetInsecureDnsClientEnabled(false);
+  resolver_->SetDnsClientEnabled(false);
   ResolveHostResponseHelper response_proc(resolver_->CreateRequest(
       HostPortPair("nx_succeed", 1212), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
@@ -3613,7 +3616,7 @@
   EXPECT_THAT(response_proc.request()->GetAddressResults().value().endpoints(),
               testing::ElementsAre(CreateExpected("192.168.2.47", 1212)));
 
-  resolver_->SetInsecureDnsClientEnabled(true);
+  resolver_->SetDnsClientEnabled(true);
   ResolveHostResponseHelper response_dns_client(resolver_->CreateRequest(
       HostPortPair("ok_fail", 1212), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
@@ -3754,18 +3757,32 @@
       initial_response1.request()->GetAddressResults().value().endpoints(),
       testing::ElementsAre(CreateExpected("192.168.1.102", 80)));
 
-  // Switch to a valid config.
   ChangeDnsConfig(CreateValidDnsConfig());
+
+  ResolveHostResponseHelper abort_response0(resolver_->CreateRequest(
+      HostPortPair("ok_abort", 80), NetLogWithSource(), base::nullopt,
+      request_context_.get(), host_cache_.get()));
+  ResolveHostResponseHelper abort_response1(resolver_->CreateRequest(
+      HostPortPair("nx_abort", 80), NetLogWithSource(), base::nullopt,
+      request_context_.get(), host_cache_.get()));
+
+  // Simulate the case when the preference or policy has disabled the DNS
+  // client causing AbortDnsTasks.
+  UseMockDnsClient(CreateValidDnsConfig(), CreateDefaultDnsRules());
+
   // First request is resolved by MockDnsClient, others should fail due to
   // disabled fallback to ProcTask.
   ResolveHostResponseHelper response0(resolver_->CreateRequest(
       HostPortPair("ok_fail", 80), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
   ResolveHostResponseHelper response1(resolver_->CreateRequest(
-      HostPortPair("nx_succeed", 80), NetLogWithSource(), base::nullopt,
+      HostPortPair("nx_fail", 80), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
   proc_->SignalMultiple(6u);
 
+  // Aborted due to Network Change.
+  EXPECT_THAT(abort_response0.result_error(), IsError(ERR_NETWORK_CHANGED));
+  EXPECT_THAT(abort_response1.result_error(), IsError(ERR_NETWORK_CHANGED));
   // Resolved by MockDnsClient.
   EXPECT_THAT(response0.result_error(), IsOk());
   EXPECT_THAT(response0.request()->GetAddressResults().value().endpoints(),
@@ -3872,9 +3889,9 @@
       request_context_.get(), host_cache_.get()));
   proc_->SignalMultiple(2u);
 
-  // Simulate the case when the preference or policy has disabled the insecure
-  // DNS client causing AbortInsecureDnsTasks.
-  resolver_->SetInsecureDnsClientEnabled(false);
+  // Simulate the case when the preference or policy has disabled the DNS client
+  // causing AbortDnsTasks.
+  resolver_->SetDnsClientEnabled(false);
 
   // All requests should fallback to proc resolver.
   EXPECT_THAT(response0.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
@@ -3905,45 +3922,15 @@
   // instead of hanging.
   proc_->SignalMultiple(2u);
 
-  // Simulate the case when the preference or policy has disabled the insecure
-  // DNS client causing AbortInsecureDnsTasks.
-  resolver_->SetInsecureDnsClientEnabled(false);
+  // Simulate the case when the preference or policy has disabled the DNS client
+  // causing AbortDnsTasks.
+  resolver_->SetDnsClientEnabled(false);
 
   // No fallback expected.  All requests should fail.
   EXPECT_THAT(response0.result_error(), IsError(ERR_NETWORK_CHANGED));
   EXPECT_THAT(response1.result_error(), IsError(ERR_NETWORK_CHANGED));
 }
 
-// Insecure DnsClient change shouldn't affect secure DnsTasks.
-TEST_F(HostResolverManagerDnsTest,
-       DisableInsecureDnsClient_SecureDnsTasksUnaffected) {
-  // Ensure fallback is otherwise allowed by resolver settings.
-  set_allow_fallback_to_proctask(true);
-
-  proc_->AddRuleForAllFamilies("automatic", "192.168.1.102");
-  // All other hostnames will fail in proc_.
-
-  ChangeDnsConfig(CreateValidDnsConfig());
-
-  HostResolver::ResolveHostParameters secure_parameters;
-  secure_parameters.secure_dns_mode_override =
-      DnsConfig::SecureDnsMode::AUTOMATIC;
-  ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
-      HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_FALSE(response_secure.complete());
-
-  // Simulate the case when the preference or policy has disabled the insecure
-  // DNS client causing AbortInsecureDnsTasks.
-  resolver_->SetInsecureDnsClientEnabled(false);
-
-  EXPECT_THAT(response_secure.result_error(), IsOk());
-  EXPECT_THAT(
-      response_secure.request()->GetAddressResults().value().endpoints(),
-      testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
-                                    CreateExpected("::1", 80)));
-}
-
 TEST_F(HostResolverManagerDnsTest, DnsTaskUnspec) {
   ChangeDnsConfig(CreateValidDnsConfig());
 
@@ -4090,28 +4077,6 @@
               testing::ElementsAre(CreateExpected("127.0.0.1", 80)));
 }
 
-TEST_F(HostResolverManagerDnsTest, SkipHostsWithUpcomingProcTask) {
-  // Disable the DnsClient.
-  resolver_->SetInsecureDnsClientEnabled(false);
-
-  proc_->AddRuleForAllFamilies(std::string(),
-                               std::string());  // Default to failures.
-  proc_->SignalMultiple(1u);  // For the first request which misses.
-
-  DnsConfig config = CreateValidDnsConfig();
-  DnsHosts hosts;
-  hosts[DnsHostsKey("hosts", ADDRESS_FAMILY_IPV4)] = IPAddress::IPv4Localhost();
-
-  // Update HOSTS file.
-  config.hosts = hosts;
-  ChangeDnsConfig(config);
-
-  ResolveHostResponseHelper response(resolver_->CreateRequest(
-      HostPortPair("hosts", 80), NetLogWithSource(), base::nullopt,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_THAT(response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
-}
-
 // Test that hosts ending in ".local" or ".local." are resolved using the system
 // resolver.
 TEST_F(HostResolverManagerDnsTest, BypassDnsTask) {
@@ -4237,8 +4202,7 @@
   EXPECT_THAT(system_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
 }
 
-TEST_F(HostResolverManagerDnsTest,
-       DisableInsecureDnsClientOnPersistentFailure) {
+TEST_F(HostResolverManagerDnsTest, DisableDnsClientOnPersistentFailure) {
   ChangeDnsConfig(CreateValidDnsConfig());
 
   proc_->AddRuleForAllFamilies(std::string(),
@@ -4251,7 +4215,7 @@
   EXPECT_THAT(initial_response.result_error(), IsOk());
 
   std::vector<std::unique_ptr<ResolveHostResponseHelper>> responses;
-  for (unsigned i = 0; i < maximum_insecure_dns_task_failures(); ++i) {
+  for (unsigned i = 0; i < maximum_dns_failures(); ++i) {
     // Use custom names to require separate Jobs.
     std::string hostname = base::StringPrintf("nx_%u", i);
     // Ensure fallback to ProcTask succeeds.
@@ -4269,8 +4233,7 @@
 
   ASSERT_FALSE(proc_->HasBlockedRequests());
 
-  // Insecure DnsTasks should be disabled by now unless explicitly requested via
-  // |source|.
+  // DnsTask should be disabled by now unless explictly requested via |source|.
   ResolveHostResponseHelper fail_response(resolver_->CreateRequest(
       HostPortPair("ok_2", 80), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
@@ -4283,15 +4246,6 @@
   EXPECT_THAT(fail_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
   EXPECT_THAT(dns_response.result_error(), IsOk());
 
-  // Secure DnsTasks should not be affected.
-  HostResolver::ResolveHostParameters secure_parameters;
-  secure_parameters.secure_dns_mode_override =
-      DnsConfig::SecureDnsMode::AUTOMATIC;
-  ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
-      HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_THAT(secure_response.result_error(), IsOk());
-
   // Check that it is re-enabled after DNS change.
   ChangeDnsConfig(CreateValidDnsConfig());
   ResolveHostResponseHelper reenabled_response(resolver_->CreateRequest(
@@ -4344,7 +4298,7 @@
   proc_->AddRuleForAllFamilies(std::string(), std::string());
 
   // Try without DnsClient.
-  resolver_->SetInsecureDnsClientEnabled(false);
+  resolver_->SetDnsClientEnabled(false);
   ResolveHostResponseHelper system_response(resolver_->CreateRequest(
       HostPortPair("localhost", 80), NetLogWithSource(), base::nullopt,
       request_context_.get(), host_cache_.get()));
@@ -4380,63 +4334,6 @@
                                     CreateExpected("::1", 80)));
 }
 
-TEST_F(HostResolverManagerDnsTest, SeparateJobsBySecureDnsMode) {
-  MockDnsClientRuleList rules;
-  rules.emplace_back("a", dns_protocol::kTypeA, true /* secure */,
-                     MockDnsClientRule::Result(MockDnsClientRule::FAIL),
-                     true /* delay */);
-  rules.emplace_back("a", dns_protocol::kTypeAAAA, true /* secure */,
-                     MockDnsClientRule::Result(MockDnsClientRule::FAIL),
-                     true /* delay */);
-  rules.emplace_back("a", dns_protocol::kTypeA, false /* secure */,
-                     MockDnsClientRule::Result(MockDnsClientRule::OK),
-                     false /* delay */);
-  rules.emplace_back("a", dns_protocol::kTypeAAAA, false /* secure */,
-                     MockDnsClientRule::Result(MockDnsClientRule::OK),
-                     false /* delay */);
-  UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
-  DnsConfigOverrides overrides;
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
-  resolver_->SetDnsConfigOverrides(overrides);
-
-  // Create three requests. One with a SECURE mode override, one with no
-  // mode override, and one with an AUTOMATIC mode override (which is a no-op
-  // since the DnsConfig uses AUTOMATIC).
-  HostResolver::ResolveHostParameters parameters_secure_override;
-  parameters_secure_override.secure_dns_mode_override =
-      DnsConfig::SecureDnsMode::SECURE;
-  ResolveHostResponseHelper secure_response(resolver_->CreateRequest(
-      HostPortPair("a", 80), NetLogWithSource(), parameters_secure_override,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_EQ(1u, resolver_->num_jobs_for_testing());
-
-  ResolveHostResponseHelper automatic_response0(resolver_->CreateRequest(
-      HostPortPair("a", 80), NetLogWithSource(), base::nullopt,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
-
-  HostResolver::ResolveHostParameters parameters_automatic_override;
-  parameters_automatic_override.secure_dns_mode_override =
-      DnsConfig::SecureDnsMode::AUTOMATIC;
-  ResolveHostResponseHelper automatic_response1(resolver_->CreateRequest(
-      HostPortPair("a", 80), NetLogWithSource(), parameters_automatic_override,
-      request_context_.get(), host_cache_.get()));
-  // The AUTOMATIC mode requests should be joined into the same job.
-  EXPECT_EQ(2u, resolver_->num_jobs_for_testing());
-
-  // All requests should be blocked on the secure transactions.
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(secure_response.complete());
-  EXPECT_FALSE(automatic_response0.complete());
-  EXPECT_FALSE(automatic_response1.complete());
-
-  // Complete secure transactions.
-  dns_client_->CompleteDelayedTransactions();
-  EXPECT_THAT(secure_response.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
-  EXPECT_THAT(automatic_response0.result_error(), IsOk());
-  EXPECT_THAT(automatic_response1.result_error(), IsOk());
-}
-
 // Cancel a request with a single DNS transaction active.
 TEST_F(HostResolverManagerDnsTest, CancelWithOneTransactionActive) {
   // Disable ipv6 to ensure we'll only try a single transaction for the host.
@@ -4965,73 +4862,18 @@
   EXPECT_TRUE(response_stale.request()->GetStaleInfo()->is_stale());
 }
 
-TEST_F(HostResolverManagerDnsTest,
-       SecureDnsMode_Automatic_InsecureAsyncDisabled) {
-  proc_->AddRuleForAllFamilies("insecure_automatic", "192.168.1.100");
-  ChangeDnsConfig(CreateValidDnsConfig());
-  resolver_->SetInsecureDnsClientEnabled(false);
-  DnsConfigOverrides overrides;
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
-  resolver_->SetDnsConfigOverrides(overrides);
-
-  const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
-
-  // The secure part of the dns client should be enabled.
-  ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
-      HostPortPair("automatic", 80), NetLogWithSource(), base::nullopt,
-      request_context_.get(), host_cache_.get()));
-  ASSERT_THAT(response_secure.result_error(), IsOk());
-  EXPECT_THAT(
-      response_secure.request()->GetAddressResults().value().endpoints(),
-      testing::UnorderedElementsAre(CreateExpected("127.0.0.1", 80),
-                                    CreateExpected("::1", 80)));
-  HostCache::Key secure_key =
-      HostCache::Key("automatic", DnsQueryType::UNSPECIFIED,
-                     0 /* host_resolver_flags */, HostResolverSource::ANY);
-  secure_key.secure = true;
-  cache_result = GetCacheHit(secure_key);
-  EXPECT_TRUE(!!cache_result);
-
-  // The insecure part of the dns client is disabled so insecure requests
-  // should be skipped.
-  ResolveHostResponseHelper response_insecure(resolver_->CreateRequest(
-      HostPortPair("insecure_automatic", 80), NetLogWithSource(), base::nullopt,
-      request_context_.get(), host_cache_.get()));
-  proc_->SignalMultiple(1u);
-  ASSERT_THAT(response_insecure.result_error(), IsOk());
-  EXPECT_THAT(
-      response_insecure.request()->GetAddressResults().value().endpoints(),
-      testing::ElementsAre(CreateExpected("192.168.1.100", 80)));
-  HostCache::Key insecure_key =
-      HostCache::Key("insecure_automatic", DnsQueryType::UNSPECIFIED,
-                     0 /* host_resolver_flags */, HostResolverSource::ANY);
-  cache_result = GetCacheHit(insecure_key);
-  EXPECT_TRUE(!!cache_result);
-
-  HostCache::Key cached_insecure_key =
-      HostCache::Key("insecure_automatic_cached", DnsQueryType::UNSPECIFIED,
-                     0 /* host_resolver_flags */, HostResolverSource::ANY);
-  IPEndPoint kExpectedInsecureIP = CreateExpected("192.168.1.101", 80);
-  PopulateCache(cached_insecure_key, kExpectedInsecureIP);
-
-  // The insecure cache should still be checked even if the insecure part of
-  // the dns client is disabled.
-  ResolveHostResponseHelper response_insecure_cached(resolver_->CreateRequest(
-      HostPortPair("insecure_automatic_cached", 80), NetLogWithSource(),
-      base::nullopt, request_context_.get(), host_cache_.get()));
-  EXPECT_THAT(response_insecure_cached.result_error(), IsOk());
-  EXPECT_THAT(response_insecure_cached.request()
-                  ->GetAddressResults()
-                  .value()
-                  .endpoints(),
-              testing::ElementsAre(kExpectedInsecureIP));
-}
-
 TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure) {
   proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
   set_allow_fallback_to_proctask(true);
 
-  ChangeDnsConfig(CreateValidDnsConfig());
+  MockDnsClientRuleList rules;
+  rules.emplace_back("secure", dns_protocol::kTypeA, true /* secure */,
+                     MockDnsClientRule::Result(MockDnsClientRule::OK),
+                     false /* delay */);
+  rules.emplace_back("secure", dns_protocol::kTypeAAAA, true /* secure */,
+                     MockDnsClientRule::Result(MockDnsClientRule::OK),
+                     false /* delay */);
+  UseMockDnsClient(CreateValidDnsConfig(), std::move(rules));
   DnsConfigOverrides overrides;
   overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
   resolver_->SetDnsConfigOverrides(overrides);
@@ -5066,30 +4908,6 @@
   EXPECT_THAT(response_proc.result_error(), IsError(ERR_NAME_NOT_RESOLVED));
 }
 
-TEST_F(HostResolverManagerDnsTest, SecureDnsMode_Secure_InsecureAsyncDisabled) {
-  proc_->AddRuleForAllFamilies("nx_succeed", "192.168.1.100");
-  set_allow_fallback_to_proctask(true);
-  resolver_->SetInsecureDnsClientEnabled(false);
-
-  ChangeDnsConfig(CreateValidDnsConfig());
-  DnsConfigOverrides overrides;
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::SECURE;
-  resolver_->SetDnsConfigOverrides(overrides);
-  const std::pair<const HostCache::Key, HostCache::Entry>* cache_result;
-
-  // The secure part of the dns client should be enabled.
-  ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
-      HostPortPair("secure", 80), NetLogWithSource(), base::nullopt,
-      request_context_.get(), host_cache_.get()));
-  ASSERT_THAT(response_secure.result_error(), IsOk());
-  HostCache::Key secure_key =
-      HostCache::Key("secure", DnsQueryType::UNSPECIFIED,
-                     0 /* host_resolver_flags */, HostResolverSource::ANY);
-  secure_key.secure = true;
-  cache_result = GetCacheHit(secure_key);
-  EXPECT_TRUE(!!cache_result);
-}
-
 // Test the case where only a single transaction slot is available.
 TEST_F(HostResolverManagerDnsTest, SerialResolver) {
   CreateSerialResolver();
@@ -5272,10 +5090,10 @@
   EXPECT_THAT(response.result_error(), IsOk());
 }
 
-// Tests the case that the insecure part of the DnsClient is automatically
-// disabled due to failures while there are active DnsTasks.
+// Tests the case that DnsClient is automatically disabled due to failures
+// while there are active DnsTasks.
 TEST_F(HostResolverManagerDnsTest,
-       AutomaticallyDisableInsecureDnsClientWithPendingRequests) {
+       AutomaticallyDisableDnsClientWithPendingRequests) {
   // Trying different limits is important for this test:  Different limits
   // result in different behavior when aborting in-progress DnsTasks.  Having
   // a DnsTask that has one job active and one in the queue when another job
@@ -5288,10 +5106,10 @@
 
     ChangeDnsConfig(CreateValidDnsConfig());
 
-    // Queue up enough failures to disable insecure DnsTasks.  These will all
-    // fall back to ProcTasks, and succeed there.
+    // Queue up enough failures to disable DnsTasks.  These will all fall back
+    // to ProcTasks, and succeed there.
     std::vector<std::unique_ptr<ResolveHostResponseHelper>> failure_responses;
-    for (unsigned i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
+    for (unsigned i = 0u; i < maximum_dns_failures(); ++i) {
       std::string host = base::StringPrintf("nx%u", i);
       proc_->AddRuleForAllFamilies(host, "192.168.0.1");
       failure_responses.emplace_back(
@@ -5301,8 +5119,8 @@
       EXPECT_FALSE(failure_responses[i]->complete());
     }
 
-    // These requests should all bypass insecure DnsTasks, due to the above
-    // failures, so should end up using ProcTasks.
+    // These requests should all bypass DnsTasks, due to the above failures,
+    // so should end up using ProcTasks.
     proc_->AddRuleForAllFamilies("slow_ok1", "192.168.0.2");
     ResolveHostResponseHelper response0(resolver_->CreateRequest(
         HostPortPair("slow_ok1", 80), NetLogWithSource(), base::nullopt,
@@ -5337,18 +5155,9 @@
         request_context_.get(), host_cache_.get()));
     EXPECT_FALSE(response_system.complete());
 
-    // Secure DnsTasks should not be affected.
-    HostResolver::ResolveHostParameters secure_parameters;
-    secure_parameters.secure_dns_mode_override =
-        DnsConfig::SecureDnsMode::AUTOMATIC;
-    ResolveHostResponseHelper response_secure(resolver_->CreateRequest(
-        HostPortPair("automatic", 80), NetLogWithSource(), secure_parameters,
-        request_context_.get(), host_cache_.get()));
-    EXPECT_FALSE(response_secure.complete());
+    proc_->SignalMultiple(maximum_dns_failures() + 5);
 
-    proc_->SignalMultiple(maximum_insecure_dns_task_failures() + 6);
-
-    for (size_t i = 0u; i < maximum_insecure_dns_task_failures(); ++i) {
+    for (size_t i = 0u; i < maximum_dns_failures(); ++i) {
       EXPECT_THAT(failure_responses[i]->result_error(), IsOk());
       EXPECT_THAT(failure_responses[i]
                       ->request()
@@ -5375,8 +5184,6 @@
     EXPECT_THAT(
         response_system.request()->GetAddressResults().value().endpoints(),
         testing::ElementsAre(CreateExpected("192.168.0.5", 80)));
-
-    EXPECT_THAT(response_secure.result_error(), IsOk());
   }
 }
 
@@ -5421,7 +5228,7 @@
 
   // Clear DnsClient.  The two in-progress jobs should fall back to a ProcTask,
   // and the next one should be started with a ProcTask.
-  resolver_->SetInsecureDnsClientEnabled(false);
+  resolver_->SetDnsClientEnabled(false);
 
   // All three in-progress requests should now be running a ProcTask.
   EXPECT_EQ(3u, num_running_dispatcher_jobs());
@@ -5442,7 +5249,7 @@
 // DnsClient disabled should result in an error.
 TEST_F(HostResolverManagerDnsTest, DnsCallsWithDisabledDnsClient) {
   ChangeDnsConfig(CreateValidDnsConfig());
-  resolver_->SetInsecureDnsClientEnabled(false);
+  resolver_->SetDnsClientEnabled(false);
 
   HostResolver::ResolveHostParameters params;
   params.source = HostResolverSource::DNS;
@@ -5450,13 +5257,13 @@
       HostPortPair("host", 80), NetLogWithSource(), params,
       request_context_.get(), host_cache_.get()));
 
-  EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
+  EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
 }
 
 TEST_F(HostResolverManagerDnsTest,
        DnsCallsWithDisabledDnsClient_DisabledAtConstruction) {
   HostResolver::ManagerOptions options = DefaultOptions();
-  options.insecure_dns_client_enabled = false;
+  options.dns_client_enabled = false;
   CreateResolverWithOptionsAndParams(std::move(options),
                                      DefaultParams(proc_.get()),
                                      true /* ipv6_reachable */);
@@ -5468,7 +5275,7 @@
       HostPortPair("host", 80), NetLogWithSource(), params,
       request_context_.get(), host_cache_.get()));
 
-  EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
+  EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
 }
 
 // Same as DnsClient disabled, requests with source=DNS and no usable DnsConfig
@@ -5482,7 +5289,7 @@
       HostPortPair("host", 80), NetLogWithSource(), params,
       request_context_.get(), host_cache_.get()));
 
-  EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
+  EXPECT_THAT(response.result_error(), IsError(ERR_FAILED));
 }
 
 TEST_F(HostResolverManagerDnsTest, NoCheckIpv6OnWifi) {
@@ -5934,7 +5741,6 @@
   DnsConfigOverrides overrides;
   overrides.dns_over_https_servers.emplace(
       {DnsConfig::DnsOverHttpsServerConfig(server, true)});
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
   resolver_->SetDnsConfigOverrides(overrides);
   base::DictionaryValue* config;
 
@@ -5957,8 +5763,6 @@
   std::string server_template;
   EXPECT_TRUE(server_method->GetString("server_template", &server_template));
   EXPECT_EQ(server_template, server);
-  EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
-            static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
 }
 
 TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeConfig) {
@@ -5969,7 +5773,6 @@
   DnsConfigOverrides overrides;
   overrides.dns_over_https_servers.emplace(
       {DnsConfig::DnsOverHttpsServerConfig(server, true)});
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
   resolver_->SetDnsConfigOverrides(overrides);
 
   notifier.mock_network_change_notifier()->SetConnectionType(
@@ -5996,8 +5799,6 @@
   std::string server_template;
   EXPECT_TRUE(server_method->GetString("server_template", &server_template));
   EXPECT_EQ(server_template, server);
-  EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
-            static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
 }
 
 TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerBeforeClient) {
@@ -6008,7 +5809,6 @@
   DnsConfigOverrides overrides;
   overrides.dns_over_https_servers.emplace(
       {DnsConfig::DnsOverHttpsServerConfig(server, true)});
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
   resolver_->SetDnsConfigOverrides(overrides);
 
   notifier.mock_network_change_notifier()->SetConnectionType(
@@ -6035,8 +5835,6 @@
   std::string server_template;
   EXPECT_TRUE(server_method->GetString("server_template", &server_template));
   EXPECT_EQ(server_template, server);
-  EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
-            static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
 }
 
 TEST_F(HostResolverManagerDnsTest, AddDnsOverHttpsServerAndThenRemove) {
@@ -6047,7 +5845,6 @@
   DnsConfigOverrides overrides;
   overrides.dns_over_https_servers.emplace(
       {DnsConfig::DnsOverHttpsServerConfig(server, true)});
-  overrides.secure_dns_mode = DnsConfig::SecureDnsMode::AUTOMATIC;
   resolver_->SetDnsConfigOverrides(overrides);
 
   notifier.mock_network_change_notifier()->SetConnectionType(
@@ -6076,8 +5873,6 @@
   std::string server_template;
   EXPECT_TRUE(server_method->GetString("server_template", &server_template));
   EXPECT_EQ(server_template, server);
-  EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
-            static_cast<int>(DnsConfig::SecureDnsMode::AUTOMATIC));
 
   resolver_->SetDnsConfigOverrides(DnsConfigOverrides());
   value = resolver_->GetDnsConfigAsValue();
@@ -6090,8 +5885,6 @@
   if (!doh_servers)
     return;
   EXPECT_EQ(doh_servers->GetSize(), 0u);
-  EXPECT_EQ(config->FindKey("secure_dns_mode")->GetInt(),
-            static_cast<int>(DnsConfig::SecureDnsMode::OFF));
 }
 
 TEST_F(HostResolverManagerDnsTest, SetDnsConfigOverrides) {
@@ -6424,7 +6217,7 @@
   }
 
   // Test system resolver is detected.
-  resolver_->SetInsecureDnsClientEnabled(false);
+  resolver_->SetDnsClientEnabled(false);
   ChangeDnsConfig(CreateValidDnsConfig());
   EXPECT_EQ(resolver_->mode_for_histogram_,
             HostResolverManager::MODE_FOR_HISTOGRAM_SYSTEM);
@@ -6481,20 +6274,6 @@
                                        bar_records.begin(), bar_records.end()));
 }
 
-TEST_F(HostResolverManagerDnsTest, TxtQuery_InvalidConfig) {
-  set_allow_fallback_to_proctask(false);
-  // Set empty DnsConfig.
-  ChangeDnsConfig(DnsConfig());
-
-  HostResolver::ResolveHostParameters parameters;
-  parameters.dns_query_type = DnsQueryType::TXT;
-
-  ResolveHostResponseHelper response(resolver_->CreateRequest(
-      HostPortPair("host", 108), NetLogWithSource(), parameters,
-      request_context_.get(), host_cache_.get()));
-  EXPECT_THAT(response.result_error(), IsError(ERR_DNS_CACHE_MISS));
-}
-
 TEST_F(HostResolverManagerDnsTest, TxtQuery_NonexistentDomain) {
   // Setup fallback to confirm it is not used for non-address results.
   set_allow_fallback_to_proctask(true);
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index d0b0d74..13a2ff9 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -2867,6 +2867,22 @@
               static_cast<int>(ceil(inset_sizes.bottom * multiplier)));
 }
 
+base::Optional<size_t> PDFiumEngine::GetAdjacentPageIndexForTwoUpView(
+    size_t page_index,
+    size_t num_of_pages) const {
+  DCHECK_LT(page_index, num_of_pages);
+
+  if (!two_up_view_)
+    return base::nullopt;
+
+  int adjacent_page_offset = page_index % 2 ? -1 : 1;
+  size_t adjacent_page_index = page_index + adjacent_page_offset;
+  if (adjacent_page_index >= num_of_pages)
+    return base::nullopt;
+
+  return adjacent_page_index;
+}
+
 int PDFiumEngine::StartPaint(int page_index, const pp::Rect& dirty) {
   // For the first time we hit paint, do nothing and just record the paint for
   // the next callback.  This keeps the UI responsive in case the user is doing
@@ -2962,11 +2978,16 @@
   const pp::Rect& dirty_in_screen =
       progressive_paints_[progressive_index].rect();
   FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap();
+  draw_utils::PageInsetSizes inset_sizes =
+      GetInsetSizes(page_index, pages_.size());
 
   pp::Rect page_rect = pages_[page_index]->rect();
-  if (page_rect.x() > 0) {
-    pp::Rect left = draw_utils::GetLeftFillRect(page_rect, kSingleViewInsets,
-                                                kBottomSeparator);
+  if (page_rect.x() > 0 && (!two_up_view_ || page_index % 2 == 0)) {
+    // If in two-up view, only need to draw the left empty space for left pages
+    // since the gap between the left and right page will be drawn by the left
+    // page.
+    pp::Rect left =
+        draw_utils::GetLeftFillRect(page_rect, inset_sizes, kBottomSeparator);
     left = GetScreenRect(left).Intersect(dirty_in_screen);
 
     FPDFBitmap_FillRect(bitmap, left.x() - dirty_in_screen.x(),
@@ -2976,7 +2997,7 @@
 
   if (page_rect.right() < document_size_.width()) {
     pp::Rect right = draw_utils::GetRightFillRect(
-        page_rect, kSingleViewInsets, document_size_.width(), kBottomSeparator);
+        page_rect, inset_sizes, document_size_.width(), kBottomSeparator);
     right = GetScreenRect(right).Intersect(dirty_in_screen);
 
     FPDFBitmap_FillRect(bitmap, right.x() - dirty_in_screen.x(),
@@ -2984,9 +3005,8 @@
                         right.height(), client_->GetBackgroundColor());
   }
 
-  // Paint separator.
-  pp::Rect bottom = draw_utils::GetBottomFillRect(page_rect, kSingleViewInsets,
-                                                  kBottomSeparator);
+  pp::Rect bottom =
+      draw_utils::GetBottomFillRect(page_rect, inset_sizes, kBottomSeparator);
   bottom = GetScreenRect(bottom).Intersect(dirty_in_screen);
 
   FPDFBitmap_FillRect(bitmap, bottom.x() - dirty_in_screen.x(),
@@ -3139,9 +3159,20 @@
 
 pp::Rect PDFiumEngine::GetPageScreenRect(int page_index) const {
   const pp::Rect& page_rect = pages_[page_index]->rect();
+  draw_utils::PageInsetSizes inset_sizes =
+      GetInsetSizes(page_index, pages_.size());
+
+  int max_page_height = page_rect.height();
+  base::Optional<size_t> adjacent_page_index =
+      GetAdjacentPageIndexForTwoUpView(page_index, pages_.size());
+  if (adjacent_page_index.has_value()) {
+    max_page_height = std::max(
+        max_page_height, pages_[adjacent_page_index.value()]->rect().height());
+  }
+
   return GetScreenRect(draw_utils::GetSurroundingRect(
-      page_rect.y(), page_rect.height(), kSingleViewInsets,
-      document_size_.width(), kBottomSeparator));
+      page_rect.y(), max_page_height, inset_sizes, document_size_.width(),
+      kBottomSeparator));
 }
 
 pp::Rect PDFiumEngine::GetScreenRect(const pp::Rect& rect) const {
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index 5aa32c2..6e32008 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -289,6 +289,13 @@
                  double multiplier,
                  pp::Rect* rect) const;
 
+  // If |two_up_view_| is true, returns the index of the page beside
+  // |page_index| page. Returns base::nullopt if there is no adjacent page or
+  // if |two_up_view_| is false.
+  base::Optional<size_t> GetAdjacentPageIndexForTwoUpView(
+      size_t page_index,
+      size_t num_of_pages) const;
+
   void GetAllScreenRectsUnion(const std::vector<PDFiumRange>& rect_range,
                               const pp::Point& offset_point,
                               std::vector<pp::Rect>* rect_vector) const;
diff --git a/remoting/OWNERS b/remoting/OWNERS
index f253faf..b0284f6 100644
--- a/remoting/OWNERS
+++ b/remoting/OWNERS
@@ -8,3 +8,4 @@
 per-file *.xtb=file://tools/translation/TRANSLATION_OWNERS
 
 # COMPONENT: Services>Chromoting
+# TEAM: chromoting-team@google.com
diff --git a/sandbox/win/src/process_mitigations_unittest.cc b/sandbox/win/src/process_mitigations_unittest.cc
index 244068c..2062f39 100644
--- a/sandbox/win/src/process_mitigations_unittest.cc
+++ b/sandbox/win/src/process_mitigations_unittest.cc
@@ -80,7 +80,7 @@
 //
 // Trigger test child process (with or without mitigation enabled).
 //------------------------------------------------------------------------------
-void TestWin10MsSigned(bool expect_success,
+void TestWin10MsSigned(int expected,
                        bool enable_mitigation,
                        bool delayed,
                        bool use_ms_signed_binary,
@@ -135,11 +135,9 @@
   test += L"\"";
 
   // Note: ERROR_INVALID_IMAGE_HASH is being displayed in a system pop-up when
-  //       the DLL load is attempted, but the value returned from the test
-  //       process itself is SBOX_TEST_FAILED.
-  EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
-                            : sandbox::SBOX_TEST_FAILED),
-            runner.RunTest(test.c_str()));
+  //       the DLL load is attempted for delayed mitigations, but the value
+  //       returned from the test process itself is SBOX_TEST_FAILED.
+  EXPECT_EQ(expected, runner.RunTest(test.c_str()));
 }
 
 }  // namespace
@@ -803,7 +801,7 @@
 
   ScopedTestMutex mutex(hooking_dll::g_hooking_dll_mutex);
 
-  TestWin10MsSigned(true /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_SUCCEEDED /* expected */,
                     false /* enable_mitigation */,
                     false /* delayed */,
                     false /* use_ms_signed_binary */,
@@ -819,7 +817,7 @@
 
   ScopedTestMutex mutex(hooking_dll::g_hooking_dll_mutex);
 
-  TestWin10MsSigned(false /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_FAILED /* expected */,
                     true /* enable_mitigation */,
                     true /* delayed */,
                     false /* use_ms_signed_binary */,
@@ -838,14 +836,14 @@
   // Expect success; Enable mitigation; Use non MS-signed binary.
 #if defined(COMPONENT_BUILD)
   // In a component build, add the directory to the allowed list.
-  TestWin10MsSigned(true /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_SUCCEEDED /* expected */,
                     true /* enable_mitigation */,
                     false /* delayed */,
                     false /* use_ms_signed_binary */,
                     true /* add_dll_permission */,
                     true /* add_directory_permission */);
 #else
-  TestWin10MsSigned(true /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_SUCCEEDED /* expected */,
                     true /* enable_mitigation */,
                     false /* delayed */,
                     false /* use_ms_signed_binary */,
@@ -854,6 +852,32 @@
 #endif  // defined(COMPONENT_BUILD)
 }
 
+// This test validates that setting the MITIGATION_FORCE_MS_SIGNED_BINS
+// mitigation pre-load prevents the loading of an unsigned DLL.
+TEST(ProcessMitigationsTest, CheckWin10MsSigned_FailurePreSpawn) {
+  if (base::win::GetVersion() < base::win::Version::WIN10_TH2)
+    return;
+
+  ScopedTestMutex mutex(hooking_dll::g_hooking_dll_mutex);
+
+#if defined(COMPONENT_BUILD)
+  // In a component build, the executable will fail to start-up because
+  // imports e.g. base.dll cannot be resolved.
+  int expected = STATUS_INVALID_IMAGE_HASH;
+#else
+  // In a non-component build, the process will start, but the unsigned
+  // DLL will fail to load inside the test itself.
+  int expected = sandbox::SBOX_TEST_FAILED;
+#endif
+
+  TestWin10MsSigned(expected /* expected */,
+                    true /* enable_mitigation */,
+                    false /* delayed */,
+                    false /* use_ms_signed_binary */,
+                    false /* add_dll_permission */,
+                    false /* add_directory_permission */);
+}
+
 // This test validates that we can load a signed Microsoft DLL if the
 // MITIGATION_FORCE_MS_SIGNED_BINS mitigation is NOT set.  Very basic
 // sanity test.
@@ -863,7 +887,7 @@
 
   ScopedTestMutex mutex(hooking_dll::g_hooking_dll_mutex);
 
-  TestWin10MsSigned(true /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_SUCCEEDED /* expected */,
                     false /* enable_mitigation */,
                     false /* delayed */,
                     true /* use_ms_signed_binary */,
@@ -879,7 +903,7 @@
 
   ScopedTestMutex mutex(hooking_dll::g_hooking_dll_mutex);
 
-  TestWin10MsSigned(true /* expect_success */,
+  TestWin10MsSigned(sandbox::SBOX_TEST_SUCCEEDED /* expected */,
                     true /* enable_mitigation */,
                     true /* delayed */,
                     true /* use_ms_signed_binary */,
diff --git a/services/OWNERS b/services/OWNERS
index 305da08..1bcc466 100644
--- a/services/OWNERS
+++ b/services/OWNERS
@@ -2,3 +2,4 @@
 jam@chromium.org
 rockot@google.com
 sky@chromium.org
+# COMPONENT: Internals>Services
diff --git a/services/content/OWNERS b/services/content/OWNERS
index eb504e3..672cb65 100644
--- a/services/content/OWNERS
+++ b/services/content/OWNERS
@@ -2,3 +2,4 @@
 clamy@chromium.org
 jam@chromium.org
 rockot@google.com
+# COMPONENT: Internals>Services>Content
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc
index a87fc24..42296b9 100644
--- a/services/network/host_resolver_unittest.cc
+++ b/services/network/host_resolver_unittest.cc
@@ -1177,7 +1177,6 @@
       net::HostResolver::CreateStandaloneContextResolver(&net_log);
   inner_resolver->GetManagerForTesting()->SetDnsClientForTesting(
       std::move(dns_client));
-  inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(true);
   inner_resolver->SetBaseDnsConfigForTesting(CreateValidDnsConfig());
 
   HostResolver resolver(inner_resolver.get(), &net_log);
@@ -1217,7 +1216,6 @@
       net::HostResolver::CreateStandaloneContextResolver(&net_log);
   inner_resolver->GetManagerForTesting()->SetDnsClientForTesting(
       std::move(dns_client));
-  inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(true);
   inner_resolver->SetBaseDnsConfigForTesting(CreateValidDnsConfig());
 
   HostResolver resolver(inner_resolver.get(), &net_log);
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index ded9272..0e3fb93f 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -1324,7 +1324,7 @@
     // different overrides.  But since this is only used for special cases for
     // now, much easier to create entirely separate net::HostResolver instances.
     net::HostResolver::ManagerOptions options;
-    options.insecure_dns_client_enabled = true;
+    options.dns_client_enabled = true;
     options.dns_config_overrides = config_overrides.value();
     private_internal_resolver =
         network_service_->host_resolver_factory()->CreateStandaloneResolver(
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index c80508bb..c9fc62e 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -31,6 +31,7 @@
 #include "net/cert/cert_database.h"
 #include "net/cert/ct_log_response_parser.h"
 #include "net/cert/signed_tree_head.h"
+#include "net/dns/dns_config.h"
 #include "net/dns/dns_config_overrides.h"
 #include "net/dns/host_resolver.h"
 #include "net/dns/host_resolver_manager.h"
@@ -450,16 +451,17 @@
 }
 
 void NetworkService::ConfigureStubHostResolver(
-    bool insecure_dns_client_enabled,
-    net::DnsConfig::SecureDnsMode secure_dns_mode,
+    bool stub_resolver_enabled,
     base::Optional<std::vector<mojom::DnsOverHttpsServerPtr>>
         dns_over_https_servers) {
+  // If the stub resolver is not enabled, |dns_over_https_servers| has no
+  // effect.
+  DCHECK(stub_resolver_enabled || !dns_over_https_servers);
   DCHECK(!dns_over_https_servers || !dns_over_https_servers->empty());
 
-  // Enable or disable the insecure part of DnsClient. "DnsClient" is the class
-  // that implements the stub resolver.
-  host_resolver_manager_->SetInsecureDnsClientEnabled(
-      insecure_dns_client_enabled);
+  // Enable or disable the stub resolver, as needed. "DnsClient" is class that
+  // implements the stub resolver.
+  host_resolver_manager_->SetDnsClientEnabled(stub_resolver_enabled);
 
   // Configure DNS over HTTPS.
   if (!dns_over_https_servers || dns_over_https_servers.value().empty()) {
@@ -473,7 +475,8 @@
     overrides.dns_over_https_servers.value().emplace_back(
         doh_server->server_template, doh_server->use_post);
   }
-  overrides.secure_dns_mode = secure_dns_mode;
+  // TODO(dalyk): Allow the secure dns mode to be set.
+  overrides.secure_dns_mode = net::DnsConfig::SecureDnsMode::AUTOMATIC;
   host_resolver_manager_->SetDnsConfigOverrides(overrides);
 }
 
diff --git a/services/network/network_service.h b/services/network/network_service.h
index 633cebdd..5ce34457 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -23,7 +23,6 @@
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "net/dns/dns_config.h"
 #include "net/http/http_auth_preferences.h"
 #include "net/log/net_log.h"
 #include "net/log/trace_net_log_observer.h"
@@ -143,8 +142,7 @@
   void CreateNetworkContext(mojom::NetworkContextRequest request,
                             mojom::NetworkContextParamsPtr params) override;
   void ConfigureStubHostResolver(
-      bool insecure_dns_client_enabled,
-      net::DnsConfig::SecureDnsMode secure_dns_mode,
+      bool stub_resolver_enabled,
       base::Optional<std::vector<mojom::DnsOverHttpsServerPtr>>
           dns_over_https_servers) override;
   void DisableQuic() override;
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 2f1ac99..0fbb0e9 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -22,7 +22,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "net/base/escape.h"
-#include "net/base/ip_endpoint.h"
 #include "net/base/mock_network_change_notifier.h"
 #include "net/base/url_util.h"
 #include "net/dns/dns_config_service.h"
@@ -444,55 +443,17 @@
 #if !defined(OS_IOS)
 
 TEST_F(NetworkServiceTest, DnsClientEnableDisable) {
-  // Set valid DnsConfig.
-  net::DnsConfig config;
-  config.nameservers.push_back(net::IPEndPoint());
-  service()->host_resolver_manager()->SetBaseDnsConfigForTesting(config);
-
+  // HostResolver::GetDnsConfigAsValue() returns nullptr if the stub resolver is
+  // disabled.
+  EXPECT_FALSE(service()->host_resolver_manager()->GetDnsConfigAsValue());
   service()->ConfigureStubHostResolver(
-      true /* insecure_dns_client_enabled */,
-      net::DnsConfig::SecureDnsMode::OFF,
+      true /* stub_resolver_enabled */,
       base::nullopt /* dns_over_https_servers */);
-  EXPECT_TRUE(service()
-                  ->host_resolver_manager()
-                  ->GetInsecureDnsClientEnabledForTesting());
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF,
-            service()->host_resolver_manager()->GetSecureDnsModeForTesting());
-
+  EXPECT_TRUE(service()->host_resolver_manager()->GetDnsConfigAsValue());
   service()->ConfigureStubHostResolver(
-      false /* insecure_dns_client_enabled */,
-      net::DnsConfig::SecureDnsMode::OFF,
+      false /* stub_resolver_enabled */,
       base::nullopt /* dns_over_https_servers */);
-  EXPECT_FALSE(service()
-                   ->host_resolver_manager()
-                   ->GetInsecureDnsClientEnabledForTesting());
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF,
-            service()->host_resolver_manager()->GetSecureDnsModeForTesting());
-
-  service()->ConfigureStubHostResolver(
-      false /* insecure_dns_client_enabled */,
-      net::DnsConfig::SecureDnsMode::AUTOMATIC,
-      base::nullopt /* dns_over_https_servers */);
-  EXPECT_FALSE(service()
-                   ->host_resolver_manager()
-                   ->GetInsecureDnsClientEnabledForTesting());
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::OFF,
-            service()->host_resolver_manager()->GetSecureDnsModeForTesting());
-
-  std::vector<mojom::DnsOverHttpsServerPtr> dns_over_https_servers_ptr;
-  mojom::DnsOverHttpsServerPtr dns_over_https_server =
-      mojom::DnsOverHttpsServer::New();
-  dns_over_https_server->server_template = "https://foo/";
-  dns_over_https_server->use_post = true;
-  dns_over_https_servers_ptr.emplace_back(std::move(dns_over_https_server));
-  service()->ConfigureStubHostResolver(false /* insecure_dns_client_enabled */,
-                                       net::DnsConfig::SecureDnsMode::AUTOMATIC,
-                                       std::move(dns_over_https_servers_ptr));
-  EXPECT_FALSE(service()
-                   ->host_resolver_manager()
-                   ->GetInsecureDnsClientEnabledForTesting());
-  EXPECT_EQ(net::DnsConfig::SecureDnsMode::AUTOMATIC,
-            service()->host_resolver_manager()->GetSecureDnsModeForTesting());
+  EXPECT_FALSE(service()->host_resolver_manager()->GetDnsConfigAsValue());
 }
 
 TEST_F(NetworkServiceTest, DnsOverHttpsEnableDisable) {
@@ -503,6 +464,10 @@
   const std::string kServer3 = "https://grapefruit/resolver/query{?dns}";
   const bool kServer3UsePost = false;
 
+  // HostResolver::GetDnsClientForTesting() returns nullptr if the stub resolver
+  // is disabled.
+  EXPECT_FALSE(service()->host_resolver_manager()->GetDnsConfigAsValue());
+
   // Create the primary NetworkContext before enabling DNS over HTTPS.
   mojom::NetworkContextPtr network_context;
   mojom::NetworkContextParamsPtr context_params = CreateContextParams();
@@ -520,8 +485,7 @@
   dns_over_https_server->use_post = kServer1UsePost;
   dns_over_https_servers_ptr.emplace_back(std::move(dns_over_https_server));
 
-  service()->ConfigureStubHostResolver(false /* insecure_dns_client_enabled */,
-                                       net::DnsConfig::SecureDnsMode::AUTOMATIC,
+  service()->ConfigureStubHostResolver(true /* stub_resolver_enabled */,
                                        std::move(dns_over_https_servers_ptr));
   EXPECT_TRUE(service()->host_resolver_manager()->GetDnsConfigAsValue());
   const auto* dns_over_https_servers =
@@ -544,8 +508,7 @@
   dns_over_https_server->use_post = kServer3UsePost;
   dns_over_https_servers_ptr.emplace_back(std::move(dns_over_https_server));
 
-  service()->ConfigureStubHostResolver(true /* insecure_dns_client_enabled */,
-                                       net::DnsConfig::SecureDnsMode::SECURE,
+  service()->ConfigureStubHostResolver(true /* stub_resolver_enabled */,
                                        std::move(dns_over_https_servers_ptr));
   EXPECT_TRUE(service()->host_resolver_manager()->GetDnsConfigAsValue());
   dns_over_https_servers =
diff --git a/services/network/public/cpp/host_resolver.typemap b/services/network/public/cpp/host_resolver.typemap
index 77691a20..20cb2428 100644
--- a/services/network/public/cpp/host_resolver.typemap
+++ b/services/network/public/cpp/host_resolver.typemap
@@ -1,10 +1,9 @@
 # Copyright 2018 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
+# found in the LICENSE file.

 
 mojom = "//services/network/public/mojom/host_resolver.mojom"
 public_headers = [
-  "//net/dns/dns_config.h",
   "//net/dns/dns_config_overrides.h",
   "//net/dns/host_resolver.h",
   "//net/dns/host_resolver_source.h",
@@ -23,5 +22,4 @@
   "network.mojom.DnsQueryType=net::DnsQueryType",
   "network.mojom.ResolveHostParameters.Source=net::HostResolverSource",
   "network.mojom.MdnsListenClient.UpdateType=net::HostResolver::MdnsListener::Delegate::UpdateType",
-  "network.mojom.SecureDnsMode=net::DnsConfig::SecureDnsMode",
 ]
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.cc b/services/network/public/cpp/host_resolver_mojom_traits.cc
index 3796681..0192278 100644
--- a/services/network/public/cpp/host_resolver_mojom_traits.cc
+++ b/services/network/public/cpp/host_resolver_mojom_traits.cc
@@ -373,38 +373,4 @@
   }
 }
 
-// static
-network::mojom::SecureDnsMode
-EnumTraits<network::mojom::SecureDnsMode, net::DnsConfig::SecureDnsMode>::
-    ToMojom(net::DnsConfig::SecureDnsMode secure_dns_mode) {
-  switch (secure_dns_mode) {
-    case net::DnsConfig::SecureDnsMode::OFF:
-      return network::mojom::SecureDnsMode::OFF;
-    case net::DnsConfig::SecureDnsMode::AUTOMATIC:
-      return network::mojom::SecureDnsMode::AUTOMATIC;
-    case net::DnsConfig::SecureDnsMode::SECURE:
-      return network::mojom::SecureDnsMode::SECURE;
-  }
-  NOTREACHED();
-  return network::mojom::SecureDnsMode::OFF;
-}
-
-// static
-bool EnumTraits<network::mojom::SecureDnsMode, net::DnsConfig::SecureDnsMode>::
-    FromMojom(network::mojom::SecureDnsMode in,
-              net::DnsConfig::SecureDnsMode* out) {
-  switch (in) {
-    case network::mojom::SecureDnsMode::OFF:
-      *out = net::DnsConfig::SecureDnsMode::OFF;
-      return true;
-    case network::mojom::SecureDnsMode::AUTOMATIC:
-      *out = net::DnsConfig::SecureDnsMode::AUTOMATIC;
-      return true;
-    case network::mojom::SecureDnsMode::SECURE:
-      *out = net::DnsConfig::SecureDnsMode::SECURE;
-      return true;
-  }
-  return false;
-}
-
 }  // namespace mojo
diff --git a/services/network/public/cpp/host_resolver_mojom_traits.h b/services/network/public/cpp/host_resolver_mojom_traits.h
index b7e175b..b6c7ac44 100644
--- a/services/network/public/cpp/host_resolver_mojom_traits.h
+++ b/services/network/public/cpp/host_resolver_mojom_traits.h
@@ -17,7 +17,6 @@
 #include "net/base/address_family.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
-#include "net/dns/dns_config.h"
 #include "net/dns/dns_config_overrides.h"
 #include "net/dns/dns_hosts.h"
 #include "net/dns/host_resolver.h"
@@ -106,15 +105,6 @@
       net::HostResolver::MdnsListener::Delegate::UpdateType* output);
 };
 
-template <>
-struct EnumTraits<network::mojom::SecureDnsMode,
-                  net::DnsConfig::SecureDnsMode> {
-  static network::mojom::SecureDnsMode ToMojom(
-      net::DnsConfig::SecureDnsMode secure_dns_mode);
-  static bool FromMojom(network::mojom::SecureDnsMode in,
-                        net::DnsConfig::SecureDnsMode* out);
-};
-
 }  // namespace mojo
 
 #endif  // SERVICES_NETWORK_PUBLIC_CPP_HOST_RESOLVER_MOJOM_TRAITS_H_
diff --git a/services/network/public/mojom/host_resolver.mojom b/services/network/public/mojom/host_resolver.mojom
index fce8cc7..cd137d8e 100644
--- a/services/network/public/mojom/host_resolver.mojom
+++ b/services/network/public/mojom/host_resolver.mojom
@@ -40,13 +40,6 @@
   SECURE,
 };
 
-// This enum corresponds to DnsConfig::SecureDnsMode.
-enum SecureDnsMode {
-  OFF,
-  AUTOMATIC,
-  SECURE,
-};
-
 // Overridable DNS configuration values for host resolution. All fields default
 // to a non-overriding state where the relevant value will be used from system
 // DNS configuration.
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 7a426ab..c51da43 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -324,21 +324,19 @@
   // resolver.
   //
   // |dns_over_https_servers| is an optional list of DNS over HTTPS servers.
-  // DnsTransactions will by default follow the behavior of |secure_dns_mode|.
-  // In SECURE mode, only DoH lookups will be performed. In AUTOMATIC mode,
-  // DoH lookups to available servers will be performed first, and insecure
-  // lookups will be used as a fallback. In OFF mode, only insecure lookups will
-  // be performed. When insecure lookups are performed, they will be sent by
-  // the async resolver first if |insecure_dns_client_enabled| is true and
-  // then by the system resolver as a fallback.
+  // When populated, all DNS lookups will try to use DNS over HTTPS in the order
+  // the servers are provided in and will only fall back to using system
+  // settings if DNS over HTTPS fails. It is illegal to have a populated
+  // |dns_over_https_servers| when |stub_resolver_enabled| is false.
   //
   // DNS over HTTPS will use the primary NetworkContext, so can only be enabled
   // after the primary network context has been created. Other than that
   // limitation, this method can be called at any time to change DNS
   // configuration, though calling it will fail any DNS lookups that have
   // already been started.
-  ConfigureStubHostResolver(bool insecure_dns_client_enabled,
-                            SecureDnsMode secure_dns_mode,
+  //
+  // Both the stub resolver and DNS over HTTPS are disabled by default.
+  ConfigureStubHostResolver(bool stub_resolver_enabled,
                             array<DnsOverHttpsServer>? dns_over_https_servers);
 
   // Disables QUIC for the NetworkService. Affects all existing NetworkContexts,
diff --git a/services/resource_coordinator/memory_instrumentation/OWNERS b/services/resource_coordinator/memory_instrumentation/OWNERS
index ca595d79..62d73f2a 100644
--- a/services/resource_coordinator/memory_instrumentation/OWNERS
+++ b/services/resource_coordinator/memory_instrumentation/OWNERS
@@ -1,2 +1,3 @@
 hjd@chromium.org
 primiano@chromium.org
+# COMPONENT: Internals>Instrumentation>Memory
diff --git a/services/service_manager/sandbox/linux/bpf_ime_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_ime_policy_linux.cc
index a4b2609..374dfda 100644
--- a/services/service_manager/sandbox/linux/bpf_ime_policy_linux.cc
+++ b/services/service_manager/sandbox/linux/bpf_ime_policy_linux.cc
@@ -18,15 +18,18 @@
 
 namespace service_manager {
 
-ImeProcessPolicy::ImeProcessPolicy() = default;
+ImeProcessPolicy::ImeProcessPolicy() {}
 
-ImeProcessPolicy::~ImeProcessPolicy() = default;
+ImeProcessPolicy::~ImeProcessPolicy() {}
 
 ResultExpr ImeProcessPolicy::EvaluateSyscall(int sysno) const {
   switch (sysno) {
 #if defined(__NR_uname)
     case __NR_uname:
 #endif
+#if defined(__NR_clock_gettime)
+    case __NR_clock_gettime:
+#endif
       return Allow();
     default:
       auto* broker_process = SandboxLinux::GetInstance()->broker_process();
diff --git a/services/test/OWNERS b/services/test/OWNERS
new file mode 100644
index 0000000..eaf0589
--- /dev/null
+++ b/services/test/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>Services
diff --git a/services/test/echo/OWNERS b/services/test/echo/OWNERS
index e69de29..eaf0589 100644
--- a/services/test/echo/OWNERS
+++ b/services/test/echo/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: Internals>Services
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 0f22509..91f7469 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6787,7 +6787,7 @@
           "--browser=android-chromium",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer\"",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback\"",
           "--dont-restore-color-profile-after-test",
           "--refimg-cloud-storage-bucket",
           "chromium-gpu-archive/reference-images",
@@ -6804,7 +6804,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "pixel_skia_gold_test",
+        "name": "vulkan_pixel_skia_gold_test",
         "non_precommit_args": [
           "--upload-refimg-to-cloud-storage"
         ],
@@ -8598,6 +8598,59 @@
       },
       {
         "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback\"",
+          "--dont-restore-color-profile-after-test",
+          "--refimg-cloud-storage-bucket",
+          "chromium-gpu-archive/reference-images",
+          "--os-type",
+          "linux",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}",
+          "--use-skia-gold"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "vulkan_pixel_skia_gold_test",
+        "non_precommit_args": [
+          "--upload-refimg-to-cloud-storage"
+        ],
+        "precommit_args": [
+          "--download-refimg-from-cloud-storage",
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-19.0.2",
+              "os": "Ubuntu-19.04",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
           "webgl_conformance",
           "--show-stdout",
           "--browser=release",
@@ -9342,6 +9395,59 @@
       },
       {
         "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback\"",
+          "--dont-restore-color-profile-after-test",
+          "--refimg-cloud-storage-bucket",
+          "chromium-gpu-archive/reference-images",
+          "--os-type",
+          "linux",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}",
+          "--use-skia-gold"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "vulkan_pixel_skia_gold_test",
+        "non_precommit_args": [
+          "--upload-refimg-to-cloud-storage"
+        ],
+        "precommit_args": [
+          "--download-refimg-from-cloud-storage",
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-418.56",
+              "os": "Ubuntu-19.04",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
           "webgl_conformance",
           "--show-stdout",
           "--browser=release",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 9dc6f5f..56ae828a 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -7400,7 +7400,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7415,7 +7415,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 2765284..fa7dcdd 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -6157,7 +6157,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6175,7 +6175,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6193,7 +6193,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6211,7 +6211,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6229,7 +6229,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6247,7 +6247,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6265,7 +6265,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6283,7 +6283,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6301,7 +6301,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6319,7 +6319,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6337,7 +6337,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6355,7 +6355,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6374,7 +6374,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6392,7 +6392,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6410,7 +6410,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6428,7 +6428,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 31
@@ -6449,7 +6449,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 30
@@ -6471,7 +6471,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6489,7 +6489,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6508,7 +6508,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6526,7 +6526,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6544,7 +6544,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6562,7 +6562,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6580,7 +6580,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6598,7 +6598,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6616,7 +6616,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6634,7 +6634,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6652,7 +6652,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 5
@@ -6671,7 +6671,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6689,7 +6689,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 6
@@ -6710,7 +6710,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 4
@@ -6732,7 +6732,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6750,7 +6750,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6770,7 +6770,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6788,7 +6788,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6806,7 +6806,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6824,7 +6824,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6842,7 +6842,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6860,7 +6860,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6878,7 +6878,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6896,7 +6896,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6914,7 +6914,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6932,7 +6932,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6950,7 +6950,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6968,7 +6968,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -6986,7 +6986,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7004,7 +7004,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7022,7 +7022,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7040,7 +7040,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 3
@@ -7062,7 +7062,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7080,7 +7080,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7098,7 +7098,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7116,7 +7116,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7134,7 +7134,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7152,7 +7152,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7170,7 +7170,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7188,7 +7188,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7206,7 +7206,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7224,7 +7224,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7242,7 +7242,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7260,7 +7260,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7278,7 +7278,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7296,7 +7296,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7314,7 +7314,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7332,7 +7332,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7350,7 +7350,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7368,7 +7368,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 8
@@ -7388,7 +7388,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7406,7 +7406,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7424,7 +7424,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7442,7 +7442,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7460,7 +7460,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7478,7 +7478,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7496,7 +7496,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7514,7 +7514,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7532,7 +7532,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7550,7 +7550,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7568,7 +7568,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7586,7 +7586,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7604,7 +7604,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7622,7 +7622,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7640,7 +7640,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7658,7 +7658,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7676,7 +7676,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7694,7 +7694,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7712,7 +7712,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7730,7 +7730,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7748,7 +7748,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7766,7 +7766,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ],
           "shards": 2
@@ -7785,7 +7785,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7804,7 +7804,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7822,7 +7822,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7840,7 +7840,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7858,7 +7858,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7876,7 +7876,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
@@ -7894,7 +7894,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Ubuntu-14.04"
+              "os": "Ubuntu-16.04"
             }
           ]
         },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index bd07621..b6b9c009 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -3661,8 +3661,8 @@
     },
 
     'gpu_skia_renderer_vulkan_telemetry_tests': {
-      'pixel_skia': {
-        'name': 'pixel_skia_gold_test',
+      'vulkan_pixel_skia': {
+        'name': 'vulkan_pixel_skia_gold_test',
         'args': [
           '--dont-restore-color-profile-after-test',
           '--refimg-cloud-storage-bucket',
@@ -3674,7 +3674,7 @@
           '--test-machine-name',
           '${buildername}',
           '--use-skia-gold',
-          '--extra-browser-args="--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer"',
+          '--extra-browser-args="--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer --disable-software-compositing-fallback"',
         ],
         'non_precommit_args': [
           '--upload-refimg-to-cloud-storage',
@@ -5288,6 +5288,16 @@
       'gpu_swiftshader_gtests',
     ],
 
+    'gpu_fyi_linux_intel_and_nvidia_release_experimental_telemetry_tests': [
+      'gpu_common_and_optional_telemetry_tests',
+      'gpu_skia_renderer_vulkan_telemetry_tests',
+      'gpu_telemetry_tests',
+      'gpu_webgl2_conformance_gl_passthrough_telemetry_tests',
+      'gpu_webgl2_conformance_telemetry_tests',
+      'gpu_webgl_conformance_gl_passthrough_telemetry_tests',
+      'gpu_webgl_conformance_telemetry_tests',
+    ],
+
     'gpu_fyi_linux_intel_and_nvidia_release_telemetry_tests': [
       'gpu_common_and_optional_telemetry_tests',
       'gpu_telemetry_tests',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index d78e0cb..10f414ef 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2620,7 +2620,7 @@
         'test_suites': {
           'gtest_tests': 'gpu_fyi_linux_release_gtests',
           'isolated_scripts': 'gpu_blink_web_tests',
-          'gpu_telemetry_tests': 'gpu_fyi_linux_intel_and_nvidia_release_telemetry_tests',
+          'gpu_telemetry_tests': 'gpu_fyi_linux_intel_and_nvidia_release_experimental_telemetry_tests',
         }
       },
       'Linux FYI Experimental Release (NVIDIA)': {
@@ -2633,7 +2633,7 @@
         'test_suites': {
           'gtest_tests': 'gpu_fyi_linux_release_gtests',
           'isolated_scripts': 'gpu_blink_web_tests_and_angle_perf_isolated_scripts',
-          'gpu_telemetry_tests': 'gpu_fyi_linux_intel_and_nvidia_release_telemetry_tests',
+          'gpu_telemetry_tests': 'gpu_fyi_linux_intel_and_nvidia_release_experimental_telemetry_tests',
         },
       },
       'Linux FYI GPU TSAN Release': {
@@ -3414,7 +3414,7 @@
       },
       'linux-ozone-rel': {
         'mixins': [
-          'linux-trusty',
+          'linux-xenial',
         ],
         'additional_compile_targets': [
           'chrome',
@@ -3672,7 +3672,7 @@
       },
       'Linux Chromium OS ASan LSan Tests (1)': {
         'mixins': [
-          'linux-trusty',
+          'linux-xenial',
         ],
         'test_suites': {
           'gtest_tests': 'linux_chromeos_gtests',
diff --git a/third_party/Python-Markdown/OWNERS b/third_party/Python-Markdown/OWNERS
index 3fc266c..e14a3bdf 100644
--- a/third_party/Python-Markdown/OWNERS
+++ b/third_party/Python-Markdown/OWNERS
@@ -1,2 +1,3 @@
 dpranke@chromium.org
 nodir@chromium.org
+# COMPONENT: Tools
diff --git a/third_party/SPIRV-Tools/OWNERS b/third_party/SPIRV-Tools/OWNERS
index 6639d365..2d12ea2 100644
--- a/third_party/SPIRV-Tools/OWNERS
+++ b/third_party/SPIRV-Tools/OWNERS
@@ -3,3 +3,4 @@
 dsinclair@chromium.org
 
 # COMPONENT: Internals>GPU>Internals
+# TEAM: graphics-dev@chromium.org
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 05ee9b7..908067e 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -128,6 +128,7 @@
     "user_agent/user_agent_metadata.mojom",
     "v8_cache_options.mojom",
     "wake_lock/wake_lock.mojom",
+    "web_launch/web_launch.mojom",
     "webaudio/audio_context_manager.mojom",
     "webdatabase/web_database.mojom",
     "websockets/websocket_connector.mojom",
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 230e87a..296dee7 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2353,6 +2353,7 @@
   kSVGSMILDiscardElementParsed = 2968,
   kSVGSMILDiscardElementTriggered = 2969,
   kLinkHeaderStylesheet = 2970,
+  kV8PointerEvent_GetPredictedEvents_Method = 2971,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/mojom/web_launch/OWNERS b/third_party/blink/public/mojom/web_launch/OWNERS
new file mode 100644
index 0000000..cddf678
--- /dev/null
+++ b/third_party/blink/public/mojom/web_launch/OWNERS
@@ -0,0 +1,4 @@
+file://third_party/blink/renderer/modules/launch/OWNERS
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/web_launch/web_launch.mojom b/third_party/blink/public/mojom/web_launch/web_launch.mojom
new file mode 100644
index 0000000..0968a13
--- /dev/null
+++ b/third_party/blink/public/mojom/web_launch/web_launch.mojom
@@ -0,0 +1,21 @@
+// Copyright 2019 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.
+
+module blink.mojom;
+
+import "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom";
+import "url/mojom/url.mojom";
+
+// Interface for getting the cause of page loads to blink. This service lives
+// in blink and is used to implement the File Handling proposal:
+// https://github.com/WICG/file-handling/blob/master/explainer.md
+// TODO(harrisjay): Replace link to explainer with link to spec, when
+// available.
+//
+// An instance of this service is tied to a LocalFrame.
+interface WebLaunchService {
+  // Used to notify a frame that it was opened with |files|. This
+  // method is fire-and-forget.
+  SetLaunchFiles(array<NativeFileSystemEntry> files);
+};
\ No newline at end of file
diff --git a/third_party/blink/public/platform/web_time_range.h b/third_party/blink/public/platform/web_time_range.h
index 108d0c96..2c17f7c 100644
--- a/third_party/blink/public/platform/web_time_range.h
+++ b/third_party/blink/public/platform/web_time_range.h
@@ -35,15 +35,55 @@
 
 namespace blink {
 
-struct WebTimeRange {
+class WebTimeRange {
+ public:
   WebTimeRange() : start(0), end(0) {}
   WebTimeRange(double s, double e) : start(s), end(e) {}
 
   double start;
   double end;
+
+  inline bool IsPointInRange(double point) const {
+    return start <= point && point < end;
+  }
+
+  inline bool IsOverlappingRange(const WebTimeRange& range) const {
+    return IsPointInRange(range.start) || IsPointInRange(range.end) ||
+           range.IsPointInRange(start);
+  }
+
+  inline bool IsContiguousWithRange(const WebTimeRange& range) const {
+    return range.start == end || range.end == start;
+  }
+
+  inline WebTimeRange UnionWithOverlappingOrContiguousRange(
+      const WebTimeRange& range) const {
+    WebTimeRange ret;
+
+    ret.start = std::min(start, range.start);
+    ret.end = std::max(end, range.end);
+
+    return ret;
+  }
+
+  inline bool IsBeforeRange(const WebTimeRange& range) const {
+    return range.start >= end;
+  }
 };
 
-typedef WebVector<WebTimeRange> WebTimeRanges;
+class BLINK_PLATFORM_EXPORT WebTimeRanges : public WebVector<WebTimeRange> {
+ public:
+  // Expose base constructors.
+  using WebVector<WebTimeRange>::WebVector;
+
+  void IntersectWith(const WebTimeRanges& other);
+  void UnionWith(const WebTimeRanges& other);
+  void Add(double start, double end);
+  bool Contain(double time) const;
+  double Nearest(double new_playback_position,
+                 double current_playback_position) const;
+  void Invert();
+};
 
 }  // namespace blink
 
diff --git a/third_party/blink/public/platform/web_vector.h b/third_party/blink/public/platform/web_vector.h
index 3aeb4e4..7f2818c 100644
--- a/third_party/blink/public/platform/web_vector.h
+++ b/third_party/blink/public/platform/web_vector.h
@@ -174,6 +174,16 @@
   void Swap(WebVector<T>& other) { data_.swap(other.data_); }
   void Clear() { data_.clear(); }
 
+  T& front() { return data_.front(); }
+  const T& front() const { return data_.front(); }
+  T& back() { return data_.back(); }
+  const T& back() const { return data_.back(); }
+
+  void EraseAt(size_t index) { data_.erase(begin() + index); }
+  void Insert(size_t index, const T& value) {
+    data_.insert(begin() + index, value);
+  }
+
  private:
   std::vector<T> data_;
 };
diff --git a/third_party/blink/renderer/bindings/core/v8/script_controller.cc b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
index d1fa5ee..82df311516 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_controller.cc
@@ -61,7 +61,7 @@
 #include "third_party/blink/renderer/core/loader/progress_tracker.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
index e5e3449..52d30c9 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.cc
@@ -14,7 +14,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_initializer.h"
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
index b4b6c52..f502e896 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -47,7 +47,7 @@
 #include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h"
 #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h"
 #include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/partitions.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc
index 36763e43..300688e 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_for_context_dispose.cc
@@ -34,7 +34,7 @@
 #include "build/build_config.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
index 0d289cb6..a13eefd 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -41,7 +41,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
 #include "third_party/blink/renderer/platform/scheduler/public/event_loop.h"
diff --git a/third_party/blink/renderer/bindings/modules/v8/generated.gni b/third_party/blink/renderer/bindings/modules/v8/generated.gni
index aa36ff5e..0f48b9e3 100644
--- a/third_party/blink/renderer/bindings/modules/v8/generated.gni
+++ b/third_party/blink/renderer/bindings/modules/v8/generated.gni
@@ -48,6 +48,12 @@
   "$bindings_modules_v8_output_dir/float32_array_or_float64_array_or_dom_matrix.h",
   "$bindings_modules_v8_output_dir/gpu_out_of_memory_error_or_gpu_validation_error.cc",
   "$bindings_modules_v8_output_dir/gpu_out_of_memory_error_or_gpu_validation_error.h",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_gpu_color.cc",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_gpu_color.h",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_float.cc",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_float.h",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_long.cc",
+  "$bindings_modules_v8_output_dir/gpu_load_op_or_long.h",
   "$bindings_modules_v8_output_dir/gpu_sampler_or_gpu_texture_view_or_gpu_buffer_binding.cc",
   "$bindings_modules_v8_output_dir/gpu_sampler_or_gpu_texture_view_or_gpu_buffer_binding.h",
   "$bindings_modules_v8_output_dir/html_canvas_element_or_offscreen_canvas.cc",
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/database.py b/third_party/blink/renderer/bindings/scripts/web_idl/database.py
index 06f56cb..8f7dcb7 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/database.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/database.py
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from .typedef import Typedef
 from .user_defined_type import UserDefinedType
 
 
@@ -52,7 +53,7 @@
             self._defs[kind] = {}
 
     def register(self, kind, user_defined_type):
-        assert isinstance(user_defined_type, UserDefinedType)
+        assert isinstance(user_defined_type, (UserDefinedType, Typedef))
         assert kind in DatabaseBody.Kind.itervalues()
         try:
             self.find_by_identifier(user_defined_type.identifier)
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
index 8ad9fcd..5211afb2 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
@@ -8,6 +8,7 @@
 from .identifier_ir_map import IdentifierIRMap
 from .idl_type import IdlTypeFactory
 from .reference import RefByIdFactory
+from .typedef import Typedef
 
 
 class IdlCompiler(object):
@@ -103,6 +104,11 @@
         for ir in dictionary_irs.itervalues():
             self._db.register(DatabaseBody.Kind.DICTIONARY, Dictionary(ir))
 
+        typedef_irs = self._ir_map.find_by_kind(
+            IdentifierIRMap.IR.Kind.TYPEDEF)
+        for ir in typedef_irs.itervalues():
+            self._db.register(DatabaseBody.Kind.TYPEDEF, Typedef(ir))
+
     def _resolve_references_to_idl_type(self):
         def resolve(ref):
             # Resolve to stubs for the time being.
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
index c198dac..360ed34 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
@@ -12,6 +12,7 @@
 from .common import WithIdentifier
 from .reference import Proxy
 from .reference import RefById
+from .typedef import Typedef
 from .user_defined_type import UserDefinedType
 
 # The implementation class hierarchy of IdlType
@@ -562,6 +563,7 @@
                  code_generator_info=None,
                  debug_info=None,
                  pass_key=None):
+        assert isinstance(typedef, Typedef)
         IdlType.__init__(
             self,
             code_generator_info=code_generator_info,
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/typedef.py b/third_party/blink/renderer/bindings/scripts/web_idl/typedef.py
index 10ee0af..118e0db 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/typedef.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/typedef.py
@@ -31,10 +31,18 @@
 
             self.idl_type = idl_type
 
+    def __init__(self, ir):
+        assert isinstance(ir, Typedef.IR)
+
+        WithIdentifier.__init__(self, ir.identifier)
+        WithCodeGeneratorInfo.__init__(self,
+                                       ir.code_generator_info.make_copy())
+        WithComponent.__init__(self, components=ir.components)
+        WithDebugInfo.__init__(self, ir.debug_info.make_copy())
+
+        self._idl_type = ir.idl_type
+
     @property
     def idl_type(self):
-        """
-        Returns the type to have an alias.
-        @return IdlType
-        """
-        assert False, 'Not implemented yet'
+        """Returns the typedef'ed type."""
+        return self._idl_type
diff --git a/third_party/blink/renderer/controller/blink_initializer.cc b/third_party/blink/renderer/controller/blink_initializer.cc
index 017c187..80a790e 100644
--- a/third_party/blink/renderer/controller/blink_initializer.cc
+++ b/third_party/blink/renderer/controller/blink_initializer.cc
@@ -45,10 +45,11 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/display_cutout_client_impl.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/surrounding_text_impl.h"
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
@@ -183,6 +184,9 @@
   }
   frame.GetInterfaceRegistry()->AddAssociatedInterface(WTF::BindRepeating(
       &DevToolsFrontendImpl::BindMojoRequest, WrapWeakPersistent(&frame)));
+  frame.GetInterfaceRegistry()->AddAssociatedInterface(WTF::BindRepeating(
+      &SurroundingTextImpl::BindToReceiver, WrapWeakPersistent(&frame)));
+
   frame.GetInterfaceRegistry()->AddInterface(WTF::BindRepeating(
       &LocalFrame::PauseSubresourceLoading, WrapWeakPersistent(&frame)));
   if (!base::FeatureList::IsEnabled(
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS
index 07a2c16..6df804d 100644
--- a/third_party/blink/renderer/core/DEPS
+++ b/third_party/blink/renderer/core/DEPS
@@ -119,4 +119,7 @@
     "surrounding_text_impl.cc" : [
         "+third_party/blink/renderer/core/frame/web_local_frame_impl.h",
     ],
+    "html_media_element_test.cc": [
+        "+base/test/gtest_util.h",
+    ],
 }
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc
index 7302c6c..9a28ae4d 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -70,7 +70,7 @@
 #include "third_party/blink/renderer/core/style_property_shorthand.h"
 #include "third_party/blink/renderer/platform/animation/timing_function.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/hash_set.h"
 
diff --git a/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h b/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
index 502894f..fad03b7 100644
--- a/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
+++ b/third_party/blink/renderer/core/content_capture/content_capture_task_histogram_reporter.h
@@ -7,7 +7,7 @@
 
 #include "base/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/ref_counted.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
diff --git a/third_party/blink/renderer/core/css/font_face.cc b/third_party/blink/renderer/core/css/font_face.cc
index 68c60db..bf483a2 100644
--- a/third_party/blink/renderer/core/css/font_face.cc
+++ b/third_party/blink/renderer/core/css/font_face.cc
@@ -63,7 +63,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/font_family_names.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
diff --git a/third_party/blink/renderer/core/css/font_face_set_document.cc b/third_party/blink/renderer/core/css/font_face_set_document.cc
index 05a8a1e..4abf570 100644
--- a/third_party/blink/renderer/core/css/font_face_set_document.cc
+++ b/third_party/blink/renderer/core/css/font_face_set_document.cc
@@ -41,7 +41,7 @@
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/css/local_font_face_source.cc b/third_party/blink/renderer/core/css/local_font_face_source.cc
index 207ce12..d9fe77b7 100644
--- a/third_party/blink/renderer/core/css/local_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/local_font_face_source.cc
@@ -13,7 +13,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_selector.h"
 #include "third_party/blink/renderer/platform/fonts/font_unique_name_lookup.h"
 #include "third_party/blink/renderer/platform/fonts/simple_font_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/css/remote_font_face_source.cc b/third_party/blink/renderer/core/css/remote_font_face_source.cc
index 6d05c69..cdedb7b 100644
--- a/third_party/blink/renderer/core/css/remote_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/remote_font_face_source.cc
@@ -18,7 +18,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_description.h"
 #include "third_party/blink/renderer/platform/fonts/font_selector.h"
 #include "third_party/blink/renderer/platform/fonts/simple_font_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_load_priority.h"
 #include "third_party/blink/renderer/platform/network/network_state_notifier.h"
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index a1cecb00..e2ac1a8 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -282,7 +282,7 @@
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
 #include "third_party/blink/renderer/platform/geometry/length_functions.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/instance_counters.h"
 #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/document_resource_coordinator.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
diff --git a/third_party/blink/renderer/core/dom/document_statistics_collector.cc b/third_party/blink/renderer/core/dom/document_statistics_collector.cc
index d95dbc84..c7675d1 100644
--- a/third_party/blink/renderer/core/dom/document_statistics_collector.cc
+++ b/third_party/blink/renderer/core/dom/document_statistics_collector.cc
@@ -17,7 +17,7 @@
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc
index a5e25db..f0311211 100644
--- a/third_party/blink/renderer/core/dom/events/event_target.cc
+++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -54,7 +54,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_dom_activity_logger.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
index 654b162..b2aa933 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
@@ -11,7 +11,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
diff --git a/third_party/blink/renderer/core/dom/user_gesture_indicator.cc b/third_party/blink/renderer/core/dom/user_gesture_indicator.cc
index e34f891..c40f78bf 100644
--- a/third_party/blink/renderer/core/dom/user_gesture_indicator.cc
+++ b/third_party/blink/renderer/core/dom/user_gesture_indicator.cc
@@ -7,7 +7,7 @@
 #include "base/time/default_clock.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
diff --git a/third_party/blink/renderer/core/editing/commands/document_exec_command.cc b/third_party/blink/renderer/core/editing/commands/document_exec_command.cc
index 7aa5013f..c8fe153 100644
--- a/third_party/blink/renderer/core/editing/commands/document_exec_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/document_exec_command.cc
@@ -38,7 +38,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/forms/text_control_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
diff --git a/third_party/blink/renderer/core/editing/commands/editor_command.cc b/third_party/blink/renderer/core/editing/commands/editor_command.cc
index 8d445a9..4476c46 100644
--- a/third_party/blink/renderer/core/editing/commands/editor_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/editor_command.cc
@@ -69,7 +69,7 @@
 #include "third_party/blink/renderer/core/scroll/scrollbar.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
index adb5a8a..033dc3f 100644
--- a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
+++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
@@ -15,7 +15,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/editing/finder/text_finder.cc b/third_party/blink/renderer/core/editing/finder/text_finder.cc
index 98c941c..559f5c5 100644
--- a/third_party/blink/renderer/core/editing/finder/text_finder.cc
+++ b/third_party/blink/renderer/core/editing/finder/text_finder.cc
@@ -60,7 +60,7 @@
 #include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/layout/text_autosizer.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/timer.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
diff --git a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc
index f2c7ce8..c84093f 100644
--- a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc
+++ b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.cc
@@ -38,7 +38,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/html/forms/text_control_element.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/events/pointer_event.idl b/third_party/blink/renderer/core/events/pointer_event.idl
index cb9b798d..1f39eec 100644
--- a/third_party/blink/renderer/core/events/pointer_event.idl
+++ b/third_party/blink/renderer/core/events/pointer_event.idl
@@ -21,5 +21,5 @@
 
     // https://w3c.github.io/pointerevents/extension.html#extensions-to-the-pointerevent-interface
     sequence<PointerEvent> getCoalescedEvents();
-    [RuntimeEnabled=PredictedEvents] sequence<PointerEvent> getPredictedEvents();
+    [RuntimeEnabled=PredictedEvents, Measure] sequence<PointerEvent> getPredictedEvents();
 };
diff --git a/third_party/blink/renderer/core/events/pointer_event_factory.cc b/third_party/blink/renderer/core/events/pointer_event_factory.cc
index f0bb1e6a..8ede380 100644
--- a/third_party/blink/renderer/core/events/pointer_event_factory.cc
+++ b/third_party/blink/renderer/core/events/pointer_event_factory.cc
@@ -96,10 +96,9 @@
 
   MouseEvent::SetCoordinatesFromWebPointerProperties(
       web_pointer_event_in_root_frame, dom_window, pointer_event_init);
-  // TODO(crbug.com/802067): pointerrawupdate event's movements are not
-  // calculated.
   if (RuntimeEnabledFeatures::ConsolidatedMovementXYEnabled() &&
-      web_pointer_event.GetType() == WebInputEvent::kPointerMove) {
+      (web_pointer_event.GetType() == WebInputEvent::kPointerMove ||
+       web_pointer_event.GetType() == WebInputEvent::kPointerRawUpdate)) {
     // TODO(crbug.com/907309): Current movementX/Y is in physical pixel when
     // zoom-for-dsf is enabled. Here we apply the device-scale-factor to align
     // with the current behavior. We need to figure out what is the best
@@ -165,8 +164,9 @@
   if (!event_list.IsEmpty()) {
     // Make a copy of LastPointerPosition so we can modify it after creating
     // each coalesced event.
-    FloatPoint last_global_position = GetLastPointerPosition(
-        pointer_event_init->pointerId(), event_list.front());
+    FloatPoint last_global_position =
+        GetLastPointerPosition(pointer_event_init->pointerId(),
+                               event_list.front(), web_pointer_event.GetType());
 
     for (const auto& event : event_list) {
       DCHECK_EQ(web_pointer_event.id, event.id);
@@ -318,8 +318,8 @@
   pointer_event_init->setView(view);
   UpdateCommonPointerEventInit(
       web_pointer_event,
-      GetLastPointerPosition(pointer_event_init->pointerId(),
-                             web_pointer_event),
+      GetLastPointerPosition(pointer_event_init->pointerId(), web_pointer_event,
+                             event_type),
       view, pointer_event_init);
 
   UIEventWithKeyState::SetFromWebInputEventModifiers(
@@ -343,26 +343,36 @@
   pointer_event_init->setPredictedEvents(predicted_pointer_events);
 
   SetLastPosition(pointer_event_init->pointerId(),
-                  web_pointer_event.PositionInScreen());
+                  web_pointer_event.PositionInScreen(), event_type);
   return PointerEvent::Create(type, pointer_event_init,
                               web_pointer_event.TimeStamp());
 }
 
-void PointerEventFactory::SetLastPosition(
-    int pointer_id,
-    const FloatPoint& position_in_screen) {
-  pointer_id_last_position_mapping_.Set(pointer_id, position_in_screen);
+void PointerEventFactory::SetLastPosition(int pointer_id,
+                                          const FloatPoint& position_in_screen,
+                                          WebInputEvent::Type event_type) {
+  if (event_type == WebInputEvent::kPointerRawUpdate)
+    pointerrawupdate_last_position_mapping_.Set(pointer_id, position_in_screen);
+  else
+    pointer_id_last_position_mapping_.Set(pointer_id, position_in_screen);
 }
 
 void PointerEventFactory::RemoveLastPosition(const int pointer_id) {
   pointer_id_last_position_mapping_.erase(pointer_id);
+  pointerrawupdate_last_position_mapping_.erase(pointer_id);
 }
 
 FloatPoint PointerEventFactory::GetLastPointerPosition(
     int pointer_id,
-    const WebPointerProperties& event) const {
-  if (pointer_id_last_position_mapping_.Contains(pointer_id))
-    return pointer_id_last_position_mapping_.at(pointer_id);
+    const WebPointerProperties& event,
+    WebInputEvent::Type event_type) const {
+  if (event_type == WebInputEvent::kPointerRawUpdate) {
+    if (pointerrawupdate_last_position_mapping_.Contains(pointer_id))
+      return pointerrawupdate_last_position_mapping_.at(pointer_id);
+  } else {
+    if (pointer_id_last_position_mapping_.Contains(pointer_id))
+      return pointer_id_last_position_mapping_.at(pointer_id);
+  }
   // If pointer_id is not in the map, returns the current position so the
   // movement will be zero.
   return event.PositionInScreen();
diff --git a/third_party/blink/renderer/core/events/pointer_event_factory.h b/third_party/blink/renderer/core/events/pointer_event_factory.h
index e98c573f..3122d6fc 100644
--- a/third_party/blink/renderer/core/events/pointer_event_factory.h
+++ b/third_party/blink/renderer/core/events/pointer_event_factory.h
@@ -87,10 +87,12 @@
   // Otherwise it returns the PositionInScreen of the given events, so we will
   // get movement = 0 when there is no last position.
   FloatPoint GetLastPointerPosition(PointerId pointer_id,
-                                    const WebPointerProperties& event) const;
+                                    const WebPointerProperties& event,
+                                    WebInputEvent::Type event_type) const;
 
   void SetLastPosition(PointerId pointer_id,
-                       const FloatPoint& position_in_screen);
+                       const FloatPoint& position_in_screen,
+                       WebInputEvent::Type event_type);
 
  private:
   // We use int64_t to cover the whole range for PointerId with no
@@ -159,6 +161,7 @@
                 1];
 
   PointerIdKeyMap<FloatPoint> pointer_id_last_position_mapping_;
+  PointerIdKeyMap<FloatPoint> pointerrawupdate_last_position_mapping_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/events/pointer_event_factory_test.cc b/third_party/blink/renderer/core/events/pointer_event_factory_test.cc
index 7e9e1db..fd680c5 100644
--- a/third_party/blink/renderer/core/events/pointer_event_factory_test.cc
+++ b/third_party/blink/renderer/core/events/pointer_event_factory_test.cc
@@ -123,7 +123,8 @@
             pointer_event->pointerId(),
             WebPointerProperties(1, WebPointerProperties::PointerType::kUnknown,
                                  WebPointerProperties::Button::kNoButton,
-                                 WebFloatPoint(50, 50), WebFloatPoint(20, 20))),
+                                 WebFloatPoint(50, 50), WebFloatPoint(20, 20)),
+            type),
         FloatPoint(100, 100));
     return pointer_event;
   }
@@ -589,7 +590,8 @@
           expected_mouse_id_,
           WebPointerProperties(1, WebPointerProperties::PointerType::kUnknown,
                                WebPointerProperties::Button::kNoButton,
-                               WebFloatPoint(50, 50), WebFloatPoint(20, 20))),
+                               WebFloatPoint(50, 50), WebFloatPoint(20, 20)),
+          WebInputEvent::kPointerMove),
       FloatPoint(20, 20));
 }
 
diff --git a/third_party/blink/renderer/core/events/touch_event.cc b/third_party/blink/renderer/core/events/touch_event.cc
index ba04bd8..ee8e3c16 100644
--- a/third_party/blink/renderer/core/events/touch_event.cc
+++ b/third_party/blink/renderer/core/events/touch_event.cc
@@ -40,7 +40,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
index d9d01c6..95cd13b 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -92,7 +92,7 @@
 #include "third_party/blink/renderer/core/page/plugin_data.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/network/http_parsers.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer.cc b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
index 6bd4f09d..84e4e65 100644
--- a/third_party/blink/renderer/core/exported/web_frame_serializer.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
@@ -64,7 +64,7 @@
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index b06dda59..bbeb961a 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -152,8 +152,8 @@
 #include "third_party/blink/renderer/platform/graphics/image.h"
 #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h"
-#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/keyboard_codes.h"
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
index 7c6f949..c63a32f 100644
--- a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
+++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -47,7 +47,7 @@
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/platform/blob/blob_registry.h"
 #include "third_party/blink/renderer/platform/blob/blob_url.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc
index b011ab2a..f38d4d5c 100644
--- a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc
+++ b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc
@@ -39,7 +39,7 @@
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/frame/frame_serializer.cc b/third_party/blink/renderer/core/frame/frame_serializer.cc
index af85556..8bea126 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer.cc
+++ b/third_party/blink/renderer/core/frame/frame_serializer.cc
@@ -66,7 +66,7 @@
 #include "third_party/blink/renderer/core/style/style_image.h"
 #include "third_party/blink/renderer/platform/graphics/image.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/mhtml/serialized_resource.h"
 #include "third_party/blink/renderer/platform/wtf/hash_set.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 1646170..60b3fe6 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -111,7 +111,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/document_resource_coordinator.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/json/json_values.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
index ce0bd5d..3cb0fd39 100644
--- a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_UKM_AGGREGATOR_H_
 
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 54ca4aa1..684af23 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -143,7 +143,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h"
 #include "third_party/blink/renderer/platform/graphics/paint/foreign_layer_display_item.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/language.h"
diff --git a/third_party/blink/renderer/core/frame/performance_monitor.cc b/third_party/blink/renderer/core/frame/performance_monitor.cc
index 4785438..5b5c9052 100644
--- a/third_party/blink/renderer/core/frame/performance_monitor.cc
+++ b/third_party/blink/renderer/core/frame/performance_monitor.cc
@@ -17,7 +17,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/frame/surrounding_text_impl.cc b/third_party/blink/renderer/core/frame/surrounding_text_impl.cc
index 43516b1..f8cfb15e 100644
--- a/third_party/blink/renderer/core/frame/surrounding_text_impl.cc
+++ b/third_party/blink/renderer/core/frame/surrounding_text_impl.cc
@@ -9,33 +9,45 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/core/editing/surrounding_text.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
-#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
-SurroundingTextImpl::SurroundingTextImpl(WebLocalFrameImpl& frame,
-                                         InterfaceRegistry* interface_registry)
-    : frame_(&frame) {
-  if (!interface_registry)
+// static
+const char SurroundingTextImpl::kSupplementName[] = "SurroundingTextImpl";
+
+// static
+void SurroundingTextImpl::BindToReceiver(
+    LocalFrame* frame,
+    mojo::PendingAssociatedReceiver<mojom::blink::SurroundingText> receiver) {
+  if (!frame)
     return;
-  // TODO(crbug.com/800641): Use InterfaceValidator when it works for associated
-  // interfaces.
-  interface_registry->AddAssociatedInterface(WTF::BindRepeating(
-      &SurroundingTextImpl::BindToReceiver, WrapWeakPersistent(this)));
+  frame->ProvideSupplement(
+      MakeGarbageCollected<SurroundingTextImpl>(*frame, std::move(receiver)));
 }
 
-void SurroundingTextImpl::BindToReceiver(
-    mojo::PendingAssociatedReceiver<mojom::blink::SurroundingText> receiver) {
-  receiver_.Bind(std::move(receiver),
-                 frame_->GetTaskRunner(blink::TaskType::kInternalDefault));
+// static
+SurroundingTextImpl* SurroundingTextImpl::From(LocalFrame* frame) {
+  if (!frame)
+    return nullptr;
+  return frame->RequireSupplement<SurroundingTextImpl>();
 }
 
+SurroundingTextImpl::SurroundingTextImpl(
+    LocalFrame& frame,
+    mojo::PendingAssociatedReceiver<mojom::blink::SurroundingText> receiver)
+    : Supplement<LocalFrame>(frame),
+      receiver_(this,
+                std::move(receiver),
+                frame.GetTaskRunner(blink::TaskType::kInternalDefault)) {}
+
+SurroundingTextImpl::~SurroundingTextImpl() = default;
+
 void SurroundingTextImpl::GetTextSurroundingSelection(
     uint32_t max_length,
     GetTextSurroundingSelectionCallback callback) {
-  blink::SurroundingText surrounding_text(frame_->GetFrame(), max_length);
+  blink::SurroundingText surrounding_text(GetSupplementable(), max_length);
 
   if (surrounding_text.IsEmpty()) {
     // |surrounding_text| might not be correctly initialized, for example if
diff --git a/third_party/blink/renderer/core/frame/surrounding_text_impl.h b/third_party/blink/renderer/core/frame/surrounding_text_impl.h
index 4ee5e0e..1d4fe31 100644
--- a/third_party/blink/renderer/core/frame/surrounding_text_impl.h
+++ b/third_party/blink/renderer/core/frame/surrounding_text_impl.h
@@ -8,35 +8,41 @@
 #include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "third_party/blink/public/mojom/frame/surrounding_text.mojom-blink.h"
-#include "third_party/blink/public/platform/interface_registry.h"
-#include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 
 namespace blink {
 
-class WebLocalFrameImpl;
+class LocalFrame;
 
 // Implementation of mojom::blink::SurroundingText
 class CORE_EXPORT SurroundingTextImpl final
     : public GarbageCollectedFinalized<SurroundingTextImpl>,
+      public Supplement<LocalFrame>,
       public mojom::blink::SurroundingText {
- public:
-  SurroundingTextImpl(WebLocalFrameImpl& frame,
-                      InterfaceRegistry* interface_registry);
+  USING_GARBAGE_COLLECTED_MIXIN(SurroundingTextImpl);
 
-  void BindToReceiver(
+ public:
+  static const char kSupplementName[];
+
+  static void BindToReceiver(
+      LocalFrame* frame,
       mojo::PendingAssociatedReceiver<mojom::blink::SurroundingText> receiver);
 
+  static SurroundingTextImpl* From(LocalFrame* frame);
+
+  explicit SurroundingTextImpl(
+      LocalFrame& frame,
+      mojo::PendingAssociatedReceiver<mojom::blink::SurroundingText> receiver);
+  ~SurroundingTextImpl() override;
+
   void GetTextSurroundingSelection(
       uint32_t max_length,
       GetTextSurroundingSelectionCallback callback) final;
 
-  void Trace(blink::Visitor* visitor) { visitor->Trace(frame_); }
-
  private:
-  const Member<WebLocalFrameImpl> frame_;
-
   mojo::AssociatedReceiver<mojom::blink::SurroundingText> receiver_{this};
 
   DISALLOW_COPY_AND_ASSIGN(SurroundingTextImpl);
diff --git a/third_party/blink/renderer/core/frame/use_counter_helper.cc b/third_party/blink/renderer/core/frame/use_counter_helper.cc
index 81225ea1..b93c2e7 100644
--- a/third_party/blink/renderer/core/frame/use_counter_helper.cc
+++ b/third_party/blink/renderer/core/frame/use_counter_helper.cc
@@ -38,7 +38,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"
 
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc
index 51ca341..b2b3e738 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -62,7 +62,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h"
 #include "third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h"
 #include "third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index a0e9ad3..b538c79 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -192,7 +192,6 @@
 #include "third_party/blink/renderer/core/frame/screen_orientation_controller.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/frame/smart_clip.h"
-#include "third_party/blink/renderer/core/frame/surrounding_text_impl.h"
 #include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/frame/web_frame_widget_base.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_control_element.h"
@@ -1715,8 +1714,6 @@
       autofill_client_(nullptr),
       find_in_page_(
           MakeGarbageCollected<FindInPage>(*this, interface_registry)),
-      surrounding_text_impl_(
-          MakeGarbageCollected<SurroundingTextImpl>(*this, interface_registry)),
       interface_registry_(interface_registry),
       input_method_controller_(*this),
       spell_check_panel_host_client_(nullptr),
@@ -1735,7 +1732,6 @@
 void WebLocalFrameImpl::Trace(blink::Visitor* visitor) {
   visitor->Trace(local_frame_client_);
   visitor->Trace(find_in_page_);
-  visitor->Trace(surrounding_text_impl_);
   visitor->Trace(frame_);
   visitor->Trace(dev_tools_agent_);
   visitor->Trace(frame_widget_);
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
index 744a3f1..79318b5 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -65,7 +65,6 @@
 class LocalFrameClientImpl;
 class ResourceError;
 class ScrollableArea;
-class SurroundingTextImpl;
 class TextFinder;
 class WebAssociatedURLLoader;
 struct WebAssociatedURLLoaderOptions;
@@ -506,7 +505,6 @@
   WebContentSettingsClient* content_settings_client_ = nullptr;
 
   Member<FindInPage> find_in_page_;
-  Member<SurroundingTextImpl> surrounding_text_impl_;
 
   // Valid between calls to BeginPrint() and EndPrint(). Containts the print
   // information. Is used by PrintPage().
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics.cc b/third_party/blink/renderer/core/html/anchor_element_metrics.cc
index a878d1b..6686db7f 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics.cc
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics.cc
@@ -18,7 +18,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/platform/geometry/int_size.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
index b88de758..d6ec4af 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
@@ -18,8 +18,8 @@
 #include "third_party/blink/renderer/platform/graphics/image_data_buffer.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
index 82cb30a..cc124818 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.cc
@@ -12,7 +12,7 @@
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/skia/include/core/SkSurface.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc
index 6016f9b..ee41419 100644
--- a/third_party/blink/renderer/core/html/html_plugin_element.cc
+++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -51,7 +51,7 @@
 #include "third_party/blink/renderer/core/page/plugin_data.h"
 #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
 #include "third_party/blink/renderer/platform/network/mime/mime_type_from_url.h"
 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
diff --git a/third_party/blink/renderer/core/html/link_style.cc b/third_party/blink/renderer/core/html/link_style.cc
index b72aef33..b802bd6 100644
--- a/third_party/blink/renderer/core/html/link_style.cc
+++ b/third_party/blink/renderer/core/html/link_style.cc
@@ -18,7 +18,7 @@
 #include "third_party/blink/renderer/core/loader/resource/css_style_sheet_resource.h"
 #include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/subresource_integrity.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
index 8d53080..74ea6a1 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
@@ -17,7 +17,7 @@
 #include "third_party/blink/renderer/core/intersection_observer/intersection_observer.h"
 #include "third_party/blink/renderer/core/intersection_observer/intersection_observer_entry.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/network/network_state_notifier.h"
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index ce41f8c..637245e 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -97,7 +97,7 @@
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
@@ -2054,13 +2054,13 @@
   // the new playback position. ... If there are no ranges given in the seekable
   // attribute then set the seeking IDL attribute to false and abort these
   // steps.
-  TimeRanges* seekable_ranges = seekable();
+  WebTimeRanges seekable_ranges = SeekableInternal();
 
-  if (!seekable_ranges->length()) {
+  if (seekable_ranges.empty()) {
     seeking_ = false;
     return;
   }
-  time = seekable_ranges->Nearest(time, now);
+  time = seekable_ranges.Nearest(time, now);
 
   if (playing_ && last_seek_time_ < now)
     AddPlayedRange(last_seek_time_, now);
@@ -2117,9 +2117,9 @@
 // corresponds to the start time of the first range in the seekable attribute’s
 // TimeRanges object, if any, or the current playback position otherwise.
 double HTMLMediaElement::EarliestPossiblePosition() const {
-  TimeRanges* seekable_ranges = seekable();
-  if (seekable_ranges && seekable_ranges->length() > 0)
-    return seekable_ranges->start(0, ASSERT_NO_EXCEPTION);
+  WebTimeRanges seekable_ranges = SeekableInternal();
+  if (!seekable_ranges.empty())
+    return seekable_ranges.front().start;
 
   return CurrentPlaybackPosition();
 }
@@ -3350,14 +3350,18 @@
     GetLayoutObject()->UpdateFromElement();
 }
 
-TimeRanges* HTMLMediaElement::buffered() const {
+WebTimeRanges HTMLMediaElement::BufferedInternal() const {
   if (media_source_)
-    return media_source_->Buffered();
+    return media_source_->BufferedInternal();
 
   if (!GetWebMediaPlayer())
-    return MakeGarbageCollected<TimeRanges>();
+    return {};
 
-  return MakeGarbageCollected<TimeRanges>(GetWebMediaPlayer()->Buffered());
+  return GetWebMediaPlayer()->Buffered();
+}
+
+TimeRanges* HTMLMediaElement::buffered() const {
+  return MakeGarbageCollected<TimeRanges>(BufferedInternal());
 }
 
 TimeRanges* HTMLMediaElement::played() {
@@ -3373,14 +3377,18 @@
   return played_time_ranges_->Copy();
 }
 
-TimeRanges* HTMLMediaElement::seekable() const {
+WebTimeRanges HTMLMediaElement::SeekableInternal() const {
   if (!GetWebMediaPlayer())
-    return MakeGarbageCollected<TimeRanges>();
+    return {};
 
   if (media_source_)
-    return media_source_->Seekable();
+    return media_source_->SeekableInternal();
 
-  return MakeGarbageCollected<TimeRanges>(GetWebMediaPlayer()->Seekable());
+  return GetWebMediaPlayer()->Seekable();
+}
+
+TimeRanges* HTMLMediaElement::seekable() const {
+  return MakeGarbageCollected<TimeRanges>(SeekableInternal());
 }
 
 bool HTMLMediaElement::PotentiallyPlaying() const {
@@ -3425,8 +3433,8 @@
 
 bool HTMLMediaElement::StoppedDueToErrors() const {
   if (ready_state_ >= kHaveMetadata && error_) {
-    TimeRanges* seekable_ranges = seekable();
-    if (!seekable_ranges->Contain(currentTime()))
+    WebTimeRanges seekable_ranges = SeekableInternal();
+    if (!seekable_ranges.Contain(currentTime()))
       return true;
   }
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h
index d614a0a..ea08533 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.h
+++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -160,6 +160,7 @@
   String EffectivePreload() const;
   WebMediaPlayer::Preload EffectivePreloadType() const;
 
+  WebTimeRanges BufferedInternal() const;
   TimeRanges* buffered() const;
   void load();
   String canPlayType(const String& mime_type) const;
@@ -186,6 +187,7 @@
   void setPlaybackRate(double, ExceptionState& = ASSERT_NO_EXCEPTION);
   void UpdatePlaybackRate();
   TimeRanges* played();
+  WebTimeRanges SeekableInternal() const;
   TimeRanges* seekable() const;
   bool ended() const;
   bool Autoplay() const;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_test.cc
index e60eadd5..5e16168 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element_test.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 
+#include "base/test/gtest_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/autoplay/autoplay.mojom-blink.h"
@@ -12,6 +13,7 @@
 #include "third_party/blink/renderer/core/html/media/html_audio_element.h"
 #include "third_party/blink/renderer/core/html/media/html_video_element.h"
 #include "third_party/blink/renderer/core/html/media/media_error.h"
+#include "third_party/blink/renderer/core/html/time_ranges.h"
 #include "third_party/blink/renderer/core/html/track/audio_track_list.h"
 #include "third_party/blink/renderer/core/html/track/video_track_list.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
@@ -21,6 +23,7 @@
 #include "third_party/blink/renderer/platform/testing/empty_web_media_player.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 using ::testing::AnyNumber;
 using ::testing::Return;
@@ -488,4 +491,33 @@
   EXPECT_TRUE(Media()->paused());
 }
 
+TEST_P(HTMLMediaElementTest, GcMarkingNoAllocWebTimeRanges) {
+  auto* thread_state = ThreadState::Current();
+  ThreadState::NoAllocationScope no_allocation_scope(thread_state);
+  EXPECT_FALSE(thread_state->IsAllocationAllowed());
+  // Use of TimeRanges is not allowed during GC marking (crbug.com/970150)
+  EXPECT_DCHECK_DEATH(MakeGarbageCollected<TimeRanges>(0, 0));
+  // Instead of using TimeRanges, WebTimeRanges can be used without GC
+  Vector<WebTimeRanges> ranges;
+  ranges.emplace_back();
+  ranges[0].emplace_back(0, 0);
+}
+
+// Reproduce crbug.com/970150
+TEST_P(HTMLMediaElementTest, GcMarkingNoAllocHasActivity) {
+  Media()->SetSrc(SrcSchemeToURL(TestURLScheme::kHttp));
+  Media()->Play();
+
+  test::RunPendingTasks();
+  SetReadyState(HTMLMediaElement::kHaveFutureData);
+  SetError(MakeGarbageCollected<MediaError>(MediaError::kMediaErrDecode, ""));
+
+  EXPECT_FALSE(Media()->paused());
+
+  auto* thread_state = ThreadState::Current();
+  ThreadState::NoAllocationScope no_allocation_scope(thread_state);
+  EXPECT_FALSE(thread_state->IsAllocationAllowed());
+  Media()->HasPendingActivity();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/media/html_media_source.h b/third_party/blink/renderer/core/html/media/html_media_source.h
index 1ec61e12..a759c7b8 100644
--- a/third_party/blink/renderer/core/html/media/html_media_source.h
+++ b/third_party/blink/renderer/core/html/media/html_media_source.h
@@ -32,6 +32,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_MEDIA_HTML_MEDIA_SOURCE_H_
 
 #include <memory>
+#include "third_party/blink/public/platform/web_time_range.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/fileapi/url_registry.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -66,6 +67,16 @@
   virtual void Close() = 0;
   virtual bool IsClosed() const = 0;
   virtual double duration() const = 0;
+
+  // 'Internal' in these methods doesn't mean private, it means that they are
+  // internal to chromium and are not exposed to JavaScript.
+
+  // The JavaScript exposed version of this is Buffered.
+  virtual WebTimeRanges BufferedInternal() const = 0;
+
+  // The JavaScript exposed version of this is Seekable.
+  virtual WebTimeRanges SeekableInternal() const = 0;
+
   virtual TimeRanges* Buffered() const = 0;
   virtual TimeRanges* Seekable() const = 0;
   virtual void OnTrackChanged(TrackBase*) = 0;
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc
index 345ffe4a..6082801 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -57,7 +57,7 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/extensions_3d_util.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
diff --git a/third_party/blink/renderer/core/html/parser/background_html_parser.cc b/third_party/blink/renderer/core/html/parser/background_html_parser.cc
index 99ef5b81..3d765b5 100644
--- a/third_party/blink/renderer/core/html/parser/background_html_parser.cc
+++ b/third_party/blink/renderer/core/html/parser/background_html_parser.cc
@@ -34,7 +34,7 @@
 #include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
 #include "third_party/blink/renderer/core/html/parser/xss_auditor.h"
 #include "third_party/blink/renderer/core/html_names.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
index cb1e323..7c259b8 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -58,7 +58,7 @@
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
index 15e5f7b..87a0f27 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
@@ -58,7 +58,7 @@
 #include "third_party/blink/renderer/core/loader/subresource_integrity_helper.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trials.h"
 #include "third_party/blink/renderer/core/script/script_loader.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource.h"
diff --git a/third_party/blink/renderer/core/html/time_ranges.cc b/third_party/blink/renderer/core/html/time_ranges.cc
index 6641622..c1febee 100644
--- a/third_party/blink/renderer/core/html/time_ranges.cc
+++ b/third_party/blink/renderer/core/html/time_ranges.cc
@@ -25,8 +25,6 @@
 
 #include "third_party/blink/renderer/core/html/time_ranges.h"
 
-#include <math.h>
-
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
@@ -44,36 +42,7 @@
 }
 
 TimeRanges* TimeRanges::Copy() const {
-  auto* new_session = MakeGarbageCollected<TimeRanges>();
-
-  wtf_size_t size = ranges_.size();
-  for (wtf_size_t i = 0; i < size; i++)
-    new_session->Add(ranges_[i].start_, ranges_[i].end_);
-
-  return new_session;
-}
-
-void TimeRanges::Invert() {
-  auto* inverted = MakeGarbageCollected<TimeRanges>();
-  double pos_inf = std::numeric_limits<double>::infinity();
-  double neg_inf = -std::numeric_limits<double>::infinity();
-
-  if (!ranges_.size()) {
-    inverted->Add(neg_inf, pos_inf);
-  } else {
-    double start = ranges_.front().start_;
-    if (start != neg_inf)
-      inverted->Add(neg_inf, start);
-
-    for (wtf_size_t index = 0; index + 1 < ranges_.size(); ++index)
-      inverted->Add(ranges_[index].end_, ranges_[index + 1].start_);
-
-    double end = ranges_.back().end_;
-    if (end != pos_inf)
-      inverted->Add(end, pos_inf);
-  }
-
-  ranges_.swap(inverted->ranges_);
+  return MakeGarbageCollected<TimeRanges>(ranges_);
 }
 
 void TimeRanges::IntersectWith(const TimeRanges* other) {
@@ -82,23 +51,12 @@
   if (other == this)
     return;
 
-  TimeRanges* inverted_other = other->Copy();
-  inverted_other->Invert();
-
-  Invert();
-  UnionWith(inverted_other);
-  Invert();
+  ranges_.IntersectWith(other->ranges_);
 }
 
 void TimeRanges::UnionWith(const TimeRanges* other) {
   DCHECK(other);
-  TimeRanges* unioned = Copy();
-  for (wtf_size_t index = 0; index < other->ranges_.size(); ++index) {
-    const Range& range = other->ranges_[index];
-    unioned->Add(range.start_, range.end_);
-  }
-
-  ranges_.swap(unioned->ranges_);
+  ranges_.UnionWith(other->ranges_);
 }
 
 double TimeRanges::start(unsigned index,
@@ -109,7 +67,7 @@
         ExceptionMessages::IndexExceedsMaximumBound("index", index, length()));
     return 0;
   }
-  return ranges_[index].start_;
+  return ranges_.Data()[index].start;
 }
 
 double TimeRanges::end(unsigned index, ExceptionState& exception_state) const {
@@ -119,94 +77,20 @@
         ExceptionMessages::IndexExceedsMaximumBound("index", index, length()));
     return 0;
   }
-  return ranges_[index].end_;
+  return ranges_.Data()[index].end;
 }
 
 void TimeRanges::Add(double start, double end) {
-  DCHECK_LE(start, end);
-  unsigned overlapping_arc_index;
-  Range added_range(start, end);
-
-  // For each present range check if we need to:
-  // - merge with the added range, in case we are overlapping or contiguous
-  // - Need to insert in place, we we are completely, not overlapping and not
-  //   contiguous in between two ranges.
-  //
-  // TODO: Given that we assume that ranges are correctly ordered, this could be
-  // optimized.
-
-  for (overlapping_arc_index = 0; overlapping_arc_index < ranges_.size();
-       overlapping_arc_index++) {
-    if (added_range.IsOverlappingRange(ranges_[overlapping_arc_index]) ||
-        added_range.IsContiguousWithRange(ranges_[overlapping_arc_index])) {
-      // We need to merge the addedRange and that range.
-      added_range = added_range.UnionWithOverlappingOrContiguousRange(
-          ranges_[overlapping_arc_index]);
-      ranges_.EraseAt(overlapping_arc_index);
-      overlapping_arc_index--;
-    } else {
-      // Check the case for which there is no more to do
-      if (!overlapping_arc_index) {
-        if (added_range.IsBeforeRange(ranges_[0])) {
-          // First index, and we are completely before that range (and not
-          // contiguous, nor overlapping).  We just need to be inserted here.
-          break;
-        }
-      } else {
-        if (ranges_[overlapping_arc_index - 1].IsBeforeRange(added_range) &&
-            added_range.IsBeforeRange(ranges_[overlapping_arc_index])) {
-          // We are exactly after the current previous range, and before the
-          // current range, while not overlapping with none of them. Insert
-          // here.
-          break;
-        }
-      }
-    }
-  }
-
-  // Now that we are sure we don't overlap with any range, just add it.
-  ranges_.insert(overlapping_arc_index, added_range);
+  ranges_.Add(start, end);
 }
 
 bool TimeRanges::Contain(double time) const {
-  for (unsigned n = 0; n < length(); n++) {
-    if (time >= start(n, IGNORE_EXCEPTION_FOR_TESTING) &&
-        time <= end(n, IGNORE_EXCEPTION_FOR_TESTING))
-      return true;
-  }
-  return false;
+  return ranges_.Contain(time);
 }
 
 double TimeRanges::Nearest(double new_playback_position,
                            double current_playback_position) const {
-  unsigned count = length();
-  double best_match = 0;
-  double best_delta = std::numeric_limits<double>::infinity();
-  for (unsigned ndx = 0; ndx < count; ndx++) {
-    double start_time = start(ndx, IGNORE_EXCEPTION_FOR_TESTING);
-    double end_time = end(ndx, IGNORE_EXCEPTION_FOR_TESTING);
-    if (new_playback_position >= start_time &&
-        new_playback_position <= end_time)
-      return new_playback_position;
-
-    double delta, match;
-    if (new_playback_position < start_time) {
-      delta = start_time - new_playback_position;
-      match = start_time;
-    } else {
-      delta = new_playback_position - end_time;
-      match = end_time;
-    }
-
-    if (delta < best_delta ||
-        (delta == best_delta &&
-         std::abs(current_playback_position - match) <
-             std::abs(current_playback_position - best_match))) {
-      best_delta = delta;
-      best_match = match;
-    }
-  }
-  return best_match;
+  return ranges_.Nearest(new_playback_position, current_playback_position);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/time_ranges.h b/third_party/blink/renderer/core/html/time_ranges.h
index cc1a5621c..9668344 100644
--- a/third_party/blink/renderer/core/html/time_ranges.h
+++ b/third_party/blink/renderer/core/html/time_ranges.h
@@ -31,9 +31,6 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-
-#include <algorithm>
 
 namespace blink {
 
@@ -43,47 +40,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  // We consider all the Ranges to be semi-bounded as follow: [start, end[
-  struct Range {
-    DISALLOW_NEW();
-
-   public:
-    Range() = default;
-    Range(double start, double end) {
-      start_ = start;
-      end_ = end;
-    }
-    double start_;
-    double end_;
-
-    inline bool isPointInRange(double point) const {
-      return start_ <= point && point < end_;
-    }
-
-    inline bool IsOverlappingRange(const Range& range) const {
-      return isPointInRange(range.start_) || isPointInRange(range.end_) ||
-             range.isPointInRange(start_);
-    }
-
-    inline bool IsContiguousWithRange(const Range& range) const {
-      return range.start_ == end_ || range.end_ == start_;
-    }
-
-    inline Range UnionWithOverlappingOrContiguousRange(
-        const Range& range) const {
-      Range ret;
-
-      ret.start_ = std::min(start_, range.start_);
-      ret.end_ = std::max(end_, range.end_);
-
-      return ret;
-    }
-
-    inline bool IsBeforeRange(const Range& range) const {
-      return range.start_ >= end_;
-    }
-  };
-
   TimeRanges() = default;
   TimeRanges(double start, double end);
   TimeRanges(const WebTimeRanges&);
@@ -92,7 +48,7 @@
   void IntersectWith(const TimeRanges*);
   void UnionWith(const TimeRanges*);
 
-  unsigned length() const { return ranges_.size(); }
+  unsigned length() const { return static_cast<unsigned>(ranges_.size()); }
   double start(unsigned index, ExceptionState&) const;
   double end(unsigned index, ExceptionState&) const;
 
@@ -104,9 +60,7 @@
                  double current_playback_position) const;
 
  private:
-  void Invert();
-
-  Vector<Range> ranges_;
+  WebTimeRanges ranges_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
index b0091c4..338eabd4 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
@@ -49,8 +49,8 @@
 #include "third_party/blink/renderer/core/svg/svg_image_element.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index 7a43661..4d0a2f8 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -95,7 +95,7 @@
 #include "third_party/blink/renderer/platform/geometry/float_point.h"
 #include "third_party/blink/renderer/platform/graphics/image.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -1422,10 +1422,8 @@
     mouse_wheel_event_manager_->ElementRemoved(target);
 }
 
-void EventHandler::SetMousePositionForPointerUnlock(
-    FloatPoint lock_position_in_screen) {
-  pointer_event_manager_->SetLastMousePositionForPointerUnlock(
-      lock_position_in_screen);
+void EventHandler::ResetMousePositionForPointerUnlock() {
+  pointer_event_manager_->RemoveLastMousePosition();
 }
 
 WebInputEventResult EventHandler::DispatchMousePointerEvent(
diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h
index 67e528db..e2dfc39 100644
--- a/third_party/blink/renderer/core/input/event_handler.h
+++ b/third_party/blink/renderer/core/input/event_handler.h
@@ -297,9 +297,9 @@
 
   void SetIsFallbackCursorModeOn(bool is_on);
 
-  // Set the last mouse position so that next movemove after unlock will be
-  // calculated from the lock position.
-  void SetMousePositionForPointerUnlock(FloatPoint lock_position_in_screen);
+  // Reset the last mouse position so that movement after unlock will be
+  // restart from the lock position.
+  void ResetMousePositionForPointerUnlock();
 
  private:
   enum NoCursorChangeType { kNoCursorChange };
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc
index d878700..43d2bce 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -40,7 +40,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/svg/svg_document_extensions.h"
 #include "third_party/blink/renderer/platform/geometry/float_quad.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index 5161f35f..1ccbd3b9 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -697,7 +697,7 @@
     // pointer_event_factory updates it.
     FloatPoint last_mouse_position =
         pointer_event_factory_.GetLastPointerPosition(
-            PointerEventFactory::kMouseId, event);
+            PointerEventFactory::kMouseId, event, event.GetType());
 
     WebInputEventResult result = CreateAndDispatchPointerEvent(
         target, mouse_event_type, event, coalesced_events, predicted_events,
@@ -710,8 +710,8 @@
     return result;
   }
   pointer_event_factory_.SetLastPosition(
-      pointer_event_factory_.GetPointerEventId(event),
-      event.PositionInScreen());
+      pointer_event_factory_.GetPointerEventId(event), event.PositionInScreen(),
+      event.GetType());
 
   return WebInputEventResult::kHandledSuppressed;
 }
@@ -740,7 +740,8 @@
   // pointer_event_factory updates it.
   FloatPoint last_mouse_position =
       pointer_event_factory_.GetLastPointerPosition(
-          pointer_event_factory_.GetPointerEventId(mouse_event), mouse_event);
+          pointer_event_factory_.GetPointerEventId(mouse_event), mouse_event,
+          event_type);
 
   PointerEvent* pointer_event = pointer_event_factory_.Create(
       web_pointer_event, pointer_coalesced_events, pointer_predicted_events,
@@ -1086,17 +1087,12 @@
     pointer_event_factory_.RemoveLastPosition(pointer_id);
   } else if (!last_target || new_target->GetDocument().GetFrame() !=
                                  last_target->GetDocument().GetFrame()) {
-    pointer_event_factory_.SetLastPosition(
-        pointer_id, web_pointer_event.PositionInScreen());
+    pointer_event_factory_.SetLastPosition(pointer_id,
+                                           web_pointer_event.PositionInScreen(),
+                                           web_pointer_event.GetType());
   }
 }
 
-void PointerEventManager::SetLastMousePositionForPointerUnlock(
-    FloatPoint mouse_lock_position_in_screen) {
-  pointer_event_factory_.SetLastPosition(PointerEventFactory::kMouseId,
-                                         mouse_lock_position_in_screen);
-}
-
 void PointerEventManager::RemoveLastMousePosition() {
   pointer_event_factory_.RemoveLastPosition(PointerEventFactory::kMouseId);
 }
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.h b/third_party/blink/renderer/core/input/pointer_event_manager.h
index 74b61c7..f02d6ca 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.h
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.h
@@ -98,9 +98,6 @@
 
   void RemoveLastMousePosition();
 
-  void SetLastMousePositionForPointerUnlock(
-      FloatPoint mouse_lock_position_in_screen);
-
   Element* GetMouseCaptureTarget();
 
   // Sends any outstanding events. For example it notifies TouchEventManager
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
index f29eb9c..a39f43b4 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
@@ -348,4 +348,70 @@
   ASSERT_FLOAT_EQ(callback->last_movement_y_, 0);
 }
 
+TEST_F(PointerEventManagerTest, PointerRawUpdateMovements) {
+  WebView().MainFrameWidget()->Resize(WebSize(400, 400));
+  SimRequest request("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  request.Complete(
+      "<body style='padding: 0px; width: 400px; height: 400px;'>"
+      "</body>");
+  PointerEventCoordinateListenerCallback* callback =
+      PointerEventCoordinateListenerCallback::Create();
+  GetDocument().body()->addEventListener(event_type_names::kPointermove,
+                                         callback);
+  GetDocument().body()->addEventListener(event_type_names::kPointerrawupdate,
+                                         callback);
+
+  // Turn on the flag for test.
+  ScopedConsolidatedMovementXYForTest scoped_feature(true);
+
+  WebView().MainFrameWidget()->HandleInputEvent(WebCoalescedInputEvent(
+      CreateTestPointerEvent(WebInputEvent::kPointerRawUpdate,
+                             WebPointerProperties::PointerType::kMouse,
+                             WebFloatPoint(150, 210), WebFloatPoint(100, 50),
+                             10, 10),
+      {}, {}));
+  // The first pointerrawupdate event has movement_x/y 0.
+  ASSERT_EQ(callback->last_screen_x_, 100);
+  ASSERT_EQ(callback->last_screen_y_, 50);
+  ASSERT_EQ(callback->last_movement_x_, 0);
+  ASSERT_EQ(callback->last_movement_y_, 0);
+
+  WebView().MainFrameWidget()->HandleInputEvent(WebCoalescedInputEvent(
+      CreateTestPointerEvent(WebInputEvent::kPointerRawUpdate,
+                             WebPointerProperties::PointerType::kMouse,
+                             WebFloatPoint(150, 200), WebFloatPoint(132, 29),
+                             10, 10),
+      {}, {}));
+  // pointerrawupdate event movement = event.screenX/Y - last_event.screenX/Y.
+  ASSERT_EQ(callback->last_screen_x_, 132);
+  ASSERT_EQ(callback->last_screen_y_, 29);
+  ASSERT_EQ(callback->last_movement_x_, 32);
+  ASSERT_EQ(callback->last_movement_y_, -21);
+
+  WebView().MainFrameWidget()->HandleInputEvent(WebCoalescedInputEvent(
+      CreateTestPointerEvent(WebInputEvent::kPointerMove,
+                             WebPointerProperties::PointerType::kMouse,
+                             WebFloatPoint(150, 200), WebFloatPoint(144, 30),
+                             10, 10),
+      {}, {}));
+  // First pointermove, have 0 movements.
+  ASSERT_EQ(callback->last_screen_x_, 144);
+  ASSERT_EQ(callback->last_screen_y_, 30);
+  ASSERT_EQ(callback->last_movement_x_, 0);
+  ASSERT_EQ(callback->last_movement_y_, 0);
+
+  WebView().MainFrameWidget()->HandleInputEvent(WebCoalescedInputEvent(
+      CreateTestPointerEvent(WebInputEvent::kPointerRawUpdate,
+                             WebPointerProperties::PointerType::kMouse,
+                             WebFloatPoint(150, 200), WebFloatPoint(142, 32),
+                             10, 10),
+      {}, {}));
+  // pointerrawupdate event's movement is independent from pointermoves.
+  ASSERT_EQ(callback->last_screen_x_, 142);
+  ASSERT_EQ(callback->last_screen_y_, 32);
+  ASSERT_EQ(callback->last_movement_x_, 10);
+  ASSERT_EQ(callback->last_movement_y_, 3);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc
index 39ff56b..1b2239b 100644
--- a/third_party/blink/renderer/core/input/scroll_manager.cc
+++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -34,7 +34,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h"
 #include "third_party/blink/renderer/core/scroll/scroll_customization.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/input/touch_event_manager.cc b/third_party/blink/renderer/core/input/touch_event_manager.cc
index df83d3c..0aab096 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager.cc
@@ -20,7 +20,7 @@
 #include "third_party/blink/renderer/core/layout/hit_test_canvas_result.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
diff --git a/third_party/blink/renderer/core/layout/hit_test_cache.cc b/third_party/blink/renderer/core/layout/hit_test_cache.cc
index 5b650e1e..2b53614 100644
--- a/third_party/blink/renderer/core/layout/hit_test_cache.cc
+++ b/third_party/blink/renderer/core/layout/hit_test_cache.cc
@@ -5,7 +5,7 @@
 #include "third_party/blink/renderer/core/layout/hit_test_cache.h"
 
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index 9493b0f..9b8d7b6 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -53,7 +53,7 @@
 #include "third_party/blink/renderer/core/svg/svg_document_extensions.h"
 #include "third_party/blink/renderer/platform/geometry/float_quad.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/core/layout/scroll_anchor.cc b/third_party/blink/renderer/core/layout/scroll_anchor.cc
index 25d5eda..85e2f09d 100644
--- a/third_party/blink/renderer/core/layout/scroll_anchor.cc
+++ b/third_party/blink/renderer/core/layout/scroll_anchor.cc
@@ -19,7 +19,7 @@
 #include "third_party/blink/renderer/core/layout/line/inline_text_box.h"
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
index 66a23138..62d1617 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
@@ -35,7 +35,7 @@
     bool mark_for_invalidation) {
   gradient_map_->clear();
   should_collect_gradient_attributes_ = true;
-  ToSVGGradientElement(*GetElement()).InvalidateDependentGradients();
+  To<SVGGradientElement>(*GetElement()).InvalidateDependentGradients();
   MarkAllClientsForInvalidation(
       mark_for_invalidation ? SVGResourceClient::kPaintInvalidation
                             : SVGResourceClient::kParentOnlyInvalidation);
diff --git a/third_party/blink/renderer/core/layout/svg/svg_text_layout_attributes_builder.cc b/third_party/blink/renderer/core/layout/svg/svg_text_layout_attributes_builder.cc
index 75f374b..c2c4182 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_text_layout_attributes_builder.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_text_layout_attributes_builder.cc
@@ -106,8 +106,7 @@
   DCHECK(node);
   DCHECK(node->IsSVGElement());
 
-  return IsSVGTextPositioningElement(*node) ? ToSVGTextPositioningElement(node)
-                                            : nullptr;
+  return DynamicTo<SVGTextPositioningElement>(node);
 }
 
 void SVGTextLayoutAttributesBuilder::CollectTextPositioningElements(
diff --git a/third_party/blink/renderer/core/loader/cookie_jar.cc b/third_party/blink/renderer/core/loader/cookie_jar.cc
index b359bd8..2445b749 100644
--- a/third_party/blink/renderer/core/loader/cookie_jar.cc
+++ b/third_party/blink/renderer/core/loader/cookie_jar.cc
@@ -6,7 +6,7 @@
 
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index 2f50275..52d540c 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -88,7 +88,7 @@
 #include "third_party/blink/renderer/core/timing/window_performance.h"
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.h"
diff --git a/third_party/blink/renderer/core/loader/interactive_detector.cc b/third_party/blink/renderer/core/loader/interactive_detector.cc
index 3fcb18dd..b63032a 100644
--- a/third_party/blink/renderer/core/loader/interactive_detector.cc
+++ b/third_party/blink/renderer/core/loader/interactive_detector.cc
@@ -9,7 +9,7 @@
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
diff --git a/third_party/blink/renderer/core/loader/resource/font_resource.cc b/third_party/blink/renderer/core/loader/resource/font_resource.cc
index 36e5b47..4d8f1a9e 100644
--- a/third_party/blink/renderer/core/loader/resource/font_resource.cc
+++ b/third_party/blink/renderer/core/loader/resource/font_resource.cc
@@ -29,7 +29,7 @@
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
 #include "third_party/blink/renderer/platform/fonts/font_custom_platform_data.h"
 #include "third_party/blink/renderer/platform/fonts/font_platform_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_client_walker.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.cc b/third_party/blink/renderer/core/loader/resource/image_resource.cc
index 343eba3..ba87072e 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource.cc
@@ -32,7 +32,7 @@
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/core/loader/resource/image_resource_content.h"
 #include "third_party/blink/renderer/core/loader/resource/image_resource_info.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/instance_counters.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index cdc6fbc..04b8d7d 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -14,7 +14,7 @@
 #include "third_party/blink/renderer/platform/geometry/int_size.h"
 #include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
 #include "third_party/blink/renderer/platform/graphics/placeholder_image.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/network/http_parsers.h"
 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
index 16a57b7..29f889eb 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -26,8 +26,8 @@
 #include "third_party/blink/renderer/platform/graphics/image.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
-#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 #include "third_party/skia/include/core/SkSurface.h"
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
index 1f74745..6811af6 100644
--- a/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
+++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc
@@ -19,7 +19,7 @@
 #include "third_party/blink/renderer/core/origin_trials/origin_trials.h"
 #include "third_party/blink/renderer/core/workers/worklet_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/origin_trial_features.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 6005d8c..2df0aef 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -101,7 +101,7 @@
 #include "third_party/blink/renderer/platform/graphics/compositor_element_id.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/graphics/touch_action.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
diff --git a/third_party/blink/renderer/core/page/pointer_lock_controller.cc b/third_party/blink/renderer/core/page/pointer_lock_controller.cc
index d92a9c4..5b281c7e 100644
--- a/third_party/blink/renderer/core/page/pointer_lock_controller.cc
+++ b/third_party/blink/renderer/core/page/pointer_lock_controller.cc
@@ -141,7 +141,7 @@
   if (pointer_lock_document && pointer_lock_document->GetFrame()) {
     pointer_lock_document->GetFrame()
         ->GetEventHandler()
-        .SetMousePositionForPointerUnlock(pointer_lock_screen_position_);
+        .ResetMousePositionForPointerUnlock();
   }
 
   ClearElement();
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
index f967f0c..69a5e32 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -65,7 +65,7 @@
 #include "third_party/blink/renderer/platform/geometry/region.h"
 #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 
diff --git a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
index 9352019f..9684cf97 100644
--- a/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
+++ b/third_party/blink/renderer/core/page/spatial_navigation_controller.cc
@@ -29,7 +29,7 @@
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/page/spatial_navigation.h"
 #include "third_party/blink/renderer/platform/geometry/layout_rect.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 
diff --git a/third_party/blink/renderer/core/page/viewport_description.cc b/third_party/blink/renderer/core/page/viewport_description.cc
index d591eed..3b4ca939 100644
--- a/third_party/blink/renderer/core/page/viewport_description.cc
+++ b/third_party/blink/renderer/core/page/viewport_description.cc
@@ -36,7 +36,7 @@
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/page/page.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
index 261664c3..838e1ea 100644
--- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
+++ b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
@@ -61,7 +61,7 @@
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 
diff --git a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
index 5882516..4c55767 100644
--- a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
+++ b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
@@ -9,7 +9,7 @@
 #include "third_party/blink/renderer/core/css/font_face_set_document.h"
 #include "third_party/blink/renderer/core/paint/paint_timing.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
diff --git a/third_party/blink/renderer/core/paint/paint_timing.cc b/third_party/blink/renderer/core/paint/paint_timing.cc
index 056dd2c..ce45f3e 100644
--- a/third_party/blink/renderer/core/paint/paint_timing.cc
+++ b/third_party/blink/renderer/core/paint/paint_timing.cc
@@ -21,7 +21,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/core/timing/dom_window_performance.h"
 #include "third_party/blink/renderer/core/timing/window_performance.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc
index e573d12..67703f9 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.cc
+++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -18,7 +18,7 @@
 #include "third_party/blink/renderer/core/script/document_write_intervention.h"
 #include "third_party/blink/renderer/core/script/script_loader.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/allowed_by_nosniff.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
diff --git a/third_party/blink/renderer/core/script/html_parser_script_runner.cc b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
index ae1360f..9af0d14 100644
--- a/third_party/blink/renderer/core/script/html_parser_script_runner.cc
+++ b/third_party/blink/renderer/core/script/html_parser_script_runner.cc
@@ -39,7 +39,7 @@
 #include "third_party/blink/renderer/core/script/script_loader.h"
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 
diff --git a/third_party/blink/renderer/core/script/resources/layered_api/kv-storage/index.mjs b/third_party/blink/renderer/core/script/resources/layered_api/kv-storage/index.mjs
index 1c49c51b..88ef25e8 100644
--- a/third_party/blink/renderer/core/script/resources/layered_api/kv-storage/index.mjs
+++ b/third_party/blink/renderer/core/script/resources/layered_api/kv-storage/index.mjs
@@ -152,7 +152,7 @@
   [Symbol.toStringTag]: {writable: false, enumerable: false}
 });
 
-export const storage = new StorageArea(DEFAULT_STORAGE_AREA_NAME);
+export default new StorageArea(DEFAULT_STORAGE_AREA_NAME);
 
 async function performDatabaseOperation(
     promise, setPromise, name, mode, steps) {
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc
index 283b5bb2..4666d85 100644
--- a/third_party/blink/renderer/core/script/script_loader.cc
+++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -51,7 +51,7 @@
 #include "third_party/blink/renderer/core/script/script_runner.h"
 #include "third_party/blink/renderer/core/svg_names.h"
 #include "third_party/blink/renderer/platform/bindings/parkable_string.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
diff --git a/third_party/blink/renderer/core/svg/svg_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_gradient_element.cc
index 3b684b46..c05a4394 100644
--- a/third_party/blink/renderer/core/svg/svg_gradient_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_gradient_element.cc
@@ -81,7 +81,7 @@
   if (!isConnected())
     return;
   Element* target = ObserveTarget(target_id_observer_, *this);
-  if (auto* gradient = ToSVGGradientElementOrNull(target))
+  if (auto* gradient = DynamicTo<SVGGradientElement>(target))
     AddReferenceTo(gradient);
 
   InvalidateGradient(layout_invalidation_reason::kSvgResourceInvalidated);
@@ -160,7 +160,7 @@
 
 void SVGGradientElement::InvalidateDependentGradients() {
   NotifyIncomingReferences([](SVGElement& element) {
-    if (auto* gradient = ToSVGGradientElementOrNull(element)) {
+    if (auto* gradient = DynamicTo<SVGGradientElement>(element)) {
       gradient->InvalidateGradient(
           layout_invalidation_reason::kSvgResourceInvalidated);
     }
@@ -190,7 +190,7 @@
 
 const SVGGradientElement* SVGGradientElement::ReferencedElement() const {
   // Respect xlink:href, take attributes from referenced element.
-  return ToSVGGradientElementOrNull(
+  return DynamicTo<SVGGradientElement>(
       TargetElementFromIRIString(HrefString(), GetTreeScope()));
 }
 
diff --git a/third_party/blink/renderer/core/svg/svg_gradient_element.h b/third_party/blink/renderer/core/svg/svg_gradient_element.h
index 4fac3d3..ba5f6ee 100644
--- a/third_party/blink/renderer/core/svg/svg_gradient_element.h
+++ b/third_party/blink/renderer/core/svg/svg_gradient_element.h
@@ -103,7 +103,13 @@
          element.HasTagName(svg_names::kLinearGradientTag);
 }
 
-DEFINE_SVGELEMENT_TYPE_CASTS_WITH_FUNCTION(SVGGradientElement);
+template <>
+struct DowncastTraits<SVGGradientElement> {
+  static bool AllowFrom(const Node& node) {
+    auto* svg_element = DynamicTo<SVGElement>(node);
+    return svg_element && IsSVGGradientElement(*svg_element);
+  }
+};
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/svg/svg_stop_element.cc b/third_party/blink/renderer/core/svg/svg_stop_element.cc
index 7d73cf8..557ce8d 100644
--- a/third_party/blink/renderer/core/svg/svg_stop_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_stop_element.cc
@@ -51,7 +51,7 @@
   SVGElement::InvalidationGuard invalidation_guard(stop_element);
 
   Element* parent = stop_element->parentElement();
-  if (auto* gradient = ToSVGGradientElementOrNull(parent))
+  if (auto* gradient = DynamicTo<SVGGradientElement>(parent))
     gradient->InvalidateGradient(layout_invalidation_reason::kChildChanged);
 }
 
diff --git a/third_party/blink/renderer/core/svg/svg_text_positioning_element.h b/third_party/blink/renderer/core/svg/svg_text_positioning_element.h
index ac29330..fd26dff 100644
--- a/third_party/blink/renderer/core/svg/svg_text_positioning_element.h
+++ b/third_party/blink/renderer/core/svg/svg_text_positioning_element.h
@@ -57,7 +57,13 @@
   return element.IsTextPositioning();
 }
 
-DEFINE_SVGELEMENT_TYPE_CASTS_WITH_FUNCTION(SVGTextPositioningElement);
+template <>
+struct DowncastTraits<SVGTextPositioningElement> {
+  static bool AllowFrom(const Node& node) {
+    auto* svg_element = DynamicTo<SVGElement>(node);
+    return svg_element && IsSVGTextPositioningElement(*svg_element);
+  }
+};
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/timing/performance_user_timing.cc b/third_party/blink/renderer/core/timing/performance_user_timing.cc
index 5423a97..c097e1b 100644
--- a/third_party/blink/renderer/core/timing/performance_user_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_user_timing.cc
@@ -33,7 +33,7 @@
 #include "third_party/blink/renderer/core/timing/performance_mark_options.h"
 #include "third_party/blink/renderer/core/timing/performance_measure.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc
index c7502b5..d120269 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -41,7 +41,7 @@
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h"
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc
index 9f4f4a7..440dbce 100644
--- a/third_party/blink/renderer/core/workers/worker_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -48,7 +48,7 @@
 #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h"
 #include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/worker_resource_timing_notifier.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
index 3cf125a..e5b327bc 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -72,7 +72,7 @@
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
 #include "third_party/blink/renderer/platform/file_metadata.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h"
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index ce1213e..d167d89 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -40,7 +40,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.cc b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.cc
index 69fb889..5c6779b 100644
--- a/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.cc
+++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.cc
@@ -9,7 +9,7 @@
 #include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h"
 #include "third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.h"
 #include "third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_module.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/document_metadata/copyless_paste_extractor.cc b/third_party/blink/renderer/modules/document_metadata/copyless_paste_extractor.cc
index 6d6517f9..9eb5c313 100644
--- a/third_party/blink/renderer/modules/document_metadata/copyless_paste_extractor.cc
+++ b/third_party/blink/renderer/modules/document_metadata/copyless_paste_extractor.cc
@@ -14,7 +14,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/html_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/json/json_parser.h"
 #include "third_party/blink/renderer/platform/json/json_values.h"
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access_initializer_base.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access_initializer_base.cc
index 10bd288..95be161 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access_initializer_base.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access_initializer_base.cc
@@ -10,7 +10,7 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/modules/encryptedmedia/encrypted_media_utils.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/network/parsed_content_type.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
 
diff --git a/third_party/blink/renderer/modules/geolocation/geo_notifier.cc b/third_party/blink/renderer/modules/geolocation/geo_notifier.cc
index 442b09d..1f2293b 100644
--- a/third_party/blink/renderer/modules/geolocation/geo_notifier.cc
+++ b/third_party/blink/renderer/modules/geolocation/geo_notifier.cc
@@ -9,7 +9,7 @@
 #include "third_party/blink/renderer/modules/geolocation/geolocation.h"
 #include "third_party/blink/renderer/modules/geolocation/position_error.h"
 #include "third_party/blink/renderer/modules/geolocation/position_options.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.cc b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
index d81e2a5..70774d4b 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
@@ -49,7 +49,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database_callbacks_impl.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_transaction_impl.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
index 0608709..c26be77 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
@@ -58,7 +58,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index 1bddfeb9..3d340074 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -48,7 +48,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_database.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "v8/include/v8.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
index 82f441ad..366f4ff 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
@@ -37,7 +37,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_tracing.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
index 9737e69..f49f72f 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
@@ -52,7 +52,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
index 1181fe0f..4b374f0 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
@@ -14,7 +14,7 @@
 #include "third_party/blink/renderer/modules/indexeddb/idb_value.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
diff --git a/third_party/blink/renderer/modules/launch/BUILD.gn b/third_party/blink/renderer/modules/launch/BUILD.gn
index b8307c3..e722c899 100644
--- a/third_party/blink/renderer/modules/launch/BUILD.gn
+++ b/third_party/blink/renderer/modules/launch/BUILD.gn
@@ -10,6 +10,8 @@
     "dom_window_launch_params.h",
     "launch_params.cc",
     "launch_params.h",
+    "web_launch_service_impl.cc",
+    "web_launch_service_impl.h",
   ]
 
   deps = [
diff --git a/third_party/blink/renderer/modules/launch/OWNERS b/third_party/blink/renderer/modules/launch/OWNERS
index e4add89..83bfca7 100644
--- a/third_party/blink/renderer/modules/launch/OWNERS
+++ b/third_party/blink/renderer/modules/launch/OWNERS
@@ -1,4 +1,5 @@
 harrisjay@chromium.org
+raymes@chromium.org
 
 # TEAM: web-apps-platform-team@chromium.org
 # COMPONENT: UI->Browser->WebAppInstalls
\ No newline at end of file
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_params.cc b/third_party/blink/renderer/modules/launch/dom_window_launch_params.cc
index 953a49e..1fbb94f 100644
--- a/third_party/blink/renderer/modules/launch/dom_window_launch_params.cc
+++ b/third_party/blink/renderer/modules/launch/dom_window_launch_params.cc
@@ -24,6 +24,12 @@
   return FromState(&window)->launch_params_;
 }
 
+void DOMWindowLaunchParams::UpdateLaunchFiles(
+    LocalDOMWindow* window,
+    HeapVector<Member<NativeFileSystemHandle>> files) {
+  FromState(window)->launch_params_->SetFiles(std::move(files));
+}
+
 void DOMWindowLaunchParams::Trace(blink::Visitor* visitor) {
   visitor->Trace(launch_params_);
   Supplement<LocalDOMWindow>::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_params.h b/third_party/blink/renderer/modules/launch/dom_window_launch_params.h
index 4208077..881fcb3 100644
--- a/third_party/blink/renderer/modules/launch/dom_window_launch_params.h
+++ b/third_party/blink/renderer/modules/launch/dom_window_launch_params.h
@@ -33,6 +33,9 @@
   // IDL Interface.
   static Member<LaunchParams> launchParams(LocalDOMWindow&);
 
+  static void UpdateLaunchFiles(LocalDOMWindow*,
+                                HeapVector<Member<NativeFileSystemHandle>>);
+
   void Trace(blink::Visitor*) override;
 
  private:
diff --git a/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc b/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc
new file mode 100644
index 0000000..ca5d960
--- /dev/null
+++ b/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc
@@ -0,0 +1,49 @@
+// Copyright 2019 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 "third_party/blink/renderer/modules/launch/web_launch_service_impl.h"
+
+#include <memory>
+
+#include "mojo/public/cpp/bindings/strong_associated_binding.h"
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-blink.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/script/script.h"
+#include "third_party/blink/renderer/modules/launch/dom_window_launch_params.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
+
+namespace blink {
+
+void WebLaunchServiceImpl::Create(
+    LocalFrame* frame,
+    mojom::blink::WebLaunchServiceAssociatedRequest request) {
+  DCHECK(frame);
+
+  mojo::MakeStrongAssociatedBinding(
+      std::make_unique<WebLaunchServiceImpl>(*frame->DomWindow()),
+      std::move(request));
+}
+
+WebLaunchServiceImpl::WebLaunchServiceImpl(LocalDOMWindow& window)
+    : window_(window) {}
+
+WebLaunchServiceImpl::~WebLaunchServiceImpl() = default;
+
+void WebLaunchServiceImpl::SetLaunchFiles(
+    WTF::Vector<mojom::blink::NativeFileSystemEntryPtr> entries) {
+  if (!window_)
+    return;
+
+  HeapVector<Member<NativeFileSystemHandle>> files;
+  for (auto& entry : entries) {
+    files.push_back(NativeFileSystemHandle::CreateFromMojoEntry(
+        std::move(entry), window_->GetExecutionContext()));
+  }
+
+  DOMWindowLaunchParams::UpdateLaunchFiles(window_, std::move(files));
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/launch/web_launch_service_impl.h b/third_party/blink/renderer/modules/launch/web_launch_service_impl.h
new file mode 100644
index 0000000..7898da8
--- /dev/null
+++ b/third_party/blink/renderer/modules/launch/web_launch_service_impl.h
@@ -0,0 +1,40 @@
+// Copyright 2019 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 THIRD_PARTY_BLINK_RENDERER_MODULES_LAUNCH_WEB_LAUNCH_SERVICE_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_LAUNCH_WEB_LAUNCH_SERVICE_IMPL_H_
+
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/web_launch/web_launch.mojom-blink.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
+#include "third_party/blink/renderer/platform/weborigin/kurl.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
+
+namespace blink {
+
+class LocalFrame;
+class LocalDOMWindow;
+
+// Implementation of WebLaunchService, to allow the renderer to receive launch
+// parameters from the browser process.
+class MODULES_EXPORT WebLaunchServiceImpl final
+    : public mojom::blink::WebLaunchService {
+ public:
+  static void Create(LocalFrame* frame,
+                     mojom::blink::WebLaunchServiceAssociatedRequest);
+  explicit WebLaunchServiceImpl(LocalDOMWindow& frame);
+  ~WebLaunchServiceImpl() override;
+
+  // blink::mojom::WebLaunchService:
+  void SetLaunchFiles(
+      WTF::Vector<mojom::blink::NativeFileSystemEntryPtr>) override;
+
+ private:
+  WeakPersistent<LocalDOMWindow> window_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_LAUNCH_WEB_LAUNCH_SERVICE_IMPL_H_
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc
index bbb83413..f19f23b 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc
@@ -14,7 +14,7 @@
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_metrics.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_metrics.h
index a2dd2a3..fdfc3cb 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_metrics.h
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_metrics.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_ELEMENTS_MEDIA_CONTROL_TIMELINE_METRICS_H_
 
 #include "third_party/blink/public/common/screen_orientation/web_screen_orientation_type.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc
index c0b2f16..5a20b8ca 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate.cc
@@ -20,7 +20,7 @@
 #include "third_party/blink/renderer/modules/screen_orientation/screen_orientation.h"
 #include "third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.h"
 #include "third_party/blink/renderer/modules/screen_orientation/web_lock_orientation_callback.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
diff --git a/third_party/blink/renderer/modules/mediasource/media_source.cc b/third_party/blink/renderer/modules/mediasource/media_source.cc
index 5489bc8..685ac52a 100644
--- a/third_party/blink/renderer/modules/mediasource/media_source.cc
+++ b/third_party/blink/renderer/modules/mediasource/media_source.cc
@@ -47,7 +47,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/network/mime/content_type.h"
@@ -413,78 +413,78 @@
                     : web_media_source_->Duration();
 }
 
-TimeRanges* MediaSource::Buffered() const {
+WebTimeRanges MediaSource::BufferedInternal() const {
   // Implements MediaSource algorithm for HTMLMediaElement.buffered.
   // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#htmlmediaelement-extensions
-  HeapVector<Member<TimeRanges>> ranges(active_source_buffers_->length());
+  Vector<WebTimeRanges> ranges(active_source_buffers_->length());
   for (unsigned i = 0; i < active_source_buffers_->length(); ++i)
-    ranges[i] = active_source_buffers_->item(i)->buffered(ASSERT_NO_EXCEPTION);
+    ranges[i] = active_source_buffers_->item(i)->buffered();
+
+  WebTimeRanges intersection_ranges;
 
   // 1. If activeSourceBuffers.length equals 0 then return an empty TimeRanges
   //    object and abort these steps.
   if (ranges.IsEmpty())
-    return MakeGarbageCollected<TimeRanges>();
+    return intersection_ranges;
 
   // 2. Let active ranges be the ranges returned by buffered for each
   //    SourceBuffer object in activeSourceBuffers.
   // 3. Let highest end time be the largest range end time in the active ranges.
   double highest_end_time = -1;
-  for (wtf_size_t i = 0; i < ranges.size(); ++i) {
-    unsigned length = ranges[i]->length();
-    if (length)
-      highest_end_time = std::max(
-          highest_end_time, ranges[i]->end(length - 1, ASSERT_NO_EXCEPTION));
+  for (const WebTimeRanges& source_ranges : ranges) {
+    if (!source_ranges.empty())
+      highest_end_time = std::max(highest_end_time, source_ranges.back().end);
   }
 
   // Return an empty range if all ranges are empty.
   if (highest_end_time < 0)
-    return MakeGarbageCollected<TimeRanges>();
+    return intersection_ranges;
 
   // 4. Let intersection ranges equal a TimeRange object containing a single
   //    range from 0 to highest end time.
-  auto* intersection_ranges =
-      MakeGarbageCollected<TimeRanges>(0, highest_end_time);
+  intersection_ranges.emplace_back(0, highest_end_time);
 
   // 5. For each SourceBuffer object in activeSourceBuffers run the following
   //    steps:
   bool ended = readyState() == EndedKeyword();
-  for (wtf_size_t i = 0; i < ranges.size(); ++i) {
-    // 5.1 Let source ranges equal the ranges returned by the buffered attribute
-    //     on the current SourceBuffer.
-    TimeRanges* source_ranges = ranges[i].Get();
-
+  // 5.1 Let source ranges equal the ranges returned by the buffered attribute
+  //     on the current SourceBuffer.
+  for (WebTimeRanges& source_ranges : ranges) {
     // 5.2 If readyState is "ended", then set the end time on the last range in
     //     source ranges to highest end time.
-    if (ended && source_ranges->length())
-      source_ranges->Add(source_ranges->start(source_ranges->length() - 1,
-                                              ASSERT_NO_EXCEPTION),
-                         highest_end_time);
+    if (ended && !source_ranges.empty())
+      source_ranges.Add(source_ranges.back().start, highest_end_time);
 
     // 5.3 Let new intersection ranges equal the the intersection between the
     //     intersection ranges and the source ranges.
     // 5.4 Replace the ranges in intersection ranges with the new intersection
     //     ranges.
-    intersection_ranges->IntersectWith(source_ranges);
+    intersection_ranges.IntersectWith(source_ranges);
   }
 
   return intersection_ranges;
 }
 
-TimeRanges* MediaSource::Seekable() const {
+TimeRanges* MediaSource::Buffered() const {
+  return MakeGarbageCollected<TimeRanges>(BufferedInternal());
+}
+
+WebTimeRanges MediaSource::SeekableInternal() const {
   DCHECK(attached_element_)
       << "Seekable should only be used when attached to HTMLMediaElement";
 
   // Implements MediaSource algorithm for HTMLMediaElement.seekable.
   // http://w3c.github.io/media-source/#htmlmediaelement-extensions
+  WebTimeRanges ranges;
 
   double source_duration = duration();
   // If duration equals NaN: Return an empty TimeRanges object.
   if (std::isnan(source_duration))
-    return MakeGarbageCollected<TimeRanges>();
+    return ranges;
 
   // If duration equals positive Infinity:
   if (source_duration == std::numeric_limits<double>::infinity()) {
-    TimeRanges* buffered = Buffered();
+    WebTimeRanges buffered = BufferedInternal();
 
     // 1. If live seekable range is not empty:
     if (live_seekable_range_->length() != 0) {
@@ -493,33 +493,39 @@
       // 1.2. Return a single range with a start time equal to the
       //      earliest start time in union ranges and an end time equal to
       //      the highest end time in union ranges and abort these steps.
-      if (buffered->length() == 0) {
-        return MakeGarbageCollected<TimeRanges>(
-            live_seekable_range_->start(0, ASSERT_NO_EXCEPTION),
-            live_seekable_range_->end(0, ASSERT_NO_EXCEPTION));
+      if (buffered.empty()) {
+        ranges.emplace_back(live_seekable_range_->start(0, ASSERT_NO_EXCEPTION),
+                            live_seekable_range_->end(0, ASSERT_NO_EXCEPTION));
+        return ranges;
       }
 
-      return MakeGarbageCollected<TimeRanges>(
+      ranges.emplace_back(
           std::min(live_seekable_range_->start(0, ASSERT_NO_EXCEPTION),
-                   buffered->start(0, ASSERT_NO_EXCEPTION)),
+                   buffered.front().start),
           std::max(live_seekable_range_->end(0, ASSERT_NO_EXCEPTION),
-                   buffered->end(buffered->length() - 1, ASSERT_NO_EXCEPTION)));
+                   buffered.back().end));
+      return ranges;
     }
     // 2. If the HTMLMediaElement.buffered attribute returns an empty TimeRanges
     //    object, then return an empty TimeRanges object and abort these steps.
-    if (buffered->length() == 0)
-      return MakeGarbageCollected<TimeRanges>();
+    if (buffered.empty())
+      return ranges;
 
     // 3. Return a single range with a start time of 0 and an end time equal to
     //    the highest end time reported by the HTMLMediaElement.buffered
     //    attribute.
-    return MakeGarbageCollected<TimeRanges>(
-        0, buffered->end(buffered->length() - 1, ASSERT_NO_EXCEPTION));
+    ranges.emplace_back(0, buffered.back().end);
+    return ranges;
   }
 
   // 3. Otherwise: Return a single range with a start time of 0 and an end time
   //    equal to duration.
-  return MakeGarbageCollected<TimeRanges>(0, source_duration);
+  ranges.emplace_back(0, source_duration);
+  return ranges;
+}
+
+TimeRanges* MediaSource::Seekable() const {
+  return MakeGarbageCollected<TimeRanges>(SeekableInternal());
 }
 
 void MediaSource::OnTrackChanged(TrackBase* track) {
diff --git a/third_party/blink/renderer/modules/mediasource/media_source.h b/third_party/blink/renderer/modules/mediasource/media_source.h
index 09ad272..09e5867 100644
--- a/third_party/blink/renderer/modules/mediasource/media_source.h
+++ b/third_party/blink/renderer/modules/mediasource/media_source.h
@@ -99,6 +99,8 @@
   void Close() override;
   bool IsClosed() const override;
   double duration() const override;
+  WebTimeRanges BufferedInternal() const override;
+  WebTimeRanges SeekableInternal() const override;
   TimeRanges* Buffered() const override;
   TimeRanges* Seekable() const override;
   void OnTrackChanged(TrackBase*) override;
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer.cc b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
index 69420c27a..3683058 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer.cc
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
@@ -232,6 +232,10 @@
   return MakeGarbageCollected<TimeRanges>(web_source_buffer_->Buffered());
 }
 
+WebTimeRanges SourceBuffer::buffered() const {
+  return web_source_buffer_->Buffered();
+}
+
 double SourceBuffer::timestampOffset() const {
   return timestamp_offset_;
 }
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer.h b/third_party/blink/renderer/modules/mediasource/source_buffer.h
index 4da35f5..8b8319a4 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer.h
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer.h
@@ -77,6 +77,7 @@
   void setMode(const AtomicString&, ExceptionState&);
   bool updating() const { return updating_; }
   TimeRanges* buffered(ExceptionState&) const;
+  WebTimeRanges buffered() const;
   double timestampOffset() const;
   void setTimestampOffset(double, ExceptionState&);
   void appendBuffer(DOMArrayBuffer* data, ExceptionState&);
diff --git a/third_party/blink/renderer/modules/modules_initializer.cc b/third_party/blink/renderer/modules/modules_initializer.cc
index 44a0fc27..97fe7dc 100644
--- a/third_party/blink/renderer/modules/modules_initializer.cc
+++ b/third_party/blink/renderer/modules/modules_initializer.cc
@@ -58,12 +58,11 @@
 #include "third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h"
 #include "third_party/blink/renderer/modules/installation/installation_service_impl.h"
 #include "third_party/blink/renderer/modules/installedapp/installed_app_controller.h"
+#include "third_party/blink/renderer/modules/launch/web_launch_service_impl.h"
 #include "third_party/blink/renderer/modules/manifest/manifest_manager.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_client.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h"
-#include "third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.h"
-#include "third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils_client.h"
 #include "third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.h"
 #include "third_party/blink/renderer/modules/presentation/presentation_controller.h"
 #include "third_party/blink/renderer/modules/presentation/presentation_receiver.h"
@@ -78,7 +77,7 @@
 #include "third_party/blink/renderer/modules/storage/storage_namespace.h"
 #include "third_party/blink/renderer/modules/vr/navigator_vr.h"
 #include "third_party/blink/renderer/modules/vr/vr_controller.h"
-#include "third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h"
 #include "third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.h"
 #include "third_party/blink/renderer/modules/webdatabase/database_client.h"
 #include "third_party/blink/renderer/modules/webdatabase/database_manager.h"
@@ -162,6 +161,10 @@
     frame.GetInterfaceRegistry()->AddInterface(WTF::BindRepeating(
         &CopylessPasteServer::BindMojoRequest, WrapWeakPersistent(&frame)));
   }
+  if (RuntimeEnabledFeatures::FileHandlingEnabled()) {
+    frame.GetInterfaceRegistry()->AddAssociatedInterface(WTF::BindRepeating(
+        &WebLaunchServiceImpl::Create, WrapWeakPersistent(&frame)));
+  }
   frame.GetInterfaceRegistry()->AddInterface(WTF::BindRepeating(
       &InstallationServiceImpl::Create, WrapWeakPersistent(&frame)));
   // TODO(dominickn): This interface should be document-scoped rather than
@@ -183,9 +186,6 @@
       frame, std::make_unique<UserMediaClient>(client->UserMediaClient()));
   ProvideIndexedDBClientTo(frame, MakeGarbageCollected<IndexedDBClient>(frame));
   ProvideLocalFileSystemTo(frame, std::make_unique<LocalFileSystemClient>());
-  NavigatorContentUtils::ProvideTo(
-      *frame.DomWindow()->navigator(),
-      MakeGarbageCollected<NavigatorContentUtilsClient>(web_frame));
 
   ScreenOrientationControllerImpl::ProvideTo(frame);
   if (RuntimeEnabledFeatures::PresentationEnabled())
@@ -298,7 +298,7 @@
   ::blink::ProvideDatabaseClientTo(page,
                                    MakeGarbageCollected<DatabaseClient>());
   StorageNamespace::ProvideSessionStorageNamespaceTo(page, client);
-  BaseAudioContextTracker::ProvideToPage(page);
+  AudioGraphTracer::ProvideAudioGraphTracerTo(page);
 }
 
 void ModulesInitializer::ForceNextWebGLContextCreationToFail() const {
diff --git a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
index b969e52..eda1a577 100644
--- a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
+++ b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.cc
@@ -29,6 +29,8 @@
 #include "base/stl_util.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
+#include "third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils_client.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -37,6 +39,8 @@
 
 namespace blink {
 
+const char NavigatorContentUtils::kSupplementName[] = "NavigatorContentUtils";
+
 static const HashSet<String>& SupportedSchemes() {
   DEFINE_STATIC_LOCAL(
       HashSet<String>, supported_schemes,
@@ -117,8 +121,18 @@
   return false;
 }
 
-NavigatorContentUtils* NavigatorContentUtils::From(Navigator& navigator) {
-  return Supplement<Navigator>::From<NavigatorContentUtils>(navigator);
+NavigatorContentUtils& NavigatorContentUtils::From(Navigator& navigator,
+                                                   LocalFrame& frame) {
+  NavigatorContentUtils* navigator_content_utils =
+      Supplement<Navigator>::From<NavigatorContentUtils>(navigator);
+  if (!navigator_content_utils) {
+    WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(&frame);
+    navigator_content_utils = MakeGarbageCollected<NavigatorContentUtils>(
+        navigator,
+        MakeGarbageCollected<NavigatorContentUtilsClient>(web_frame));
+    ProvideTo(navigator, navigator_content_utils);
+  }
+  return *navigator_content_utils;
 }
 
 NavigatorContentUtils::~NavigatorContentUtils() = default;
@@ -129,10 +143,10 @@
     const String& url,
     const String& title,
     ExceptionState& exception_state) {
-  if (!navigator.GetFrame())
+  LocalFrame* frame = navigator.GetFrame();
+  if (!frame)
     return;
-
-  Document* document = navigator.GetFrame()->GetDocument();
+  Document* document = frame->GetDocument();
   DCHECK(document);
 
   if (!VerifyCustomHandlerURL(*document, url, exception_state))
@@ -147,8 +161,9 @@
                         ? WebFeature::kRegisterProtocolHandlerSecureOrigin
                         : WebFeature::kRegisterProtocolHandlerInsecureOrigin);
 
-  NavigatorContentUtils::From(navigator)->Client()->RegisterProtocolHandler(
-      scheme, document->CompleteURL(url), title);
+  NavigatorContentUtils::From(navigator, *frame)
+      .Client()
+      ->RegisterProtocolHandler(scheme, document->CompleteURL(url), title);
 }
 
 void NavigatorContentUtils::unregisterProtocolHandler(
@@ -156,10 +171,10 @@
     const String& scheme,
     const String& url,
     ExceptionState& exception_state) {
-  if (!navigator.GetFrame())
+  LocalFrame* frame = navigator.GetFrame();
+  if (!frame)
     return;
-
-  Document* document = navigator.GetFrame()->GetDocument();
+  Document* document = frame->GetDocument();
   DCHECK(document);
 
   if (!VerifyCustomHandlerURL(*document, url, exception_state))
@@ -168,8 +183,9 @@
   if (!VerifyCustomHandlerScheme(scheme, exception_state))
     return;
 
-  NavigatorContentUtils::From(navigator)->Client()->UnregisterProtocolHandler(
-      scheme, document->CompleteURL(url));
+  NavigatorContentUtils::From(navigator, *frame)
+      .Client()
+      ->UnregisterProtocolHandler(scheme, document->CompleteURL(url));
 }
 
 void NavigatorContentUtils::Trace(blink::Visitor* visitor) {
@@ -177,13 +193,4 @@
   Supplement<Navigator>::Trace(visitor);
 }
 
-const char NavigatorContentUtils::kSupplementName[] = "NavigatorContentUtils";
-
-void NavigatorContentUtils::ProvideTo(Navigator& navigator,
-                                      NavigatorContentUtilsClient* client) {
-  Supplement<Navigator>::ProvideTo(
-      navigator,
-      MakeGarbageCollected<NavigatorContentUtils>(navigator, client));
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.h b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.h
index c8044252..32a4bc3e 100644
--- a/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.h
+++ b/third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils.h
@@ -29,7 +29,6 @@
 
 #include "third_party/blink/renderer/core/frame/navigator.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
-#include "third_party/blink/renderer/modules/navigatorcontentutils/navigator_content_utils_client.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/supplementable.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
@@ -37,7 +36,10 @@
 namespace blink {
 
 class ExceptionState;
+class NavigatorContentUtilsClient;
 
+// It is owned by Navigator, and an instance is created lazily by calling
+// NavigatorContentUtils::From() via [register/unregister]ProtocolHandler.
 class MODULES_EXPORT NavigatorContentUtils final
     : public GarbageCollectedFinalized<NavigatorContentUtils>,
       public Supplement<Navigator> {
@@ -51,8 +53,6 @@
       : Supplement<Navigator>(navigator), client_(client) {}
   virtual ~NavigatorContentUtils();
 
-  static NavigatorContentUtils* From(Navigator&);
-
   static void registerProtocolHandler(Navigator&,
                                       const String& scheme,
                                       const String& url,
@@ -63,8 +63,6 @@
                                         const String& url,
                                         ExceptionState&);
 
-  static void ProvideTo(Navigator&, NavigatorContentUtilsClient*);
-
   void Trace(blink::Visitor*) override;
 
   void SetClientForTest(NavigatorContentUtilsClient* client) {
@@ -72,6 +70,8 @@
   }
 
  private:
+  static NavigatorContentUtils& From(Navigator&, LocalFrame& frame);
+
   NavigatorContentUtilsClient* Client() { return client_.Get(); }
 
   Member<NavigatorContentUtilsClient> client_;
diff --git a/third_party/blink/renderer/modules/notifications/notification_manager.cc b/third_party/blink/renderer/modules/notifications/notification_manager.cc
index 6aa4311..a99d621 100644
--- a/third_party/blink/renderer/modules/notifications/notification_manager.cc
+++ b/third_party/blink/renderer/modules/notifications/notification_manager.cc
@@ -23,7 +23,7 @@
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
diff --git a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
index 75a2a8515..1cde762 100644
--- a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
+++ b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
@@ -17,7 +17,7 @@
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index 53fe6a29c4..6049ac24 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -106,7 +106,7 @@
 #include "third_party/blink/renderer/modules/service_worker/wait_until_observer.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
diff --git a/third_party/blink/renderer/modules/vibration/navigator_vibration.cc b/third_party/blink/renderer/modules/vibration/navigator_vibration.cc
index fa01028..e668aa4 100644
--- a/third_party/blink/renderer/modules/vibration/navigator_vibration.cc
+++ b/third_party/blink/renderer/modules/vibration/navigator_vibration.cc
@@ -30,7 +30,7 @@
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/modules/vibration/vibration_controller.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/vr/vr_display.cc b/third_party/blink/renderer/modules/vr/vr_display.cc
index 1d8a68ba..a1675065 100644
--- a/third_party/blink/renderer/modules/vr/vr_display.cc
+++ b/third_party/blink/renderer/modules/vr/vr_display.cc
@@ -37,7 +37,7 @@
 #include "third_party/blink/renderer/modules/vr/vr_stage_parameters.h"
 #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
diff --git a/third_party/blink/renderer/modules/webaudio/BUILD.gn b/third_party/blink/renderer/modules/webaudio/BUILD.gn
index fe94c1a..bb3177bf 100644
--- a/third_party/blink/renderer/modules/webaudio/BUILD.gn
+++ b/third_party/blink/renderer/modules/webaudio/BUILD.gn
@@ -22,6 +22,8 @@
     "audio_context.h",
     "audio_destination_node.cc",
     "audio_destination_node.h",
+    "audio_graph_tracer.cc",
+    "audio_graph_tracer.h",
     "audio_listener.cc",
     "audio_listener.h",
     "audio_node.cc",
@@ -63,8 +65,6 @@
     "audio_worklet_thread.h",
     "base_audio_context.cc",
     "base_audio_context.h",
-    "base_audio_context_tracker.cc",
-    "base_audio_context_tracker.h",
     "biquad_dsp_kernel.cc",
     "biquad_dsp_kernel.h",
     "biquad_filter_node.cc",
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
index c573d6c..0a40d0d 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -31,7 +31,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.cc b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc
similarity index 60%
rename from third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.cc
rename to third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc
index 28350b8..8685c90 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.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 "third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h"
 
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -12,23 +12,22 @@
 
 namespace blink {
 
-const char BaseAudioContextTracker::kSupplementName[] =
-    "BaseAudioContextTracker";
+const char AudioGraphTracer::kSupplementName[] = "AudioGraphTracer";
 
-void BaseAudioContextTracker::ProvideToPage(Page& page) {
-  page.ProvideSupplement(MakeGarbageCollected<BaseAudioContextTracker>());
+void AudioGraphTracer::ProvideAudioGraphTracerTo(Page& page) {
+  page.ProvideSupplement(MakeGarbageCollected<AudioGraphTracer>());
 }
 
-BaseAudioContextTracker::BaseAudioContextTracker()
+AudioGraphTracer::AudioGraphTracer()
     : inspector_agent_(nullptr) {}
 
-void BaseAudioContextTracker::Trace(blink::Visitor* visitor) {
+void AudioGraphTracer::Trace(blink::Visitor* visitor) {
   visitor->Trace(inspector_agent_);
   visitor->Trace(contexts_);
   Supplement<Page>::Trace(visitor);
 }
 
-void BaseAudioContextTracker::SetInspectorAgent(InspectorWebAudioAgent* agent) {
+void AudioGraphTracer::SetInspectorAgent(InspectorWebAudioAgent* agent) {
   inspector_agent_ = agent;
   if (!inspector_agent_)
     return;
@@ -36,7 +35,7 @@
     inspector_agent_->DidCreateBaseAudioContext(context);
 }
 
-void BaseAudioContextTracker::DidCreateBaseAudioContext(
+void AudioGraphTracer::DidCreateBaseAudioContext(
     BaseAudioContext* context) {
   DCHECK(!contexts_.Contains(context));
 
@@ -45,7 +44,7 @@
     inspector_agent_->DidCreateBaseAudioContext(context);
 }
 
-void BaseAudioContextTracker::DidDestroyBaseAudioContext(
+void AudioGraphTracer::DidDestroyBaseAudioContext(
     BaseAudioContext* context) {
   DCHECK(contexts_.Contains(context));
 
@@ -54,7 +53,7 @@
     inspector_agent_->DidDestroyBaseAudioContext(context);
 }
 
-void BaseAudioContextTracker::DidChangeBaseAudioContext(
+void AudioGraphTracer::DidChangeBaseAudioContext(
     BaseAudioContext* context) {
   DCHECK(contexts_.Contains(context));
 
@@ -62,7 +61,7 @@
     inspector_agent_->DidChangeBaseAudioContext(context);
 }
 
-BaseAudioContext* BaseAudioContextTracker::GetContextById(String contextId) {
+BaseAudioContext* AudioGraphTracer::GetContextById(String contextId) {
   for (const auto& context : contexts_) {
     if (context->Uuid() == contextId)
       return context;
@@ -71,13 +70,13 @@
   return nullptr;
 }
 
-BaseAudioContextTracker* BaseAudioContextTracker::FromPage(Page* page) {
-  return Supplement<Page>::From<BaseAudioContextTracker>(page);
+AudioGraphTracer* AudioGraphTracer::FromPage(Page* page) {
+  return Supplement<Page>::From<AudioGraphTracer>(page);
 }
 
-BaseAudioContextTracker* BaseAudioContextTracker::FromDocument(
+AudioGraphTracer* AudioGraphTracer::FromDocument(
     const Document& document) {
-  return BaseAudioContextTracker::FromPage(document.GetPage());
+  return AudioGraphTracer::FromPage(document.GetPage());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h
similarity index 69%
rename from third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h
rename to third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h
index dacf4e0..f58ec724 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.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 THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_BASE_AUDIO_CONTEXT_TRACKER_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_BASE_AUDIO_CONTEXT_TRACKER_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_GRAPH_TRACER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_GRAPH_TRACER_H_
 
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
@@ -18,17 +18,17 @@
 class InspectorWebAudioAgent;
 class Page;
 
-class MODULES_EXPORT BaseAudioContextTracker final
-    : public GarbageCollected<BaseAudioContextTracker>,
+class MODULES_EXPORT AudioGraphTracer final
+    : public GarbageCollected<AudioGraphTracer>,
       public Supplement<Page> {
-  USING_GARBAGE_COLLECTED_MIXIN(BaseAudioContextTracker);
+  USING_GARBAGE_COLLECTED_MIXIN(AudioGraphTracer);
 
  public:
   static const char kSupplementName[];
 
-  static void ProvideToPage(Page&);
+  static void ProvideAudioGraphTracerTo(Page&);
 
-  BaseAudioContextTracker();
+  AudioGraphTracer();
 
   void Trace(blink::Visitor*) override;
 
@@ -45,8 +45,8 @@
 
   BaseAudioContext* GetContextById(const String contextId);
 
-  static BaseAudioContextTracker* FromPage(Page*);
-  static BaseAudioContextTracker* FromDocument(const Document&);
+  static AudioGraphTracer* FromPage(Page*);
+  static AudioGraphTracer* FromDocument(const Document&);
 
  private:
   Member<InspectorWebAudioAgent> inspector_agent_;
@@ -55,4 +55,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_BASE_AUDIO_CONTEXT_TRACKER_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_GRAPH_TRACER_H_
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param.cc b/third_party/blink/renderer/modules/webaudio/audio_param.cc
index b2e176ba..c908f0b 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_param.cc
@@ -30,7 +30,7 @@
 #include "third_party/blink/renderer/modules/webaudio/audio_node_output.h"
 #include "third_party/blink/renderer/platform/audio/audio_utilities.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param_map.h b/third_party/blink/renderer/modules/webaudio/audio_param_map.h
index 8d16542..e6203469 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param_map.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_param_map.h
@@ -22,14 +22,14 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit AudioParamMap(
-      const HeapHashMap<String, Member<AudioParam>>& parameter_map);
+  using MapType = HeapHashMap<String, Member<AudioParam>>;
+
+  explicit AudioParamMap(const MapType& parameter_map);
 
   // IDL attributes / methods
   uint32_t size() const { return parameter_map_.size(); }
 
-  AudioParam* At(String name) { return parameter_map_.at(name); }
-  bool Contains(String name) { return parameter_map_.Contains(name); }
+  const MapType& GetHashMap() const { return parameter_map_; }
 
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(parameter_map_);
@@ -45,7 +45,7 @@
                    AudioParam*&,
                    ExceptionState&) override;
 
-  const HeapHashMap<String, Member<AudioParam>> parameter_map_;
+  const MapType parameter_map_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
index 69c0bc3..8614551 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -40,13 +40,13 @@
 #include "third_party/blink/renderer/modules/webaudio/audio_buffer.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_context.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_listener.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_input.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_output.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_worklet.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.h"
-#include "third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h"
 #include "third_party/blink/renderer/modules/webaudio/biquad_filter_node.h"
 #include "third_party/blink/renderer/modules/webaudio/channel_merger_node.h"
 #include "third_party/blink/renderer/modules/webaudio/channel_splitter_node.h"
@@ -73,7 +73,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/uuid.h"
@@ -138,8 +138,8 @@
     // only create the listener if the destination node exists.
     listener_ = MakeGarbageCollected<AudioListener>(*this);
 
-    if (Tracker())
-      Tracker()->DidCreateBaseAudioContext(this);
+    if (GraphTracer())
+      GraphTracer()->DidCreateBaseAudioContext(this);
 
     FFTFrame::Initialize(sampleRate());
   }
@@ -162,8 +162,8 @@
   // BaseAudioContextTracker needs a valid AudioDestinationNode because it
   // may use destination-related data (e.g. sample rate and channel count)
   // to populate the devtool protocol object.
-  if (Tracker())
-    Tracker()->DidDestroyBaseAudioContext(this);
+  if (GraphTracer())
+    GraphTracer()->DidDestroyBaseAudioContext(this);
 
   // This stops the audio thread and all audio rendering.
   if (destination_node_)
@@ -655,8 +655,8 @@
         ->PostTask(FROM_HERE, WTF::Bind(&BaseAudioContext::NotifyStateChange,
                                         WrapPersistent(this)));
 
-    if (Tracker())
-      Tracker()->DidChangeBaseAudioContext(this);
+    if (GraphTracer())
+      GraphTracer()->DidChangeBaseAudioContext(this);
   }
 }
 
@@ -891,8 +891,8 @@
   return destination_handler.GetCallbackBufferSize();
 }
 
-BaseAudioContextTracker* BaseAudioContext::Tracker() {
-  return BaseAudioContextTracker::FromDocument(*GetDocument());
+AudioGraphTracer* BaseAudioContext::GraphTracer() {
+  return AudioGraphTracer::FromDocument(*GetDocument());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
index 0309ad88..510a699 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
@@ -60,10 +60,10 @@
 class AudioBuffer;
 class AudioBufferSourceNode;
 class AudioContextOptions;
+class AudioGraphTracer;
 class AudioListener;
 class AudioWorklet;
 class BiquadFilterNode;
-class BaseAudioContextTracker;
 class ChannelMergerNode;
 class ChannelSplitterNode;
 class ConstantSourceNode;
@@ -377,7 +377,7 @@
 
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
-  BaseAudioContextTracker* Tracker();
+  AudioGraphTracer* GraphTracer();
 
  private:
   // Unique ID for each context.
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
index 0d45fab6..00d2b9b 100644
--- a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
@@ -33,7 +33,7 @@
 #include "third_party/blink/renderer/modules/webaudio/biquad_filter_options.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 
diff --git a/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc b/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc
index b56c324..88b1026 100644
--- a/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc
@@ -12,7 +12,7 @@
 #include "third_party/blink/renderer/modules/webaudio/iir_filter_options.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 
diff --git a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
index 2bc56e5f..60affe8 100644
--- a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
+++ b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_context.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_graph_tracer.h"
 
 namespace blink {
 
@@ -49,16 +50,16 @@
   if (!enabled_.Get())
     return;
 
-  BaseAudioContextTracker* tracker = BaseAudioContextTracker::FromPage(page_);
-  tracker->SetInspectorAgent(this);
+  AudioGraphTracer* graph_tracer = AudioGraphTracer::FromPage(page_);
+  graph_tracer->SetInspectorAgent(this);
 }
 
 Response InspectorWebAudioAgent::enable() {
   if (enabled_.Get())
     return Response::OK();
   enabled_.Set(true);
-  BaseAudioContextTracker* tracker = BaseAudioContextTracker::FromPage(page_);
-  tracker->SetInspectorAgent(this);
+  AudioGraphTracer* graph_tracer = AudioGraphTracer::FromPage(page_);
+  graph_tracer->SetInspectorAgent(this);
   return Response::OK();
 }
 
@@ -66,19 +67,19 @@
   if (!enabled_.Get())
     return Response::OK();
   enabled_.Clear();
-  BaseAudioContextTracker* tracker = BaseAudioContextTracker::FromPage(page_);
-  tracker->SetInspectorAgent(nullptr);
+  AudioGraphTracer* graph_tracer = AudioGraphTracer::FromPage(page_);
+  graph_tracer->SetInspectorAgent(nullptr);
   return Response::OK();
 }
 
 Response InspectorWebAudioAgent::getRealtimeData(
     const protocol::WebAudio::ContextId& contextId,
     std::unique_ptr<ContextRealtimeData>* out_data) {
-  auto* const tracker = BaseAudioContextTracker::FromPage(page_);
+  auto* const graph_tracer = AudioGraphTracer::FromPage(page_);
   if (!enabled_.Get())
     return Response::Error("Enable agent first.");
 
-  BaseAudioContext* context = tracker->GetContextById(contextId);
+  BaseAudioContext* context = graph_tracer->GetContextById(contextId);
   if (!context)
     return Response::Error("Cannot find BaseAudioContext with such id.");
 
diff --git a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.h b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.h
index 7685da7..b4f2c82f9 100644
--- a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.h
+++ b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.h
@@ -9,7 +9,6 @@
 #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h"
 #include "third_party/blink/renderer/core/inspector/protocol/WebAudio.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
-#include "third_party/blink/renderer/modules/webaudio/base_audio_context_tracker.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
index 672d1b4..d5e89b6 100644
--- a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
@@ -39,7 +39,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/webaudio/panner_node.cc b/third_party/blink/renderer/modules/webaudio/panner_node.cc
index 0bf9c27..621b0a84 100644
--- a/third_party/blink/renderer/modules/webaudio/panner_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/panner_node.cc
@@ -34,7 +34,7 @@
 #include "third_party/blink/renderer/platform/audio/hrtf_panner.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
index b166bef0..7f6ee13 100644
--- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
+++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
@@ -289,9 +289,6 @@
 
 template <>
 DawnLoadOp AsDawnEnum<DawnLoadOp>(const WTF::String& webgpu_enum) {
-  if (webgpu_enum == "clear") {
-    return DAWN_LOAD_OP_CLEAR;
-  }
   if (webgpu_enum == "load") {
     return DAWN_LOAD_OP_LOAD;
   }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc b/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc
index ab00b09..8979952 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc
@@ -32,9 +32,22 @@
   dawn_desc.resolveTarget = webgpu_desc->resolveTarget()
                                 ? webgpu_desc->resolveTarget()->GetHandle()
                                 : nullptr;
-  dawn_desc.loadOp = AsDawnEnum<DawnLoadOp>(webgpu_desc->loadOp());
+
+  if (webgpu_desc->loadValue().IsGPULoadOp()) {
+    const WTF::String& gpuLoadOp = webgpu_desc->loadValue().GetAsGPULoadOp();
+    dawn_desc.loadOp = AsDawnEnum<DawnLoadOp>(gpuLoadOp);
+    dawn_desc.clearColor = AsDawnType(GPUColor::Create());
+
+  } else if (webgpu_desc->loadValue().IsGPUColor()) {
+    GPUColor* gpuColor = webgpu_desc->loadValue().GetAsGPUColor();
+    dawn_desc.loadOp = DAWN_LOAD_OP_CLEAR;
+    dawn_desc.clearColor = AsDawnType(gpuColor);
+
+  } else {
+    NOTREACHED();
+  }
+
   dawn_desc.storeOp = AsDawnEnum<DawnStoreOp>(webgpu_desc->storeOp());
-  dawn_desc.clearColor = AsDawnType(webgpu_desc->clearColor());
 
   return dawn_desc;
 }
@@ -47,14 +60,39 @@
 
   DawnRenderPassDepthStencilAttachmentDescriptor dawn_desc = {};
   dawn_desc.attachment = webgpu_desc->attachment()->GetHandle();
-  dawn_desc.depthLoadOp = AsDawnEnum<DawnLoadOp>(webgpu_desc->depthLoadOp());
+
+  if (webgpu_desc->depthLoadValue().IsGPULoadOp()) {
+    const WTF::String& gpuLoadOp =
+        webgpu_desc->depthLoadValue().GetAsGPULoadOp();
+    dawn_desc.depthLoadOp = AsDawnEnum<DawnLoadOp>(gpuLoadOp);
+    dawn_desc.clearDepth = 1.0f;
+
+  } else if (webgpu_desc->depthLoadValue().IsFloat()) {
+    dawn_desc.depthLoadOp = DAWN_LOAD_OP_CLEAR;
+    dawn_desc.clearDepth = webgpu_desc->depthLoadValue().GetAsFloat();
+
+  } else {
+    NOTREACHED();
+  }
+
   dawn_desc.depthStoreOp = AsDawnEnum<DawnStoreOp>(webgpu_desc->depthStoreOp());
-  dawn_desc.clearDepth = webgpu_desc->clearDepth();
-  dawn_desc.stencilLoadOp =
-      AsDawnEnum<DawnLoadOp>(webgpu_desc->stencilLoadOp());
+
+  if (webgpu_desc->stencilLoadValue().IsGPULoadOp()) {
+    const WTF::String& gpuLoadOp =
+        webgpu_desc->stencilLoadValue().GetAsGPULoadOp();
+    dawn_desc.stencilLoadOp = AsDawnEnum<DawnLoadOp>(gpuLoadOp);
+    dawn_desc.clearStencil = 0;
+
+  } else if (webgpu_desc->stencilLoadValue().IsLong()) {
+    dawn_desc.stencilLoadOp = DAWN_LOAD_OP_CLEAR;
+    dawn_desc.clearStencil = webgpu_desc->stencilLoadValue().GetAsLong();
+
+  } else {
+    NOTREACHED();
+  }
+
   dawn_desc.stencilStoreOp =
       AsDawnEnum<DawnStoreOp>(webgpu_desc->stencilStoreOp());
-  dawn_desc.clearStencil = webgpu_desc->clearStencil();
 
   return dawn_desc;
 }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_color_attachment_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_color_attachment_descriptor.idl
index 142ff6a..0ef1e596 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_color_attachment_descriptor.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_color_attachment_descriptor.idl
@@ -8,7 +8,6 @@
     required GPUTextureView attachment;
     GPUTextureView? resolveTarget = null;
 
-    required GPULoadOp loadOp;
+    required (GPULoadOp or GPUColor) loadValue;
     required GPUStoreOp storeOp;
-    required GPUColor clearColor;
 };
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_depth_stencil_attachment_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_depth_stencil_attachment_descriptor.idl
index d9b435b..155dc46 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_depth_stencil_attachment_descriptor.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_depth_stencil_attachment_descriptor.idl
@@ -7,11 +7,9 @@
 dictionary GPURenderPassDepthStencilAttachmentDescriptor {
     required GPUTextureView attachment;
 
-    required GPULoadOp depthLoadOp;
+    required (GPULoadOp or float) depthLoadValue;
     required GPUStoreOp depthStoreOp;
-    required float clearDepth;
 
-    required GPULoadOp stencilLoadOp;
+    required (GPULoadOp or long) stencilLoadValue;
     required GPUStoreOp stencilStoreOp;
-    unsigned long clearStencil = 0;
 };
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_descriptor.idl
index 72ea59cb..2508ef96 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_render_pass_descriptor.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pass_descriptor.idl
@@ -10,7 +10,6 @@
 };
 
 enum GPULoadOp {
-    "clear",
     "load"
 };
 
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.cc b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
index bbf03d1..6ccae4a 100644
--- a/third_party/blink/renderer/modules/websockets/dom_websocket.cc
+++ b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
@@ -55,7 +55,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/mixed_content_autoupgrade_status.h"
 #include "third_party/blink/renderer/platform/network/network_log.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index a764b5e..0764cc8 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -549,6 +549,7 @@
     "exported/web_surface_layer_bridge.cc",
     "exported/web_text_run.cc",
     "exported/web_thread_safe_data.cc",
+    "exported/web_time_range.cc",
     "exported/web_url.cc",
     "exported/web_url_error.cc",
     "exported/web_url_load_timing.cc",
@@ -1121,8 +1122,6 @@
     "graphics/video_frame_submitter.h",
     "graphics/web_graphics_context_3d_provider_wrapper.cc",
     "graphics/web_graphics_context_3d_provider_wrapper.h",
-    "histogram.cc",
-    "histogram.h",
     "image-decoders/bmp/bmp_image_decoder.cc",
     "image-decoders/bmp/bmp_image_decoder.h",
     "image-decoders/bmp/bmp_image_reader.cc",
@@ -1721,7 +1720,6 @@
     "graphics/placeholder_image_test.cc",
     "graphics/static_bitmap_image_test.cc",
     "graphics/video_frame_submitter_test.cc",
-    "histogram_test.cc",
     "image-decoders/bmp/bmp_image_decoder_test.cc",
     "image-decoders/fast_shared_buffer_reader_test.cc",
     "image-decoders/gif/gif_image_decoder_test.cc",
diff --git a/third_party/blink/renderer/platform/audio/DEPS b/third_party/blink/renderer/platform/audio/DEPS
index dbb2d999..2c01b94a 100644
--- a/third_party/blink/renderer/platform/audio/DEPS
+++ b/third_party/blink/renderer/platform/audio/DEPS
@@ -12,7 +12,7 @@
     "+third_party/blink/renderer/platform/wtf/cross_thread_functional.h",
     "+third_party/blink/renderer/platform/geometry/float_point_3d.h",
     "+third_party/blink/renderer/platform/heap",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/platform_export.h",
     "+third_party/blink/renderer/platform/scheduler/public",
diff --git a/third_party/blink/renderer/platform/audio/audio_destination.cc b/third_party/blink/renderer/platform/audio/audio_destination.cc
index ef32ab28..ad2ac3c5 100644
--- a/third_party/blink/renderer/platform/audio/audio_destination.cc
+++ b/third_party/blink/renderer/platform/audio/audio_destination.cc
@@ -38,7 +38,7 @@
 #include "third_party/blink/renderer/platform/audio/audio_utilities.h"
 #include "third_party/blink/renderer/platform/audio/push_pull_fifo.h"
 #include "third_party/blink/renderer/platform/audio/vector_math.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
diff --git a/third_party/blink/renderer/platform/audio/push_pull_fifo.cc b/third_party/blink/renderer/platform/audio/push_pull_fifo.cc
index 92bee13..2c4517f 100644
--- a/third_party/blink/renderer/platform/audio/push_pull_fifo.cc
+++ b/third_party/blink/renderer/platform/audio/push_pull_fifo.cc
@@ -7,7 +7,7 @@
 #include <memory>
 #include "build/build_config.h"
 #include "third_party/blink/renderer/platform/audio/audio_utilities.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/blob/DEPS b/third_party/blink/renderer/platform/blob/DEPS
index a1d21dc..7cc7826 100644
--- a/third_party/blink/renderer/platform/blob/DEPS
+++ b/third_party/blink/renderer/platform/blob/DEPS
@@ -6,7 +6,7 @@
     "+third_party/blink/renderer/platform/blob",
 
     # Dependencies.
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/platform_export.h",
     "+third_party/blink/renderer/platform/scheduler/public",
diff --git a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
index 403ee61e..12b859ad 100644
--- a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
+++ b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
@@ -8,7 +8,7 @@
 #include "base/task/post_task.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/platform/blob/blob_data.cc b/third_party/blink/renderer/platform/blob/blob_data.cc
index d1e69472..479df35 100644
--- a/third_party/blink/renderer/platform/blob/blob_data.cc
+++ b/third_party/blink/renderer/platform/blob/blob_data.cc
@@ -46,7 +46,7 @@
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/blob/blob_bytes_provider.h"
 #include "third_party/blink/renderer/platform/blob/blob_registry.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/line_ending.h"
diff --git a/third_party/blink/renderer/platform/exported/platform.cc b/third_party/blink/renderer/platform/exported/platform.cc
index fa5319ac..92bdf358d 100644
--- a/third_party/blink/renderer/platform/exported/platform.cc
+++ b/third_party/blink/renderer/platform/exported/platform.cc
@@ -53,7 +53,7 @@
 #include "third_party/blink/renderer/platform/fonts/font_cache_memory_dump_provider.h"
 #include "third_party/blink/renderer/platform/heap/blink_gc_memory_dump_provider.h"
 #include "third_party/blink/renderer/platform/heap/gc_task_runner.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/instance_counters_memory_dump_provider.h"
 #include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/instrumentation/partition_alloc_memory_dump_provider.h"
diff --git a/third_party/blink/renderer/platform/exported/web_time_range.cc b/third_party/blink/renderer/platform/exported/web_time_range.cc
new file mode 100644
index 0000000..384566a
--- /dev/null
+++ b/third_party/blink/renderer/platform/exported/web_time_range.cc
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2019 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "third_party/blink/public/platform/web_time_range.h"
+
+#include <cmath>
+
+namespace blink {
+
+void WebTimeRanges::Add(double start, double end) {
+  DCHECK_LE(start, end);
+  unsigned overlapping_arc_index;
+  WebTimeRange added_range(start, end);
+
+  // For each present range check if we need to:
+  // - merge with the added range, in case we are overlapping or contiguous
+  // - Need to insert in place, we we are completely, not overlapping and not
+  //   contiguous in between two ranges.
+  //
+  // TODO: Given that we assume that ranges are correctly ordered, this could be
+  // optimized.
+
+  for (overlapping_arc_index = 0; overlapping_arc_index < size();
+       overlapping_arc_index++) {
+    if (added_range.IsOverlappingRange(Data()[overlapping_arc_index]) ||
+        added_range.IsContiguousWithRange(Data()[overlapping_arc_index])) {
+      // We need to merge the addedRange and that range.
+      added_range = added_range.UnionWithOverlappingOrContiguousRange(
+          Data()[overlapping_arc_index]);
+      EraseAt(overlapping_arc_index);
+      overlapping_arc_index--;
+    } else {
+      // Check the case for which there is no more to do
+      if (!overlapping_arc_index) {
+        if (added_range.IsBeforeRange(Data()[0])) {
+          // First index, and we are completely before that range (and not
+          // contiguous, nor overlapping).  We just need to be inserted here.
+          break;
+        }
+      } else {
+        if (Data()[overlapping_arc_index - 1].IsBeforeRange(added_range) &&
+            added_range.IsBeforeRange(Data()[overlapping_arc_index])) {
+          // We are exactly after the current previous range, and before the
+          // current range, while not overlapping with none of them. Insert
+          // here.
+          break;
+        }
+      }
+    }
+  }
+
+  // Now that we are sure we don't overlap with any range, just add it.
+  Insert(overlapping_arc_index, added_range);
+}
+
+bool WebTimeRanges::Contain(double time) const {
+  for (const WebTimeRange& range : *this) {
+    if (time >= range.start && time <= range.end)
+      return true;
+  }
+  return false;
+}
+
+void WebTimeRanges::Invert() {
+  WebTimeRanges inverted;
+  double pos_inf = std::numeric_limits<double>::infinity();
+  double neg_inf = -std::numeric_limits<double>::infinity();
+
+  if (!size()) {
+    inverted.Add(neg_inf, pos_inf);
+  } else {
+    double start = front().start;
+    if (start != neg_inf)
+      inverted.Add(neg_inf, start);
+
+    for (size_t index = 0; index + 1 < size(); ++index)
+      inverted.Add(Data()[index].end, Data()[index + 1].start);
+
+    double end = back().end;
+    if (end != pos_inf)
+      inverted.Add(end, pos_inf);
+  }
+
+  Swap(inverted);
+}
+
+void WebTimeRanges::IntersectWith(const WebTimeRanges& other) {
+  WebTimeRanges inverted_other = other;
+  inverted_other.Invert();
+
+  Invert();
+  UnionWith(inverted_other);
+  Invert();
+}
+
+void WebTimeRanges::UnionWith(const WebTimeRanges& other) {
+  for (const WebTimeRange& range : other) {
+    Add(range.start, range.end);
+  }
+}
+
+double WebTimeRanges::Nearest(double new_playback_position,
+                              double current_playback_position) const {
+  double best_match = 0;
+  double best_delta = std::numeric_limits<double>::infinity();
+  for (const WebTimeRange& range : *this) {
+    double start_time = range.start;
+    double end_time = range.end;
+    if (new_playback_position >= start_time &&
+        new_playback_position <= end_time)
+      return new_playback_position;
+
+    double delta, match;
+    if (new_playback_position < start_time) {
+      delta = start_time - new_playback_position;
+      match = start_time;
+    } else {
+      delta = new_playback_position - end_time;
+      match = end_time;
+    }
+
+    if (delta < best_delta ||
+        (delta == best_delta &&
+         std::abs(current_playback_position - match) <
+             std::abs(current_playback_position - best_match))) {
+      best_delta = delta;
+      best_match = match;
+    }
+  }
+  return best_match;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/DEPS b/third_party/blink/renderer/platform/fonts/DEPS
index 60b1d13..58a9a1c 100644
--- a/third_party/blink/renderer/platform/fonts/DEPS
+++ b/third_party/blink/renderer/platform/fonts/DEPS
@@ -11,7 +11,7 @@
     "+third_party/blink/renderer/platform/font_family_names.h",
     "+third_party/blink/renderer/platform/geometry",
     "+third_party/blink/renderer/platform/heap",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/language.h",
     "+third_party/blink/renderer/platform/platform_export.h",
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.cc b/third_party/blink/renderer/platform/fonts/font_cache.cc
index d46cb7e..ee82164 100644
--- a/third_party/blink/renderer/platform/fonts/font_cache.cc
+++ b/third_party/blink/renderer/platform/fonts/font_cache.cc
@@ -51,7 +51,7 @@
 #include "third_party/blink/renderer/platform/fonts/shaping/shape_cache.h"
 #include "third_party/blink/renderer/platform/fonts/simple_font_data.h"
 #include "third_party/blink/renderer/platform/fonts/text_rendering_mode.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_memory_allocator_dump.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_face.cc b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_face.cc
index 6fc0e1f..1960f30 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_face.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_face.cc
@@ -45,7 +45,7 @@
 #include "third_party/blink/renderer/platform/fonts/simple_font_data.h"
 #include "third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h"
 #include "third_party/blink/renderer/platform/fonts/unicode_range_set.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/resolution_units.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
diff --git a/third_party/blink/renderer/platform/fonts/web_font_decoder.cc b/third_party/blink/renderer/platform/fonts/web_font_decoder.cc
index 8d64c2565..97aaa60 100644
--- a/third_party/blink/renderer/platform/fonts/web_font_decoder.cc
+++ b/third_party/blink/renderer/platform/fonts/web_font_decoder.cc
@@ -34,7 +34,7 @@
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #include "third_party/blink/renderer/platform/fonts/web_font_typeface_factory.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
diff --git a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
index 3e911e0..72f07334 100644
--- a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
+++ b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
@@ -6,7 +6,7 @@
 
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #include "third_party/blink/renderer/platform/fonts/opentype/font_format_check.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/skia/include/core/SkStream.h"
 #include "third_party/skia/include/core/SkTypeface.h"
diff --git a/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc b/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc
index 5b6bacd..beef91f8 100644
--- a/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc
+++ b/third_party/blink/renderer/platform/fonts/win/font_unique_name_lookup_win.cc
@@ -9,7 +9,7 @@
 #include "third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_provider.h"
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/skia/include/ports/SkTypeface_win.h"
 
diff --git a/third_party/blink/renderer/platform/graphics/DEPS b/third_party/blink/renderer/platform/graphics/DEPS
index 3407da6..b9a8d18 100644
--- a/third_party/blink/renderer/platform/graphics/DEPS
+++ b/third_party/blink/renderer/platform/graphics/DEPS
@@ -33,7 +33,7 @@
     "+third_party/blink/renderer/platform/fonts",
     "+third_party/blink/renderer/platform/geometry",
     "+third_party/blink/renderer/platform/heap",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/image-decoders",
     "+third_party/blink/renderer/platform/image-encoders",
     "+third_party/blink/renderer/platform/instrumentation",
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc b/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
index a6f68422..830737fa 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
@@ -8,7 +8,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "third_party/blink/renderer/platform/geometry/int_size.h"
 #include "third_party/blink/renderer/platform/graphics/color_space_gamut.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/threading.h"
 
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
index 1612dec..0ff2747 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -46,7 +46,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
 #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_wrapper.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/skia/include/core/SkData.h"
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
index 638a140..c07b968d 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
@@ -20,7 +20,7 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h"
 #include "third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
diff --git a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc
index 5c3e3fcf..2d5efed65 100644
--- a/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc
+++ b/third_party/blink/renderer/platform/graphics/deferred_image_decoder.cc
@@ -34,8 +34,8 @@
 #include "third_party/blink/renderer/platform/graphics/image_decoding_store.h"
 #include "third_party/blink/renderer/platform/graphics/image_frame_generator.h"
 #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
-#include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/image-decoders/segment_reader.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/skia/include/core/SkImage.h"
diff --git a/third_party/blink/renderer/platform/graphics/image.cc b/third_party/blink/renderer/platform/graphics/image.cc
index 629e1e5b..49452a6 100644
--- a/third_party/blink/renderer/platform/graphics/image.cc
+++ b/third_party/blink/renderer/platform/graphics/image.cc
@@ -46,7 +46,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/paint_recorder.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_shader.h"
 #include "third_party/blink/renderer/platform/graphics/scoped_interpolation_quality.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/platform/heap/DEPS b/third_party/blink/renderer/platform/heap/DEPS
index 56f2332..43c7d4f 100644
--- a/third_party/blink/renderer/platform/heap/DEPS
+++ b/third_party/blink/renderer/platform/heap/DEPS
@@ -13,7 +13,7 @@
     "+base/task_runner.h",
 
     "+third_party/blink/renderer/platform/bindings",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h",
     "+third_party/blink/renderer/platform/platform_export.h",
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc
index 80eb01f..94c3050 100644
--- a/third_party/blink/renderer/platform/heap/heap.cc
+++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -45,7 +45,7 @@
 #include "third_party/blink/renderer/platform/heap/page_memory.h"
 #include "third_party/blink/renderer/platform/heap/page_pool.h"
 #include "third_party/blink/renderer/platform/heap/thread_state_scopes.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_memory_allocator_dump.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.h"
diff --git a/third_party/blink/renderer/platform/heap/heap_compact.cc b/third_party/blink/renderer/platform/heap/heap_compact.cc
index 7db1ce90..a2112be 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact.cc
+++ b/third_party/blink/renderer/platform/heap/heap_compact.cc
@@ -11,7 +11,7 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
diff --git a/third_party/blink/renderer/platform/heap/heap_page.cc b/third_party/blink/renderer/platform/heap/heap_page.cc
index e4c5c2f..3a04dce 100644
--- a/third_party/blink/renderer/platform/heap/heap_page.cc
+++ b/third_party/blink/renderer/platform/heap/heap_page.cc
@@ -43,7 +43,7 @@
 #include "third_party/blink/renderer/platform/heap/page_memory.h"
 #include "third_party/blink/renderer/platform/heap/page_pool.h"
 #include "third_party/blink/renderer/platform/heap/thread_state.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_memory_allocator_dump.h"
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 156b5f1..2c5b8eee 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -61,7 +61,7 @@
 #include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_memory_allocator_dump.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/web_process_memory_dump.h"
diff --git a/third_party/blink/renderer/platform/image-decoders/DEPS b/third_party/blink/renderer/platform/image-decoders/DEPS
index 28345a4f..8577019 100644
--- a/third_party/blink/renderer/platform/image-decoders/DEPS
+++ b/third_party/blink/renderer/platform/image-decoders/DEPS
@@ -9,7 +9,7 @@
     "+cc/paint/image_animation_count.h",
     "+third_party/blink/renderer/platform/geometry",
     "+third_party/blink/renderer/platform/graphics",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/network/mime/mime_type_registry.h",
     "+third_party/blink/renderer/platform/platform_export.h",
diff --git a/third_party/blink/renderer/platform/image-decoders/webp/webp_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/webp/webp_image_decoder.cc
index 2342dda..5043440e 100644
--- a/third_party/blink/renderer/platform/image-decoders/webp/webp_image_decoder.cc
+++ b/third_party/blink/renderer/platform/image-decoders/webp/webp_image_decoder.cc
@@ -30,7 +30,7 @@
 
 #include "base/feature_list.h"
 #include "build/build_config.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/skia/include/core/SkData.h"
 #include "third_party/skia/include/core/SkYUVAIndex.h"
diff --git a/third_party/blink/renderer/platform/image-encoders/DEPS b/third_party/blink/renderer/platform/image-encoders/DEPS
index bbb4bc7..ed918fe 100644
--- a/third_party/blink/renderer/platform/image-encoders/DEPS
+++ b/third_party/blink/renderer/platform/image-encoders/DEPS
@@ -7,7 +7,7 @@
 
     # Dependencies.
     "+third_party/blink/renderer/platform/graphics/graphics_types.h",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/network/mime/mime_type_registry.h",
     "+third_party/blink/renderer/platform/platform_export.h",
     "+third_party/blink/renderer/platform/wtf",
diff --git a/third_party/blink/renderer/platform/image-encoders/image_encoder_utils.cc b/third_party/blink/renderer/platform/image-encoders/image_encoder_utils.cc
index b803f96c..7ecb343 100644
--- a/third_party/blink/renderer/platform/image-encoders/image_encoder_utils.cc
+++ b/third_party/blink/renderer/platform/image-encoders/image_encoder_utils.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
 
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
 #include "third_party/blink/renderer/platform/wtf/threading.h"
 
diff --git a/third_party/blink/renderer/platform/instrumentation/BUILD.gn b/third_party/blink/renderer/platform/instrumentation/BUILD.gn
index 43453323..4431cce 100644
--- a/third_party/blink/renderer/platform/instrumentation/BUILD.gn
+++ b/third_party/blink/renderer/platform/instrumentation/BUILD.gn
@@ -7,6 +7,8 @@
 
 blink_platform_sources("instrumentation") {
   sources = [
+    "histogram.cc",
+    "histogram.h",
     "instance_counters.cc",
     "instance_counters.h",
     "instance_counters_memory_dump_provider.cc",
@@ -41,6 +43,7 @@
   testonly = true
 
   sources = [
+    "histogram_test.cc",
     "tracing/traced_value_test.cc",
     "tracing/web_process_memory_dump_test.cc",
   ]
diff --git a/third_party/blink/renderer/platform/histogram.cc b/third_party/blink/renderer/platform/instrumentation/histogram.cc
similarity index 96%
rename from third_party/blink/renderer/platform/histogram.cc
rename to third_party/blink/renderer/platform/instrumentation/histogram.cc
index b2d3642..f607bf9c 100644
--- a/third_party/blink/renderer/platform/histogram.cc
+++ b/third_party/blink/renderer/platform/instrumentation/histogram.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 "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 #include "base/metrics/histogram.h"
 #include "base/metrics/sparse_histogram.h"
diff --git a/third_party/blink/renderer/platform/histogram.h b/third_party/blink/renderer/platform/instrumentation/histogram.h
similarity index 95%
rename from third_party/blink/renderer/platform/histogram.h
rename to third_party/blink/renderer/platform/instrumentation/histogram.h
index cd9ca56..d69ac5e 100644
--- a/third_party/blink/renderer/platform/histogram.h
+++ b/third_party/blink/renderer/platform/instrumentation/histogram.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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_INSTRUMENTATION_HISTOGRAM_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_INSTRUMENTATION_HISTOGRAM_H_
 
 #include <stdint.h>
 #include "base/metrics/histogram_base.h"
@@ -143,4 +143,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HISTOGRAM_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_INSTRUMENTATION_HISTOGRAM_H_
diff --git a/third_party/blink/renderer/platform/histogram_test.cc b/third_party/blink/renderer/platform/instrumentation/histogram_test.cc
similarity index 96%
rename from third_party/blink/renderer/platform/histogram_test.cc
rename to third_party/blink/renderer/platform/instrumentation/histogram_test.cc
index 32e5ebb..3967ec8 100644
--- a/third_party/blink/renderer/platform/histogram_test.cc
+++ b/third_party/blink/renderer/platform/instrumentation/histogram_test.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 "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 
 #include "base/metrics/histogram_samples.h"
 #include "base/test/test_mock_time_task_runner.h"
diff --git a/third_party/blink/renderer/platform/loader/DEPS b/third_party/blink/renderer/platform/loader/DEPS
index 337c3cf..67805a5 100644
--- a/third_party/blink/renderer/platform/loader/DEPS
+++ b/third_party/blink/renderer/platform/loader/DEPS
@@ -20,8 +20,6 @@
     "+third_party/blink/renderer/platform/crypto.h",
     "+third_party/blink/renderer/platform/exported",
     "+third_party/blink/renderer/platform/heap",
-    "+third_party/blink/renderer/platform/histogram.h",
-    "+third_party/blink/renderer/platform/instrumentation/instance_counters.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/language.h",
     "+third_party/blink/renderer/platform/loader/fetch/cross_origin_attribute_value.h",
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.cc b/third_party/blink/renderer/platform/loader/fetch/resource.cc
index 7a9a0ad1..6c98c72 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -37,7 +37,7 @@
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/instance_counters.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/cors/cors.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index ea9274b..acd624b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -44,7 +44,7 @@
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/instance_counters.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
index ed6280bd..21f38ca 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -14,7 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/time/default_clock.h"
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/loader/fetch/console_logger.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
diff --git a/third_party/blink/renderer/platform/scheduler/DEPS b/third_party/blink/renderer/platform/scheduler/DEPS
index c7bae01..9d66acc 100644
--- a/third_party/blink/renderer/platform/scheduler/DEPS
+++ b/third_party/blink/renderer/platform/scheduler/DEPS
@@ -50,7 +50,7 @@
   "+services/metrics",
 
   "+third_party/blink/renderer/platform/bindings/parkable_string_manager.h",
-  "+third_party/blink/renderer/platform/histogram.h",
+  "+third_party/blink/renderer/platform/instrumentation/histogram.h",
   "+third_party/blink/renderer/platform/instrumentation",
   "+third_party/blink/renderer/platform/platform_export.h",
   "+third_party/blink/renderer/platform/runtime_enabled_features.h",
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
index a890bd2..4b9caf1 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
@@ -17,7 +17,7 @@
 #include "base/trace_event/traced_value.h"
 #include "services/metrics/public/cpp/mojo_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/common/features.h"
 #include "third_party/blink/renderer/platform/scheduler/common/process_state.h"
 #include "third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h"
diff --git a/third_party/blink/renderer/platform/testing/DEPS b/third_party/blink/renderer/platform/testing/DEPS
index bfaba57..0bc5f59 100644
--- a/third_party/blink/renderer/platform/testing/DEPS
+++ b/third_party/blink/renderer/platform/testing/DEPS
@@ -25,7 +25,7 @@
     "+third_party/blink/renderer/platform/geometry",
     "+third_party/blink/renderer/platform/graphics",
     "+third_party/blink/renderer/platform/heap",
-    "+third_party/blink/renderer/platform/histogram.h",
+    "+third_party/blink/renderer/platform/instrumentation/histogram.h",
     "+third_party/blink/renderer/platform/image-decoders/image_decoder.h",
     "+third_party/blink/renderer/platform/instrumentation",
     "+third_party/blink/renderer/platform/language.h",
diff --git a/third_party/blink/renderer/platform/testing/histogram_tester.h b/third_party/blink/renderer/platform/testing/histogram_tester.h
index 044d4811..2503867 100644
--- a/third_party/blink/renderer/platform/testing/histogram_tester.h
+++ b/third_party/blink/renderer/platform/testing/histogram_tester.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TESTING_HISTOGRAM_TESTER_H_
 
 #include <memory>
-#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/instrumentation/histogram.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace base {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 888891d..2dc98f8 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2395,13 +2395,6 @@
 
 crbug.com/686118 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash Pass ]
 
-# Service worker updates need to succeed when the script shrinks.
-crbug.com/986688 external/wpt/service-workers/service-worker/update.https.html [ Skip ]
-crbug.com/986688 virtual/blink-cors/external/wpt/service-workers/service-worker/update.https.html [ Skip ]
-crbug.com/986688 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/update.https.html [ Skip ]
-crbug.com/986688 virtual/not-omt-sw-fetch/external/wpt/service-workers/service-worker/update.https.html [ Skip ]
-crbug.com/986688 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/update.https.html [ Skip ]
-
 # In external/wpt/html/, we prefer checking in failure
 # expectation files. The following tests with [ Failure ] don't have failure
 # expectation files because they contain local path names.
@@ -2495,7 +2488,6 @@
 
 crbug.com/972992 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-001.html [ Failure ]
 crbug.com/972992 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-003.html [ Failure ]
-crbug.com/974371 external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html [ Failure ]
 
 # The 'overflow-wrap: anywhere' feature is not implemented yet
 crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-001.html [ Skip ]
@@ -3261,6 +3253,8 @@
 crbug.com/968164 external/wpt/css/css-ui/webkit-appearance-menulist-button-001.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-text-decor/text-underline-offset-002.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-text-decor/text-decoration-thickness-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text-decor/text-decoration-thickness-overline-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text-decor/text-decoration-thickness-scroll-001.html [ Failure ]
@@ -6087,11 +6081,6 @@
 # Sheriff 2019-04-09
 crbug.com/946335 [ Linux Mac ] fast/filesystem/file-writer-abort-depth.html [ Pass Crash ]
 
-# Sheriff 2019-04-10
-crbug.com/951638 [ Linux ] virtual/mouseevent_fractional/fast/events/mouse-right-coords-in-zoom-and-scroll-right.html [ Pass Failure ]
-crbug.com/951638 [ Mac10.13 Debug ] virtual/mouseevent_fractional/fast/events/mouse-right-coords-in-zoom-and-scroll-right.html [ Pass Failure ]
-crbug.com/951638 [ Win7 ] virtual/mouseevent_fractional/fast/events/mouse-right-coords-in-zoom-and-scroll-right.html [ Pass Failure ]
-
 # Sheriff 2019-04-11
 crbug.com/802029 [ Mac10.13 Debug ] fast/dom/shadow/focus-controller-recursion-crash.html [ Pass Timeout ]
 
@@ -6332,11 +6321,6 @@
 # Sheriff 2019-07-20
 crbug.com/986018 fast/scroll-snap/snaps-after-keyboard-scrolling-rtl.html [ Pass Failure ]
 
-# Sheriff 2019-07-22
-crbug.com/986282 [ Linux Win ] external/wpt/client-hints/accept-ch-lifetime.tentative.https.html [ Pass Failure ]
-crbug.com/986019 [ Linux ] virtual/threaded/animations/play-state.html [ Pass Timeout ]
-crbug.com/986019 [ Linux ] virtual/disable-blink-gen-property-trees/animations/play-state.html [ Pass Timeout ]
-
 # ecosystem-infra sheriff 2019-07-22
 crbug.com/986457 [ Linux ] http/tests/misc/object-image-error-with-onload.html [ Pass Failure ]
 crbug.com/986477 [ Win ] external/wpt/cookies/path/match.html [ Pass Timeout ]
@@ -6349,3 +6333,12 @@
 crbug.com/986666 animations/web-animations/animation-state-changes-negative-playback-rate.html [ Pass Failure ]
 crbug.com/986666 virtual/threaded/animations/web-animations/animation-state-changes-negative-playback-rate.html [ Pass Failure ]
 crbug.com/986666 virtual/disable-blink-gen-property-trees/animations/web-animations/animation-state-changes-negative-playback-rate.html [ Pass Failure ]
+
+# Sheriff 2019-07-24
+crbug.com/986019 animations/play-state.html [ Pass Timeout ]
+crbug.com/986019 virtual/threaded/animations/play-state.html [ Pass Timeout ]
+crbug.com/986019 virtual/disable-blink-gen-property-trees/animations/play-state.html [ Pass Timeout ]
+crbug.com/987108 [ Mac ] fast/forms/select/disabled-select-change-index.html [ Failure ]
+crbug.com/987132 [ Mac ] fast/forms/select/option-strip-whitespace.html [ Failure ]
+crbug.com/986282 external/wpt/client-hints/accept-ch-lifetime.tentative.https.html [ Pass Failure ]
+crbug.com/987138 [ Linux Win ] media/controls/doubletap-to-jump-forwards.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 90554a1..1a472df7 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -64127,6 +64127,18 @@
      {}
     ]
    ],
+   "css/css-tables/percent-width-cell-dynamic.html": [
+    [
+     "css/css-tables/percent-width-cell-dynamic.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square-only.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-tables/percentages-grandchildren-quirks-mode-001.html": [
     [
      "css/css-tables/percentages-grandchildren-quirks-mode-001.html",
@@ -72819,18 +72831,6 @@
      {}
     ]
    ],
-   "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html": [
-    [
-     "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html",
-     [
-      [
-       "/css/css-text/white-space/reference/white-space-pre-wrap-trailing-spaces-004-ref.html",
-       "=="
-      ]
-     ],
-     {}
-    ]
-   ],
    "css/css-text/white-space/white-space-wrap-after-nowrap-001.html": [
     [
      "css/css-text/white-space/white-space-wrap-after-nowrap-001.html",
@@ -99345,6 +99345,18 @@
      {}
     ]
    ],
+   "css/filter-effects/backdrop-filter-plus-opacity.html": [
+    [
+     "css/filter-effects/backdrop-filter-plus-opacity.html",
+     [
+      [
+       "/css/filter-effects/backdrop-filter-plus-opacity-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/filter-effects/backdrop-filter-reference-filter.html": [
     [
      "css/filter-effects/backdrop-filter-reference-filter.html",
@@ -141096,6 +141108,21 @@
    "css/css-text/i18n/ja/css-text-line-break-ja-in-loose-expected.txt": [
     []
    ],
+   "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict-expected.txt": [
+    []
+   ],
    "css/css-text/i18n/reference/css3-text-line-break-opclns-001-ref.html": [
     []
    ],
@@ -141633,9 +141660,30 @@
    "css/css-text/i18n/support/BPG-Ucnobi-U.woff": [
     []
    ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal-expected.txt": [
+    []
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict-expected.txt": [
+    []
+   ],
    "css/css-text/i18n/zh/css-text-line-break-zh-in-loose-expected.txt": [
     []
    ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal-expected.txt": [
+    []
+   ],
    "css/css-text/inheritance-expected.txt": [
     []
    ],
@@ -147471,6 +147519,9 @@
    "css/filter-effects/backdrop-filter-plus-filter-ref.html": [
     []
    ],
+   "css/filter-effects/backdrop-filter-plus-opacity-ref.html": [
+    []
+   ],
    "css/filter-effects/backdrop-filter-update-ref.html": [
     []
    ],
@@ -161331,6 +161382,9 @@
    "longtask-timing/OWNERS": [
     []
    ],
+   "longtask-timing/idlharness.window-expected.txt": [
+    []
+   ],
    "longtask-timing/resources/makelongtask.js": [
     []
    ],
@@ -172311,10 +172365,10 @@
    "tools/wptrunner/wptrunner/browsers/epiphany.py": [
     []
    ],
-   "tools/wptrunner/wptrunner/browsers/fennec.py": [
+   "tools/wptrunner/wptrunner/browsers/firefox.py": [
     []
    ],
-   "tools/wptrunner/wptrunner/browsers/firefox.py": [
+   "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
     []
    ],
    "tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -175914,6 +175968,9 @@
    "webxr/xrRigidTransform_constructor.https-expected.txt": [
     []
    ],
+   "webxr/xrWebGLLayer_framebuffer.https-expected.txt": [
+    []
+   ],
    "workers/META.yml": [
     []
    ],
@@ -208406,6 +208463,294 @@
      {}
     ]
    ],
+   "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html": [
+    [
+     "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html": [
+    [
+     "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html": [
+    [
+     "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html": [
+    [
+     "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html": [
+    [
+     "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html",
+     {}
+    ]
+   ],
    "css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html": [
     [
      "css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html",
@@ -208496,6 +208841,24 @@
      {}
     ]
    ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html",
+     {}
+    ]
+   ],
+   "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html": [
+    [
+     "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html",
+     {}
+    ]
+   ],
    "css/css-text/inheritance.html": [
     [
      "css/css-text/inheritance.html",
@@ -214496,6 +214859,12 @@
      {}
     ]
    ],
+   "css/mediaqueries/width-equals-window-inner-width.html": [
+    [
+     "css/mediaqueries/width-equals-window-inner-width.html",
+     {}
+    ]
+   ],
    "css/motion/animation/offset-anchor-interpolation.html": [
     [
      "css/motion/animation/offset-anchor-interpolation.html",
@@ -248539,6 +248908,12 @@
      {}
     ]
    ],
+   "largest-contentful-paint/loadTime-after-appendChild.html": [
+    [
+     "largest-contentful-paint/loadTime-after-appendChild.html",
+     {}
+    ]
+   ],
    "largest-contentful-paint/observe-image.html": [
     [
      "largest-contentful-paint/observe-image.html",
@@ -248551,6 +248926,18 @@
      {}
     ]
    ],
+   "largest-contentful-paint/repeated-image.html": [
+    [
+     "largest-contentful-paint/repeated-image.html",
+     {}
+    ]
+   ],
+   "largest-contentful-paint/supported-lcp-type.html": [
+    [
+     "largest-contentful-paint/supported-lcp-type.html",
+     {}
+    ]
+   ],
    "layout-instability/buffer-layout-shift.html": [
     [
      "layout-instability/buffer-layout-shift.html",
@@ -248637,6 +249024,12 @@
      {}
     ]
    ],
+   "loading/lazyload/picture-loading-lazy.tentative.html": [
+    [
+     "loading/lazyload/picture-loading-lazy.tentative.html",
+     {}
+    ]
+   ],
    "loading/preloader-css-import-no-quote.tentative.html": [
     [
      "loading/preloader-css-import-no-quote.tentative.html",
@@ -279496,6 +279889,14 @@
      }
     ]
    ],
+   "std-toast/reflection.html": [
+    [
+     "std-toast/reflection.html",
+     {
+      "timeout": "long"
+     }
+    ]
+   ],
    "std-toast/show-toast.html": [
     [
      "std-toast/show-toast.html",
@@ -369102,7 +369503,7 @@
    "support"
   ],
   "css/css-properties-values-api/conditional-rules.html": [
-   "b4de63045f339d163830921e4e201e698edae47c",
+   "0bff879856c91047bb84575faf31917fd73ba049",
    "testharness"
   ],
   "css/css-properties-values-api/idlharness-expected.txt": [
@@ -373109,6 +373510,10 @@
    "ffbb796b6afe0fe9fa93e15de3586bef96174d8b",
    "reftest"
   ],
+  "css/css-tables/percent-width-cell-dynamic.html": [
+   "5c7ef3bf8a2b7eac7371c7d86594f52cfb42815d",
+   "reftest"
+  ],
   "css/css-tables/percent-width-ignored-001.tentative.html": [
    "214eee7152b66a4198a2e81d7d62da9a295b5d98",
    "testharness"
@@ -373558,7 +373963,7 @@
    "support"
   ],
   "css/css-text-decor/reference/text-decoration-thickness-001-notref.html": [
-   "f876afa68c655535017fe5a6e6feff0ce1df4045",
+   "4e7db88ce5b41e28aa43fc339c35438855abb928",
    "support"
   ],
   "css/css-text-decor/reference/text-decoration-thickness-green-rect-ref.html": [
@@ -373678,11 +374083,11 @@
    "support"
   ],
   "css/css-text-decor/reference/text-underline-offset-001-notref.html": [
-   "c56078a32ae26647c8aece448ce1d6b268f38abd",
+   "8b1dacfbf48a68b88e4ae47a852c810b3bc4becf",
    "support"
   ],
   "css/css-text-decor/reference/text-underline-offset-002-ref.html": [
-   "ed2e3cefff82a120c3d33f504fd8d6ee78d9fe8c",
+   "6e7d5a65f0373ae49452daaa0ad401bed3f1af3e",
    "support"
   ],
   "css/css-text-decor/reference/text-underline-offset-scroll-001-notref.html": [
@@ -373998,7 +374403,7 @@
    "testharness"
   ],
   "css/css-text-decor/text-decoration-thickness-linethrough-001.html": [
-   "37e954b2b8769e882420a49ef0adf42a8b4b096e",
+   "6fd8383d062960e5056a1e755eafdd95e23e0f88",
    "reftest"
   ],
   "css/css-text-decor/text-decoration-thickness-overline-001.html": [
@@ -374190,11 +374595,11 @@
    "testharness"
   ],
   "css/css-text-decor/text-underline-offset-001.html": [
-   "bd9a29c7fdeeee9eeb30f226c1a3e8abfa0eac30",
+   "f7aeb543df3a77d277b1a8e99d1e50c3bd9a87ea",
    "reftest"
   ],
   "css/css-text-decor/text-underline-offset-002.html": [
-   "7441ff9d9325a689f79991511b02c601f9a91701",
+   "dc65db7723fb31cfaa6c00b4af7e37f5b23affb2",
    "reftest"
   ],
   "css/css-text-decor/text-underline-offset-computed-expected.txt": [
@@ -375621,6 +376026,122 @@
    "08e16f26321bab7ca03f2cfe6eddd0c324d765dc",
    "testharness"
   ],
+  "css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html": [
+   "fde2a3d086b16ee1817e5928015d19c5016340c6",
+   "testharness"
+  ],
+  "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal-expected.txt": [
+   "8432cf1ffb6a716e11d77e993f123612b498e224",
+   "support"
+  ],
+  "css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html": [
+   "d6f58cb88c1d0b81351eedb3830568fa7a7713b2",
+   "testharness"
+  ],
+  "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict-expected.txt": [
+   "5319ad190fff29199d6acb9710202b4a1d62654a",
+   "support"
+  ],
+  "css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html": [
+   "8265f917225e247538c9fa2f3b28cf7e0382b2ed",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html": [
+   "c902bf7bddb23db69a23ad70cc4ef5f3c85e4aa0",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html": [
+   "e98d4a20cb1f80111b22fc7cb30d079ac3f12009",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html": [
+   "29810f2a3502c9b24364c626af22d591c0f0406a",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html": [
+   "9dffd854891a195c8d590ade08ea29e0ff2a585a",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html": [
+   "9c0af13806ca8b612700856f8007152449e3a5a8",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html": [
+   "d573bac7d6b69b2fbf702aabfc656a151b15171a",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html": [
+   "80b5bb0c72c7a36649678e421ea26795aeb0228d",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html": [
+   "6d6043031e008e3cf01be5cb367edfa1edf8bab6",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html": [
+   "e0f60cd36fe0e2c87325feac0aaf0fb96e1ff205",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html": [
+   "fff23f36df8f22161c841ae93b637426315c9552",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html": [
+   "d000d8eb16d55e53eab708eabec21d6d95a22fe7",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html": [
+   "79d6e12cc8eb3d2dfcd0544f2a4cc89a80f4223b",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html": [
+   "ff8ef05b14c8abac40ea2ac6c8c667a7062b97fe",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html": [
+   "c5913821e5bd37d706f98818524df6c74b7519b0",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html": [
+   "46c0fe3caacc6a7dec51fe75d9186385937ec901",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html": [
+   "0eec96857fd6bb8f2b812dc91c42cebf422ec2f7",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html": [
+   "6043912cded98d4a37087f2bca85f7dfa4c8c7f4",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html": [
+   "8c9387fa044ae0cb5c95be33737395cf020a4cde",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose-expected.txt": [
+   "05f21b3ffd00a7823a07ddda86372a03b423fc6a",
+   "support"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html": [
+   "8b2fd1c038cb909665d957b29a0a1953db02f1b0",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal-expected.txt": [
+   "7f23187b226a966309b28922b20cc65c47923e3d",
+   "support"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html": [
+   "2da6d3b0af66f37640dda46d5dbc3cf639fa0a06",
+   "testharness"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict-expected.txt": [
+   "5643e4037a62168310cc4406a22ff0a7bc0f3d25",
+   "support"
+  ],
+  "css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html": [
+   "99cf5c5fbef0c51848a631ac76cfec5497fc0faa",
+   "testharness"
+  ],
   "css/css-text/i18n/reference/css3-text-line-break-opclns-001-ref.html": [
    "d3827a52989d4d5f0f7f5f8bb625be19c5ace3a0",
    "support"
@@ -376337,6 +376858,126 @@
    "577500e2426523a3cd29ba26ae7f5686cadfdb84",
    "support"
   ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html": [
+   "d6d0a1b3493af9a5f06b296cc0545e29cf1bf29f",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html": [
+   "548fa17398287e4e3c8c210f1bb0e72a43d87af1",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict-expected.txt": [
+   "5fa18c5ac8e5dae7292d3753fd57708dbf1ae197",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html": [
+   "a4e871789a30ff001b6bf278a87edb54b4ebe733",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html": [
+   "3d4cb261289599df2141a534620654cd995eccaf",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html": [
+   "417973b0bbf1ce2730765d5ad5087b2f894c4db9",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html": [
+   "c6685dfe79d875034b8bdc4d4a8de70a09e33948",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html": [
+   "f15f2632ebeb8fef879a4e7a455e813beb964384",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html": [
+   "4e9dc5607b4c7887244d032dcfe89133718dacb9",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html": [
+   "595cd5df2b632c471cf3003f66545c10e2fe2aa0",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose-expected.txt": [
+   "c41356766695fb85dc5cadf97d17a476701c4d56",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html": [
+   "c507f78e6e403b7d1f386299a34f12fcf613e3e8",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html": [
+   "4e8d9617baf1a66ff15fb7dc8d6d4767aa62da97",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html": [
+   "a1c3a855041d589ea47d90c636e69f215bc27b1c",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose-expected.txt": [
+   "6d7a0fb56fb790fb3c7bffbe0ffe694f3bd3ada9",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html": [
+   "420a7b6f07c2a4dbd06f7361d37d1f2cb1a26a88",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html": [
+   "9d7b2c032d54b693b3fd343a44089e27d70d3963",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html": [
+   "54c7559d109b5591e722fe8290e2c11f1da97d08",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html": [
+   "e635075a4151604e7a9b59900cde690e90c84e87",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html": [
+   "46e7472208e295d53bdd7c114bbd6f10dd354d2c",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html": [
+   "61fd7b7ec5ca51d0ce6eddc8392c58a6281e2e74",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose-expected.txt": [
+   "2d453c3af6b2ebd6db2bae44c93205e207727266",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html": [
+   "b21853f386e4c7759f465ff3f3caafb00942c2a6",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal-expected.txt": [
+   "c38e02ca7589597d64cd4826d24c5401488885b5",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html": [
+   "337cf8f85dba5c08b7649da26c1d2a91369721fe",
+   "testharness"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict-expected.txt": [
+   "d8d8a1ee973417cbe65687f4999536f1ac5565ba",
+   "support"
+  ],
+  "css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html": [
+   "d25fa6857d8bb1bb4f0b366dae17a1ac783ddcab",
+   "testharness"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html": [
+   "a131395e1daff855eaf3f787fddeb60f73318dc1",
+   "testharness"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html": [
+   "ff7456b82148c8c780e700185e11d8cda97bb51c",
+   "testharness"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html": [
+   "dc752f1086c1346404766372d268f6c2be3c5979",
+   "testharness"
+  ],
   "css/css-text/i18n/zh/css-text-line-break-zh-cpm-loose.html": [
    "4044e10666d15573fa4d7b3d455b956895eae19e",
    "testharness"
@@ -376401,6 +377042,22 @@
    "d85b74a54056166cedbf04f694d681ef95fff9b4",
    "testharness"
   ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html": [
+   "b56cd28c84037387634ab0b91311fedf11522136",
+   "testharness"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal-expected.txt": [
+   "0dd73724bc8e965af574ffe654313cd80cdea70f",
+   "support"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html": [
+   "198bf28cd7e5d49e57912db6637048a1f506d887",
+   "testharness"
+  ],
+  "css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html": [
+   "c71014b42f90e1ca21b0df9f7184b94bfc282bbb",
+   "testharness"
+  ],
   "css/css-text/inheritance-expected.txt": [
    "1f9d459ca997d4f55a714845a125f845dfbf3a7a",
    "support"
@@ -376474,55 +377131,55 @@
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-004.html": [
-   "daf8420b3930efaecd6f579794105def64dcc75c",
+   "19b98417b0ffc1e0d9c18873408376cd534084f4",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-005.html": [
-   "47f675eda6ecc6fdaba17cbc06f6df960db87b75",
+   "5e286a0d769b25816390297851d9ff85a9e60db0",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-006.html": [
-   "de5a43eab444bf440ce44402972e575d2c70f967",
+   "207cf84f756d608a9e494fa0386dc64468ad8bb7",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-007.html": [
-   "300d9bd92981eca6e87d19caf973d59df847638d",
+   "b8e4627e7bc93abc79be473b7bdaadebf2d8fd8a",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-008.html": [
-   "a7590a2ee278b218c5e93f90fdf2e3837f4db2c2",
+   "6b7fb14f5cf2300981b2123a130467eccc4634eb",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-009.html": [
-   "4cc3f4ee392bde3b0cfd4a52fb6af06d3696bcb2",
+   "6a0ab913330877453233a3aa14aac2aed5a70c6d",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-010.html": [
-   "6554bf68ce13d0f3a3f3d020c01a749aca4228dd",
+   "19cc7966028841b6b7aa0a8e890f83623e2429a4",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-011.html": [
-   "6cbec13008edd1fadb022f0e8f50f63c6f0a1642",
+   "70d9628a6f01b3e792ab27b0b2e1cd9740a67080",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-012.html": [
-   "2dfe6071fdfe2a2993812a28c7e1408d59da763c",
+   "0c01a0c28ba634db6fb1143beb554e62c2d882cb",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-013.html": [
-   "2b60ff5c622e0d7e8e96e1207e7113f14043f9bf",
+   "9aef864c9219caadc3cda6d67ee01f8d42b099a1",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-014.html": [
-   "04969bb65a9b84c033e40e38f2ccc0165a0cc36d",
+   "ddbeddf12fe21a462c4d32a49b621fa623097e01",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-015.html": [
-   "34c261e437241516b7d5060a037d8ea10493b0e5",
+   "b0edd4e298208661acc66b952c2e823f2c65c799",
    "reftest"
   ],
   "css/css-text/line-break/line-break-anywhere-016.html": [
-   "81b565209c6317113d5a138375b0249b4a22342a",
+   "5f80f52c6ea0c5c9c7577896b9bc5d309093c90e",
    "reftest"
   ],
   "css/css-text/line-break/line-break-loose-011.xht": [
@@ -380225,10 +380882,6 @@
    "f62e2e5c005d4043c02894eed87422fa6c59b824",
    "reftest"
   ],
-  "css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html": [
-   "820012e6ca10dec9065f7c5869c47b065b426033",
-   "reftest"
-  ],
   "css/css-text/white-space/white-space-wrap-after-nowrap-001.html": [
    "a484f1cf9167e468063cf2205493b8e71a254470",
    "reftest"
@@ -399982,7 +400635,7 @@
    "testharness"
   ],
   "css/cssom/interfaces-expected.txt": [
-   "2b9315439abf433c978c1f041198ce56bc228109",
+   "7ffb564d6729b1086084b86bc26e8cd7649ee630",
    "support"
   ],
   "css/cssom/interfaces.html": [
@@ -400477,6 +401130,14 @@
    "3a2d8feaeefc82c20afd3de2c2cf9ce9bf6aed11",
    "reftest"
   ],
+  "css/filter-effects/backdrop-filter-plus-opacity-ref.html": [
+   "347b7a684cac002562314b8e8af57fb919667bec",
+   "support"
+  ],
+  "css/filter-effects/backdrop-filter-plus-opacity.html": [
+   "cb189f9f3e9375c1f5ae1c2abf8433f4d13f39fc",
+   "reftest"
+  ],
   "css/filter-effects/backdrop-filter-reference-filter.html": [
    "6c61a9620aa82d23375fd31900d87bcfd873a5e1",
    "reftest"
@@ -401741,6 +402402,10 @@
    "7433877972b09b3a03cd9f8a11dcd3efd1aa01d6",
    "reftest"
   ],
+  "css/mediaqueries/width-equals-window-inner-width.html": [
+   "775c1112de75e7703c28c2241b533e29e13ba5c5",
+   "testharness"
+  ],
   "css/motion/META.yml": [
    "20835b48397f136a30b82a62654d389cad326315",
    "support"
@@ -412278,7 +412943,7 @@
    "testharness"
   ],
   "element-timing/images-repeated-resource.html": [
-   "9bc8b5f45e4add4c384160d43649e13eebc1a563",
+   "a6ad7acefcbef2891d50b6993457a2026b12f604",
    "testharness"
   ],
   "element-timing/invisible-images.html": [
@@ -412342,7 +413007,7 @@
    "support"
   ],
   "element-timing/resources/element-timing-helpers.js": [
-   "f98f9b21134e334e46510bb419a12291d23817bc",
+   "8933732616c116f1617c64f07182c9cbeb9f59fe",
    "support"
   ],
   "element-timing/resources/iframe-with-square-sends-entry.html": [
@@ -438822,7 +439487,7 @@
    "testharness"
   ],
   "imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html": [
-   "4b65b2882f2d8028547cb34727ef80ec805bd2b0",
+   "81d0c900650ea3b489549b7977cd9922a35bcca6",
    "testharness"
   ],
   "imagebitmap-renderingcontext/tranferFromImageBitmap-TransferToImageBitmap-offscreen.html": [
@@ -439450,7 +440115,7 @@
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini": [
-   "c83e8ff9261b78084f75fb584a8b5236cc28c3fd",
+   "e34c73f1ba984ed27b5ced8ad99a3f673cd109cf",
    "support"
   ],
   "infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini": [
@@ -440054,7 +440719,7 @@
    "support"
   ],
   "interfaces/longtasks.idl": [
-   "21bb1dd117ba7b35965c8cd42fdefded94e101b1",
+   "333b842f86e5d41f6f1aab8827cf086356c5a782",
    "support"
   ],
   "interfaces/magnetometer.idl": [
@@ -440782,7 +441447,7 @@
    "testharness"
   ],
   "largest-contentful-paint/cross-origin-image.sub.html": [
-   "6e86f13b9ccccf5cecd1ca4bd02b6d0cd2007845",
+   "88775b861a6b98b1af0fb5163222a1025a6df02e",
    "testharness"
   ],
   "largest-contentful-paint/expanded-image.html": [
@@ -440793,12 +441458,24 @@
    "3e083625bdc1812a2c344b8eefaaa10d3b31e623",
    "testharness"
   ],
+  "largest-contentful-paint/loadTime-after-appendChild.html": [
+   "fb0eddb220ec660d529a43b112c576bf146a87e8",
+   "testharness"
+  ],
   "largest-contentful-paint/observe-image.html": [
-   "4d56cc2d8386e41e220097836755d1936185b41c",
+   "16b3502eb340cbce179bf440c245cafafe4beea4",
    "testharness"
   ],
   "largest-contentful-paint/observe-text.html": [
-   "7dbfbe52f3dadf01524025a80fdcce4b64a60e19",
+   "2cf1344f2557d5bddd22eaf4ae4fed99d89267a1",
+   "testharness"
+  ],
+  "largest-contentful-paint/repeated-image.html": [
+   "94406b20d62b417a690ce6a96d909bb29c791081",
+   "testharness"
+  ],
+  "largest-contentful-paint/supported-lcp-type.html": [
+   "25d4eaa0367f45440d286c6c1c14de4458465d7b",
    "testharness"
   ],
   "layout-instability/buffer-layout-shift.html": [
@@ -440818,7 +441495,7 @@
    "support"
   ],
   "layout-instability/supported-layout-type.html": [
-   "9bc537016581274e03b09e677f3fe8c36f3c613e",
+   "8679a2de7388c5e43a8d784cb3a986d4e23ca568",
    "testharness"
   ],
   "lifecycle/META.yml": [
@@ -440905,6 +441582,10 @@
    "2ffbc821c66a256765f00773afcef5ed94ac5a44",
    "testharness"
   ],
+  "loading/lazyload/picture-loading-lazy.tentative.html": [
+   "58f8c3a4d5a1e21ce2afd9def3ab9b5870cc272f",
+   "testharness"
+  ],
   "loading/lazyload/resources/image.png": [
    "b712825093805d1052b01047b1dbb102f0af8f0f",
    "support"
@@ -440949,8 +441630,12 @@
    "ea17b824c355ace2b67ccefc1ddbf25e03a299d0",
    "testharness"
   ],
+  "longtask-timing/idlharness.window-expected.txt": [
+   "ad08a2961e558901ff0b5fb06f7156344a31d696",
+   "support"
+  ],
   "longtask-timing/idlharness.window.js": [
-   "0ef7e85440ee1fc99c05ef5be0fc1fe61f818118",
+   "fd9a3f042f6c9fc3ac605fc0dd4e23edfa5d683b",
    "testharness"
   ],
   "longtask-timing/longtask-attributes.html": [
@@ -464866,7 +465551,7 @@
    "support"
   ],
   "resources/idlharness.js": [
-   "cb294c072de2af61b2a4c7c8e4588d05a8186109",
+   "9be554d96b6e29cb43576f5ac8c1f8209e89fd62",
    "support"
   ],
   "resources/idlharness.js.headers": [
@@ -467078,7 +467763,7 @@
    "testharness"
   ],
   "service-workers/service-worker/interfaces-sw.https-expected.txt": [
-   "c368ef5311b68e6fd474a9871a999618db913a96",
+   "ab39688ddf84118c0d491f56ad2df9a4fb94a046",
    "support"
   ],
   "service-workers/service-worker/interfaces-sw.https.html": [
@@ -467086,7 +467771,7 @@
    "testharness"
   ],
   "service-workers/service-worker/interfaces-window.https.html": [
-   "f70cf40931db88350c5fb0f5ebb1fbd10f917dba",
+   "cc3bdaf11fc7bc174eef555a60263e192efdc539",
    "testharness"
   ],
   "service-workers/service-worker/invalid-blobtype.https.html": [
@@ -470310,7 +470995,7 @@
    "testharness"
   ],
   "std-toast/attributes.html": [
-   "97bab585c7045350b873db9683ce680452ba4451",
+   "9b87280b6688b3847401ea7b97ed63f6164bf70a",
    "testharness"
   ],
   "std-toast/closebutton.html": [
@@ -470330,7 +471015,7 @@
    "testharness"
   ],
   "std-toast/options.html": [
-   "6d4a462d3a9417a501c6ad434b25896a03e162db",
+   "b75ff72cb9e86857e249a50f1ccb0713ad5c9144",
    "testharness"
   ],
   "std-toast/ref-tests/toast-slotting-expected.html": [
@@ -470341,6 +471026,10 @@
    "4d6f5038f2d6ffa80ebdfa12798c8c4202b39670",
    "reftest"
   ],
+  "std-toast/reflection.html": [
+   "36cbaf652287dbbde5a871b398d313cf70d1b275",
+   "testharness"
+  ],
   "std-toast/resources/helpers.js": [
    "256f0c880408c3343d36392f8b4cf64d9bbbfbe6",
    "support"
@@ -470350,7 +471039,7 @@
    "testharness"
   ],
   "std-toast/styles.html": [
-   "98e6723c3c8b16fd71d388ad3947627194c76436",
+   "1db8620485dc459577649e0c2689194d106dcc51",
    "testharness"
   ],
   "storage/META.yml": [
@@ -477554,7 +478243,7 @@
    "support"
   ],
   "tools/wpt/browser.py": [
-   "fe794a59a887a224ad52eb64cac9bd3ca8ea3e83",
+   "1f0134153169703b897f70849193d4076c64673b",
    "support"
   ],
   "tools/wpt/commands.json": [
@@ -477582,7 +478271,7 @@
    "support"
   ],
   "tools/wpt/run.py": [
-   "4693bb7f11f94cd1747133bc1935fd38f206489d",
+   "6acc5b8e7400f5726538657239de5710ecea396d",
    "support"
   ],
   "tools/wpt/testfiles.py": [
@@ -477694,7 +478383,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/__init__.py": [
-   "8698e816305a694e31447fdd09d6caff5aaa42d3",
+   "18434e499dc2276d6b23157b854dcc116c664901",
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/base.py": [
@@ -477729,14 +478418,14 @@
    "599ec9f3110f89f5d64effe98130ede930f1fb7c",
    "support"
   ],
-  "tools/wptrunner/wptrunner/browsers/fennec.py": [
-   "b1f535a85401a39b6ff58cd631bafcc42ce32e9a",
-   "support"
-  ],
   "tools/wptrunner/wptrunner/browsers/firefox.py": [
    "2f58022d238742ac97e4d898830cfe48801718fe",
    "support"
   ],
+  "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
+   "d8d5c7f728451a97b4f93fb80bfb6c56a3c2a595",
+   "support"
+  ],
   "tools/wptrunner/wptrunner/browsers/ie.py": [
    "78c22b909acf410038ff06769366662ab0c589a0",
    "support"
@@ -488926,7 +489615,7 @@
    "support"
   ],
   "webxr/resources/webxr_test_asserts.js": [
-   "36524211d01980283124c0e2c7fcefd67a7b8b04",
+   "24b5274bc23d4e601e94eebd93968d9c30942b08",
    "support"
   ],
   "webxr/resources/webxr_test_constants.js": [
@@ -489105,12 +489794,16 @@
    "956edba98365d90eb180ad3c9697dae098bd25db",
    "testharness"
   ],
+  "webxr/xrWebGLLayer_framebuffer.https-expected.txt": [
+   "54e5aa445b27baa62ee3c94a64c96b942edfdbb6",
+   "support"
+  ],
   "webxr/xrWebGLLayer_framebuffer.https.html": [
-   "7c4ff17c2547995afbf561850faaf92b6aa5e56f",
+   "ba6b7dc0b922ae45aa714de8d3ca6f4ffbaf414c",
    "testharness"
   ],
   "webxr/xrWebGLLayer_viewports.https.html": [
-   "8cfccff3c01dedb41db4f26563824ce0cdb65ad3",
+   "94a23dcdb427298722a989987a02f35a8d98d055",
    "testharness"
   ],
   "workers/META.yml": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-thickness-001-notref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
index f876afa..4e7db88 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-decoration-thickness-001-notref.html
@@ -10,6 +10,7 @@
         }
         div span {
             text-decoration: green underline;
+            text-decoration-skip-ink: none;
             font: 20px/1 Ahem;
             color: transparent;
             padding-right: 1em;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-001-notref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-001-notref.html
index c56078a..8b1dacf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-001-notref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-001-notref.html
@@ -10,6 +10,7 @@
         }
         div span {
             text-decoration: green underline;
+            text-decoration-skip-ink: none;
             font: 20px/1 Ahem;
             color: transparent;
             padding-bottom: 20px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-002-ref.html
index ed2e3ceff..6e7d5a65 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-underline-offset-002-ref.html
@@ -10,6 +10,7 @@
         }
         #text, #norm{
             text-decoration: green underline;
+            text-decoration-skip-ink: none;
             text-underline-offset: 0px;
             font: 20px/1 Ahem;
             color: transparent;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html
index 37e954b..6fd8383d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-decoration-thickness-linethrough-001.html
@@ -18,6 +18,7 @@
             font: 20px/1 Ahem;
             color: transparent;
             text-decoration: green line-through;
+            text-decoration-skip-ink: none;
             /* We make the text decoration just a bit thicker than the div's height, so that
              * it will entirely cover the div's content-box (making it fully green) as long
              * as the line-through is approximately centered, vertically.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-001.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-001.html
index bd9a29c7..f7aeb543 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-001.html
@@ -15,6 +15,7 @@
         }
         div span {
             text-decoration: green underline;
+            text-decoration-skip-ink: none;
             font: 20px/1 Ahem;
             color: transparent;
             padding-bottom: 20px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-002.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-002.html
index 7441ff9d..dc65db7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-underline-offset-002.html
@@ -14,6 +14,7 @@
         }
         #text, #norm{
             text-decoration: green underline;
+            text-decoration-skip-ink: none;
             font: 20px/1 Ahem;
             color: transparent;
             position: relative;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html
new file mode 100644
index 0000000..fde2a3d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:loose, a browser allows a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="ja">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if ja and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal-expected.txt
new file mode 100644
index 0000000..8432cf1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if ja and normal assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html
new file mode 100644
index 0000000..d6f58cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="ja">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if ja and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict-expected.txt
new file mode 100644
index 0000000..5319ad1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if ja and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html
new file mode 100644
index 0000000..8265f91
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,ja)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Japanese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="ja">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="ja">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if ja and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html
new file mode 100644
index 0000000..c902bf7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html
new file mode 100644
index 0000000..e98d4a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html
new file mode 100644
index 0000000..29810f2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge not being Chinese or Japanese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html
new file mode 100644
index 0000000..9dffd854
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html
new file mode 100644
index 0000000..9c0af13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html
new file mode 100644
index 0000000..d573bac7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-cpm-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html
new file mode 100644
index 0000000..80b5bb0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-loose.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html
new file mode 100644
index 0000000..6d60430
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-normal.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html
new file mode 100644
index 0000000..e0f60cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-hyphens-strict.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html
new file mode 100644
index 0000000..fff23f3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser allows a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html
new file mode 100644
index 0000000..d000d8e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-normal.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html
new file mode 100644
index 0000000..79d6e12c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-strict.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html
new file mode 100644
index 0000000..ff8ef05
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-loose.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser allows a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html
new file mode 100644
index 0000000..c5913821
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-normal.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html
new file mode 100644
index 0000000..46c0fe3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-iteration-strict.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html
new file mode 100644
index 0000000..0eec9685
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser wll NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html
new file mode 100644
index 0000000..6043912
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html
new file mode 100644
index 0000000..8c9387f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-po-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose-expected.txt
new file mode 100644
index 0000000..05f21b3ff
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html
new file mode 100644
index 0000000..8b2fd1c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:loose, a browser wll NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal-expected.txt
new file mode 100644
index 0000000..7f23187b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if de and normal assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html
new file mode 100644
index 0000000..2da6d3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict-expected.txt
new file mode 100644
index 0000000..5643e40
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if de and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html
new file mode 100644
index 0000000..99cf5c5f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,de)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is neither Japanese nor Chinese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="de">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="de">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if de and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html
new file mode 100644
index 0000000..d6d0a1b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (unknown lang)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being unkonwn makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html
new file mode 100644
index 0000000..548fa17
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (unknown lang)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being unknown makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict-expected.txt
new file mode 100644
index 0000000..5fa18c5a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict-expected.txt
@@ -0,0 +1,55 @@
+This is a testharness.js-based test.
+Found 51 tests; 0 PASS, 51 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL 3041  HIRAGANA LETTER SMALL A may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3043  HIRAGANA LETTER SMALL I may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3045  HIRAGANA LETTER SMALL U may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3047  HIRAGANA LETTER SMALL E may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3049  HIRAGANA LETTER SMALL O may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3063  HIRAGANA LETTER SMALL TU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3083  HIRAGANA LETTER SMALL YA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3085  HIRAGANA LETTER SMALL YU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3087  HIRAGANA LETTER SMALL YO may NOT appear at line start if strict assert_true: expected true got false
+FAIL 308E  HIRAGANA LETTER SMALL WA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3095  HIRAGANA LETTER SMALL KA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 3096  HIRAGANA LETTER SMALL KE may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30A1  KATAKANA LETTER SMALL A may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30A3  KATAKANA LETTER SMALL I may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30A5  KATAKANA LETTER SMALL U may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30A7  KATAKANA LETTER SMALL E may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30A9  KATAKANA LETTER SMALL O may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30C3  KATAKANA LETTER SMALL TU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30E3  KATAKANA LETTER SMALL YA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30E5  KATAKANA LETTER SMALL YU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30E7  KATAKANA LETTER SMALL YO may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30EE  KATAKANA LETTER SMALL WA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30F5  KATAKANA LETTER SMALL KA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30F6  KATAKANA LETTER SMALL KE may NOT appear at line start if strict assert_true: expected true got false
+FAIL 30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F0  KATAKANA LETTER SMALL KU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F1  KATAKANA LETTER SMALL SI may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F2  KATAKANA LETTER SMALL SU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F3  KATAKANA LETTER SMALL TO may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F4  KATAKANA LETTER SMALL NU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F5  KATAKANA LETTER SMALL HA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F6  KATAKANA LETTER SMALL HI may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F7  KATAKANA LETTER SMALL HU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F8  KATAKANA LETTER SMALL HE may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31F9  KATAKANA LETTER SMALL HO may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FA  KATAKANA LETTER SMALL MU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FB  KATAKANA LETTER SMALL RA may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FC  KATAKANA LETTER SMALL RI may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FD  KATAKANA LETTER SMALL RU may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FE  KATAKANA LETTER SMALL RE may NOT appear at line start if strict assert_true: expected true got false
+FAIL 31FF  KATAKANA LETTER SMALL RO may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF67  HALFWIDTH KATAKANA LETTER SMALL A may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF68  HALFWIDTH KATAKANA LETTER SMALL I may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF69  HALFWIDTH KATAKANA LETTER SMALL U may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6A  HALFWIDTH KATAKANA LETTER SMALL E may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6B  HALFWIDTH KATAKANA LETTER SMALL O may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6C  HALFWIDTH KATAKANA LETTER SMALL YA may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6D  HALFWIDTH KATAKANA LETTER SMALL YU may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6E  HALFWIDTH KATAKANA LETTER SMALL YO may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF6F  HALFWIDTH KATAKANA LETTER SMALL TU may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK may NOT appear at line start if strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html
new file mode 100644
index 0000000..a4e87178
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (language unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge being unknown makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html
new file mode 100644
index 0000000..3d4cb26
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknonw loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html
new file mode 100644
index 0000000..417973b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html
new file mode 100644
index 0000000..c6685dfe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cpm-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: centred punctuation (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:strict, a browser will NOT allow a break before one of the centred punctuation characters listed.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `30FB  KATAKANA MIDDLE DOT
+FF1A  FULLWIDTH COLON
+FF1B  FULLWIDTH SEMICOLON
+FF65  HALFWIDTH KATAKANA MIDDLE DOT
+203C  DOUBLE EXCLAMATION MARK
+2047  DOUBLE QUESTION MARK
+2048  QUESTION EXCLAMATION MARK
+2049  EXCLAMATION QUESTION MARK
+FF01  FULLWIDTH EXCLAMATION MARK
+FF1F  FULLWIDTH QUESTION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html
new file mode 100644
index 0000000..f15f263
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-loose.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (loose,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html
new file mode 100644
index 0000000..4e9dc56
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-normal.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unkonwn and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html
new file mode 100644
index 0000000..595cd5df
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-hyphens-strict.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS3 Text, linebreaks: hyphens (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:strict, a browser will NOT allow a break before a hyphen.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2010 HYPHEN
+2013 EN DASH
+301C WAVE DASH
+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose-expected.txt
new file mode 100644
index 0000000..c4135676
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html
new file mode 100644
index 0000000..c507f78e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-loose.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser allows a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html
new file mode 100644
index 0000000..4e8d961
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-normal.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html
new file mode 100644
index 0000000..a1c3a85
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-in-strict.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: IN (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before an inseparable character.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `2024  ONE DOT LEADER
+2025  TWO DOT LEADER
+2026  HORIZONTAL ELLIPSIS
+22EF  MIDLINE HORIZONTAL ELLIPSIS
+FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose-expected.txt
new file mode 100644
index 0000000..6d7a0fb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose-expected.txt
@@ -0,0 +1,9 @@
+This is a testharness.js-based test.
+FAIL 3005  IDEOGRAPHIC ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+FAIL 303B  VERTICAL IDEOGRAPHIC ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+FAIL 309D  HIRAGANA ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+FAIL 309E  HIRAGANA VOICED ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+FAIL 30FD  KATAKANA ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+FAIL 30FE  KATAKANA VOICED ITERATION MARK may appear at line start if lang unknown and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html
new file mode 100644
index 0000000..420a7b6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is uknown, and line-break:loose, a browser allows a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if lang unknown and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html
new file mode 100644
index 0000000..9d7b2c03
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-normal.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:normal, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html
new file mode 100644
index 0000000..54c7559
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-strict.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: iteration (strict,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before an iteration mark.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3005  IDEOGRAPHIC ITERATION MARK
+303B  VERTICAL IDEOGRAPHIC ITERATION MARK
+309D  HIRAGANA ITERATION MARK
+309E  HIRAGANA VOICED ITERATION MARK
+30FD  KATAKANA ITERATION MARK
+30FE  KATAKANA VOICED ITERATION MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if lang unknown and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html
new file mode 100644
index 0000000..e635075a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-loose.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html
new file mode 100644
index 0000000..46e7472
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-normal.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html
new file mode 100644
index 0000000..61fd7b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-po-strict.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PO AFW (strict,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before a PO character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B0  DEGREE SIGN
+2030  PER MILLE SIGN
+2032  PRIME
+2033  DOUBLE PRIME
+2035  REVERSED PRIME
+2103  DEGREE CELSIUS
+2109  DEGREE FAHRENHEIT
+FE6A  SMALL PERCENT SIGN
+FF05  FULLWIDTH PERCENT SIGN
+FFE0  FULLWIDTH CENT SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose-expected.txt
new file mode 100644
index 0000000..2d453c3a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if loose assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html
new file mode 100644
index 0000000..b21853f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:loose, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal-expected.txt
new file mode 100644
index 0000000..c38e02c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if normal assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if normal assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html
new file mode 100644
index 0000000..337cf8f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,unknown)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unkonwn, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict-expected.txt
new file mode 100644
index 0000000..d8d8a1ee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html
new file mode 100644
index 0000000..d25fa68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,unkonwn)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is unknown, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
new file mode 100644
index 0000000..a131395e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-loose.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:loose, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if zh and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
new file mode 100644
index 0000000..ff7456b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-normal.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>Line-break:normal, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="The browser allows a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if zh and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
new file mode 100644
index 0000000..dc752f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-cj-strict.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>line-break:strict, Conditional Japanese Starter (CJ) (zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="With line-break:strict, a browser will NOT allow a conditional Japanese starter at the beginning of a line; the langauge being chinese makes no difference.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `3041  HIRAGANA LETTER SMALL A
+3043  HIRAGANA LETTER SMALL I
+3045  HIRAGANA LETTER SMALL U
+3047  HIRAGANA LETTER SMALL E
+3049  HIRAGANA LETTER SMALL O
+3063  HIRAGANA LETTER SMALL TU
+3083  HIRAGANA LETTER SMALL YA
+3085  HIRAGANA LETTER SMALL YU
+3087  HIRAGANA LETTER SMALL YO
+308E  HIRAGANA LETTER SMALL WA
+3095  HIRAGANA LETTER SMALL KA
+3096  HIRAGANA LETTER SMALL KE
+30A1  KATAKANA LETTER SMALL A
+30A3  KATAKANA LETTER SMALL I
+30A5  KATAKANA LETTER SMALL U
+30A7  KATAKANA LETTER SMALL E
+30A9  KATAKANA LETTER SMALL O
+30C3  KATAKANA LETTER SMALL TU
+30E3  KATAKANA LETTER SMALL YA
+30E5  KATAKANA LETTER SMALL YU
+30E7  KATAKANA LETTER SMALL YO
+30EE  KATAKANA LETTER SMALL WA
+30F5  KATAKANA LETTER SMALL KA
+30F6  KATAKANA LETTER SMALL KE
+30FC  KATAKANA-HIRAGANA PROLONGED SOUND MARK
+31F0  KATAKANA LETTER SMALL KU
+31F1  KATAKANA LETTER SMALL SI
+31F2  KATAKANA LETTER SMALL SU
+31F3  KATAKANA LETTER SMALL TO
+31F4  KATAKANA LETTER SMALL NU
+31F5  KATAKANA LETTER SMALL HA
+31F6  KATAKANA LETTER SMALL HI
+31F7  KATAKANA LETTER SMALL HU
+31F8  KATAKANA LETTER SMALL HE
+31F9  KATAKANA LETTER SMALL HO
+31FA  KATAKANA LETTER SMALL MU
+31FB  KATAKANA LETTER SMALL RA
+31FC  KATAKANA LETTER SMALL RI
+31FD  KATAKANA LETTER SMALL RU
+31FE  KATAKANA LETTER SMALL RE
+31FF  KATAKANA LETTER SMALL RO
+FF67  HALFWIDTH KATAKANA LETTER SMALL A
+FF68  HALFWIDTH KATAKANA LETTER SMALL I
+FF69  HALFWIDTH KATAKANA LETTER SMALL U
+FF6A  HALFWIDTH KATAKANA LETTER SMALL E
+FF6B  HALFWIDTH KATAKANA LETTER SMALL O
+FF6C  HALFWIDTH KATAKANA LETTER SMALL YA
+FF6D  HALFWIDTH KATAKANA LETTER SMALL YU
+FF6E  HALFWIDTH KATAKANA LETTER SMALL YO
+FF6F  HALFWIDTH KATAKANA LETTER SMALL TU
+FF70  HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if zh and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
new file mode 100644
index 0000000..b56cd28c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-loose.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (loose,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:loose, a browser allows a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: loose; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文文<br/>&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may appear at line start if zh and loose');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal-expected.txt
new file mode 100644
index 0000000..0dd73724
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and normal assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
new file mode 100644
index 0000000..198bf28c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-normal.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (normal,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:normal, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: normal; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if zh and normal');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
new file mode 100644
index 0000000..c71014b4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html  lang="en" >
+<head>
+<meta charset="utf-8"/>
+<title>CSS text, linebreaks: PR AFW (strict,zh)</title>
+<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#line-break-property">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<meta name="assert" content="When the language is Chinese, and line-break:strict, a browser will NOT allow a break before a PR character with East Asian Width of A, F, or W.">
+<style type="text/css">
+@font-face {
+    font-family: 'mplus-1p-regular';
+    src: url('/fonts/mplus-1p-regular.woff') format('woff');
+    }
+#wrapper { position: relative; }
+.test { color: red; }
+.test, .ref { font-size: 30px; font-family: mplus-1p-regular, sans-serif; width: 185px; padding: 0; border: 1px solid orange; line-height: 1em; }
+</style>
+<style>
+.test { line-break: strict; }
+</style>
+<script>
+var charlist = `00B1  PLUS-MINUS SIGN
+20AC  EURO SIGN
+2116  NUMERO SIGN
+FE69  SMALL DOLLAR SIGN
+FF04  FULLWIDTH DOLLAR SIGN
+FFE1  FULLWIDTH POUND SIGN
+FFE5  FULLWIDTH YEN SIGN
+FFE6  FULLWIDTH WON SIGN`
+</script>
+</head>
+<body>
+<script>
+var lines = charlist.split('\n')
+var out = '<div id="log"></div>\n'
+for (var i=0;i<lines.length;i++) {
+	// get the data
+	var firstSpace = lines[i].indexOf(' ')
+	var hex = lines[i].substr(0,firstSpace)
+	var name = lines[i].substr(firstSpace)
+	// make a test
+	out +=  '<div class="wrapper"><div>'+hex+'</div>' +
+	'<div class="test" id="test'+i+'" lang="zh">文文文文文文&#x'+hex+';字<span id="testSpan'+i+'">字</span></div>' +
+	 '<div class="ref" id="ref'+i+'" lang="zh">文文文文文<br/>文&#x'+hex+';字<span id="refSpan'+i+'">字</span></div>' +
+	 '</div>'
+	}
+function spansNearEnough(counter) {
+  return Math.abs( document.getElementById('testSpan'+counter).getBoundingClientRect().left
+           - document.getElementById('refSpan'+counter).getBoundingClientRect().left ) < 1;
+}
+
+document.querySelector('body').innerHTML = out
+setup({explicit_done: true});
+
+document.fonts.ready.then(validate);
+
+function validate() {
+  for (i=0;i<lines.length;i++) {
+    test(function() {
+      assert_true(spansNearEnough(i));
+    }, lines[i]+' may NOT appear at line start if zh and strict');
+    // Hide successful tests.
+    if (spansNearEnough(i)) document.getElementById('test'+i).parentNode.style.display = 'none'
+  }
+  done();
+}
+</script>
+<!--Notes:
+The test creates a box with room for 6 characters, causing wrapping to occur either between the 6th and the 7th character, or before the 6th if the breaks after the 6th or before the 7th are prohibited.
+
+It also creates the expected behaviour with a ref instance, using <br/>. Each line ends with a span. The test then checks whether the left edge of the span is in the same place in test and ref instance.
+-->
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-004.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-004.html
index daf8420b..19b98417 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-004.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
 <title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
index 47f675eda..5e286a0 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: overflow-wrap:break-word + white-space:break-spaces</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
 <link rel="help" title="3. White Space and Wrapping: the white-space property" href="https://www.w3.org/TR/css-text-3/#white-space-property">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-006.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-006.html
index de5a43e..207cf84 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-006.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
 <title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-007.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-007.html
index 300d9bd..b8e4627e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-007.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-007.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-008.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-008.html
index a7590a2..6b7fb14 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-008.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-008.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="3. White Space and Wrapping: the white-space property" href="https://www.w3.org/TR/css-text-3/#white-space-property">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-009.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-009.html
index 4cc3f4e..6a0ab91 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-009.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-009.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
 <title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-010.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-010.html
index 6554bf6..19cc7966 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-010.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-010.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
 <title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-011.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-011.html
index 6cbec13..70d9628a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-011.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-011.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-012.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-012.html
index 2dfe607..0c01a0c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-012.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-012.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-013.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-013.html
index 2b60ff5c..9aef864 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-013.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-013.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-014.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-014.html
index 04969bb..ddbeddf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-014.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-014.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-015.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-015.html
index 34c261e..b0edd4e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-015.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-015.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-016.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-016.html
index 81b56520..5f80f52 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-016.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-016.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
+<html lang=en>
 <meta charset="utf-8">
-<title>CSS Text Test: word-break: break-all</title>
+<title>CSS Text Test: line-break: anywhere</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
 <link rel="help" title="5.3. Line Breaking Strictness: the line-break property" href="https://www.w3.org/TR/css-text-3/#propdef-line-break">
 <link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html
deleted file mode 100644
index 820012e6..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-pre-wrap-trailing-spaces-006.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>CSS Text test: hanging trailing spaces with white-space:pre-wrap</title>
-<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com" />
-<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
-<link rel="match" href="reference/white-space-pre-wrap-trailing-spaces-004-ref.html">
-<meta name="assert" content="Preserved white space at the end of the line is hanged when white-space is pre-wrap and any overflowing space is removed.">
-<style>
-div {
-  font: 25px/1 Ahem;
-}
-.ref {
-  position: absolute;
-  color: red;
-  z-index: -1;
-}
-.test span { background: red; }
-.test {
-  color: green;
-  width: 2ch;
-  white-space: pre-wrap;
-}
-.test span { background: green; }
-</style>
-
-<p>This test passes if there is a green square and no red.
-<div class="ref">X<span>X</span><br>XX</div>
-<div class="test">X<span>&#x0020;&#x0020;</span><span>&#x0020;XX</span></div>
-
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/external/wpt/css/cssom/interfaces-expected.txt
index 2b93154..7ffb564 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom/interfaces-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/cssom/interfaces-expected.txt
@@ -1,6 +1,7 @@
 This is a testharness.js-based test.
-Found 377 tests; 322 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 389 tests; 334 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
+PASS Partial interface CSSStyleSheet: original interface defined
 PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
 PASS Partial interface Window: original interface defined
 PASS MediaList interface: existence and properties of interface object
@@ -50,6 +51,9 @@
 PASS CSSStyleSheet interface: attribute cssRules
 PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
 PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
+PASS CSSStyleSheet interface: attribute rules
+PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
+PASS CSSStyleSheet interface: operation removeRule(unsigned long)
 PASS CSSStyleSheet must be primary interface of sheet
 PASS Stringification of sheet
 PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
@@ -58,6 +62,11 @@
 PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
 PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
 PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
+PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
+PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
+PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
+PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
+PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
 PASS StyleSheet interface: sheet must inherit property "type" with the proper type
 PASS StyleSheet interface: sheet must inherit property "href" with the proper type
 PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
@@ -367,9 +376,12 @@
 PASS CSS namespace: operation escape(CSSOMString)
 PASS SVGElement interface: attribute style
 PASS SVGElement interface: svg_element must inherit property "style" with the proper type
+PASS SVGStyleElement interface: attribute sheet
 PASS HTMLElement interface: attribute style
 PASS HTMLElement interface: style_element must inherit property "style" with the proper type
 PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
+PASS HTMLLinkElement interface: attribute sheet
+PASS HTMLStyleElement interface: attribute sheet
 PASS Window interface: operation getComputedStyle(Element, CSSOMString)
 PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
 PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
diff --git a/third_party/blink/web_tests/external/wpt/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html b/third_party/blink/web_tests/external/wpt/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
index 4b65b288..81d0c9006 100644
--- a/third_party/blink/web_tests/external/wpt/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
+++ b/third_party/blink/web_tests/external/wpt/imagebitmap-renderingcontext/tranferFromImageBitmap-ToBlob-offscreen.html
@@ -15,21 +15,29 @@
 }
 
 promise_test(function() {
-    function testTransferFromImageBitmapToBlobOffscreen(greenImage) {
+    function transferFromImageBitmapToBlobOffscreen(greenImage) {
         var bitmapCanvas = new OffscreenCanvas(width,height);
         var bitmapCtx = bitmapCanvas.getContext('bitmaprenderer');
         bitmapCtx.transferFromImageBitmap(greenImage);
 
+        return bitmapCanvas.convertToBlob();
+    }
+
+    function drawBlobToCanvas(blob) {
         // Make sure the bitmap renderer canvas is filled correctly.
         var pngImage = new Image();
-        bitmapCanvas.convertToBlob().then(function(blob){
-          pngImage.src = URL.createObjectURL(blob);
-          var myCanvasToTest = document.createElement('canvas');
-          myCanvasToTest.width = width;
-          myCanvasToTest.height = height;
-          var myCtxToTest = myCanvasToTest.getContext('2d');
-          myCtxToTest.drawImage(pngImage, 0, 0);
-          testCanvas(myCtxToTest, 0, 255, 0, 255);
+        var myCanvasToTest = document.createElement('canvas');
+        myCanvasToTest.width = width;
+        myCanvasToTest.height = height;
+
+        // Wait for the blob img to load.
+        return new Promise(function(resolve) {
+            pngImage.src = URL.createObjectURL(blob);
+            pngImage.onload = function() {
+                var myCtxToTest = myCanvasToTest.getContext('2d');
+                myCtxToTest.drawImage(pngImage, 0, 0);
+                resolve(myCtxToTest);
+            };
         });
     }
 
@@ -40,11 +48,13 @@
     greenCtx.fillStyle = '#0f0';
     greenCtx.fillRect(0, 0, width, height);
 
-    return Promise.all([
-        createImageBitmap(greenCanvas),
-    ]).then(([greenImage]) => {
-        testTransferFromImageBitmapToBlobOffscreen(greenImage);
-    });
-},'Test that transferToBlob works and produce the expected image');
+    return createImageBitmap(greenCanvas).then(
+        greenImage => transferFromImageBitmapToBlobOffscreen(greenImage)
+    ).then(
+        blob => drawBlobToCanvas(blob)
+    ).then(
+        ctx => testCanvas(ctx, 0, 255, 0, 255)
+    );
+},'Test that convertToBlob works and produce the expected image');
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
index c83e8ff..e34c73f 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/metadata/infrastructure/testdriver/actions/actionsWithKeyPressed.html.ini
@@ -4,5 +4,4 @@
 
   [TestDriver actions: actions with key pressed]
     expected:
-      if product == "firefox": FAIL
       if os == "mac" and product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/longtasks.idl b/third_party/blink/web_tests/external/wpt/interfaces/longtasks.idl
index 21bb1dd..333b842f 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/longtasks.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/longtasks.idl
@@ -5,6 +5,7 @@
 
 interface PerformanceLongTaskTiming : PerformanceEntry {
     readonly attribute FrozenArray<TaskAttributionTiming> attribution;
+    [Default] object toJSON();
 };
 
 interface TaskAttributionTiming : PerformanceEntry {
@@ -12,4 +13,5 @@
     readonly attribute DOMString containerSrc;
     readonly attribute DOMString containerId;
     readonly attribute DOMString containerName;
+    [Default] object toJSON();
 };
diff --git a/third_party/blink/web_tests/external/wpt/kv-storage/backingstore.https.html b/third_party/blink/web_tests/external/wpt/kv-storage/backingstore.https.html
index 44e634d8..c0f49d4 100644
--- a/third_party/blink/web_tests/external/wpt/kv-storage/backingstore.https.html
+++ b/third_party/blink/web_tests/external/wpt/kv-storage/backingstore.https.html
@@ -7,7 +7,7 @@
 <script src="/resources/testharnessreport.js"></script>
 
 <script type="module">
-import { storage } from "std:kv-storage";
+import storage from "std:kv-storage";
 
 test(() => {
   assert_equals(storage.backingStore, storage.backingStore);
diff --git a/third_party/blink/web_tests/external/wpt/kv-storage/helpers/kvs-tests.js b/third_party/blink/web_tests/external/wpt/kv-storage/helpers/kvs-tests.js
index 0cf4c2fd..9fd9d20 100644
--- a/third_party/blink/web_tests/external/wpt/kv-storage/helpers/kvs-tests.js
+++ b/third_party/blink/web_tests/external/wpt/kv-storage/helpers/kvs-tests.js
@@ -1,4 +1,4 @@
-import { StorageArea, storage as defaultArea } from "std:kv-storage";
+import defaultArea, { StorageArea } from "std:kv-storage";
 import { assertAsyncIteratorEquals, assertAsyncIteratorCustomEquals } from "./equality-asserters.js";
 
 // Used when we're manually creating the database, and so the IDB helpers also want to clean it up.
diff --git a/third_party/blink/web_tests/external/wpt/kv-storage/interface.https.html b/third_party/blink/web_tests/external/wpt/kv-storage/interface.https.html
index ab1930b2..a5eba425 100644
--- a/third_party/blink/web_tests/external/wpt/kv-storage/interface.https.html
+++ b/third_party/blink/web_tests/external/wpt/kv-storage/interface.https.html
@@ -8,7 +8,7 @@
 <script src="/resources/idlharness.js"></script>
 
 <script type="module">
-import { storage, StorageArea } from "std:kv-storage";
+import storage, { StorageArea } from "std:kv-storage";
 
 // Web IDL/idlharness.js do not yet have support for the spec's IDL, which uses module {},
 // async_iterator, and some new extended attributes. This IDL is a mutated version to work with the
@@ -172,4 +172,4 @@
     frame.onerror = () => reject(new Error(`${frame.src} failed to load`));
   });
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/kv-storage/storage-smoke-test.https.html b/third_party/blink/web_tests/external/wpt/kv-storage/storage-smoke-test.https.html
index 31dac97..748b59bb 100644
--- a/third_party/blink/web_tests/external/wpt/kv-storage/storage-smoke-test.https.html
+++ b/third_party/blink/web_tests/external/wpt/kv-storage/storage-smoke-test.https.html
@@ -8,7 +8,6 @@
 
 <script type="module">
 import { testVariousMethodsWithDefaultArea } from "./helpers/kvs-tests.js";
-import { storage } from "std:kv-storage";
 
 testVariousMethodsWithDefaultArea(
   "Storage methods smoke test with string key and value", "key", "value", assert_equals
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window-expected.txt
new file mode 100644
index 0000000..ad08a29
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window-expected.txt
@@ -0,0 +1,36 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS PerformanceLongTaskTiming interface: existence and properties of interface object
+PASS PerformanceLongTaskTiming interface object length
+PASS PerformanceLongTaskTiming interface object name
+PASS PerformanceLongTaskTiming interface: existence and properties of interface prototype object
+PASS PerformanceLongTaskTiming interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceLongTaskTiming interface: existence and properties of interface prototype object's @@unscopables property
+PASS PerformanceLongTaskTiming interface: attribute attribution
+PASS PerformanceLongTaskTiming interface: operation toJSON()
+PASS PerformanceLongTaskTiming must be primary interface of [object PerformanceLongTaskTiming]
+PASS Stringification of [object PerformanceLongTaskTiming]
+PASS PerformanceLongTaskTiming interface: [object PerformanceLongTaskTiming] must inherit property "attribution" with the proper type
+PASS PerformanceLongTaskTiming interface: [object PerformanceLongTaskTiming] must inherit property "toJSON()" with the proper type
+FAIL PerformanceLongTaskTiming interface: default toJSON operation on [object PerformanceLongTaskTiming] assert_true: Value should be frozen expected true got false
+PASS TaskAttributionTiming interface: existence and properties of interface object
+PASS TaskAttributionTiming interface object length
+PASS TaskAttributionTiming interface object name
+PASS TaskAttributionTiming interface: existence and properties of interface prototype object
+PASS TaskAttributionTiming interface: existence and properties of interface prototype object's "constructor" property
+PASS TaskAttributionTiming interface: existence and properties of interface prototype object's @@unscopables property
+PASS TaskAttributionTiming interface: attribute containerType
+PASS TaskAttributionTiming interface: attribute containerSrc
+PASS TaskAttributionTiming interface: attribute containerId
+PASS TaskAttributionTiming interface: attribute containerName
+PASS TaskAttributionTiming interface: operation toJSON()
+PASS TaskAttributionTiming must be primary interface of [object TaskAttributionTiming]
+PASS Stringification of [object TaskAttributionTiming]
+PASS TaskAttributionTiming interface: [object TaskAttributionTiming] must inherit property "containerType" with the proper type
+PASS TaskAttributionTiming interface: [object TaskAttributionTiming] must inherit property "containerSrc" with the proper type
+PASS TaskAttributionTiming interface: [object TaskAttributionTiming] must inherit property "containerId" with the proper type
+PASS TaskAttributionTiming interface: [object TaskAttributionTiming] must inherit property "containerName" with the proper type
+PASS TaskAttributionTiming interface: [object TaskAttributionTiming] must inherit property "toJSON()" with the proper type
+PASS TaskAttributionTiming interface: default toJSON operation on [object TaskAttributionTiming]
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window.js b/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window.js
index 0ef7e85..fd9a3f0 100644
--- a/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window.js
+++ b/third_party/blink/web_tests/external/wpt/longtask-timing/idlharness.window.js
@@ -7,8 +7,10 @@
 
 idl_test(
   ['longtasks'],
-  ['performance-timeline'],
+  ['performance-timeline', 'hr-time'],
   (idl_array, t) => new Promise((resolve, reject) => {
+
+
     const longTask = () => {
       const begin = self.performance.now();
       while (self.performance.now() < begin + 100);
diff --git a/third_party/blink/web_tests/external/wpt/resources/idlharness.js b/third_party/blink/web_tests/external/wpt/resources/idlharness.js
index cb294c07..9be554d 100644
--- a/third_party/blink/web_tests/external/wpt/resources/idlharness.js
+++ b/third_party/blink/web_tests/external/wpt/resources/idlharness.js
@@ -193,6 +193,12 @@
     this["implements"] = {};
     this["includes"] = {};
     this["inheritance"] = {};
+
+    /**
+     * Record of skipped IDL items, in case we later realize that they are a
+     * dependency (to retroactively process them).
+     */
+    this.skipped = new Map();
 };
 
 IdlArray.prototype.add_idls = function(raw_idls, options)
@@ -244,22 +250,41 @@
         all_deps.add(k);
         this.includes[k].forEach(v => all_deps.add(v));
     });
-    this.partials.map(p => p.name).forEach(v => all_deps.add(v));
-    // Add the attribute idlTypes of all the nested members of all tested idls.
-    for (const obj of [this.members, this.partials]) {
-        const tested = Object.values(obj).filter(m => !m.untested && m.members);
-        for (const parsed of tested) {
-            for (const attr of Object.values(parsed.members).filter(m => !m.untested && m.type === 'attribute')) {
-                all_deps.add(attr.idlType.idlType);
+    this.partials.forEach(p => all_deps.add(p.name));
+
+    // Add the attribute idlTypes of all the nested members of idls.
+    const attrDeps = parsedIdls => {
+        return parsedIdls.reduce((deps, parsed) => {
+            if (parsed.members) {
+                for (const attr of Object.values(parsed.members).filter(m => m.type === 'attribute')) {
+                    let attrType = attr.idlType;
+                    // Check for generic members (e.g. FrozenArray<MyType>)
+                    if (attrType.generic) {
+                        deps.add(attrType.generic);
+                        attrType = attrType.idlType;
+                    }
+                    deps.add(attrType.idlType);
+                }
             }
-        }
-    }
+            if (parsed.base in this.members) {
+                attrDeps([this.members[parsed.base]]).forEach(dep => deps.add(dep));
+            }
+            return deps;
+        }, new Set());
+    };
+
+    const testedMembers = Object.values(this.members).filter(m => !m.untested && m.members);
+    attrDeps(testedMembers).forEach(dep => all_deps.add(dep));
+
+    const testedPartials = this.partials.filter(m => !m.untested && m.members);
+    attrDeps(testedPartials).forEach(dep => all_deps.add(dep));
+
 
     if (options && options.except && options.only) {
         throw new IdlHarnessError("The only and except options can't be used together.");
     }
 
-    const should_skip = name => {
+    const defined_or_untested = name => {
         // NOTE: Deps are untested, so we're lenient, and skip re-encountered definitions.
         // e.g. for 'idl' containing A:B, B:C, C:D
         //      array.add_idls(idl, {only: ['A','B']}).
@@ -268,9 +293,7 @@
         return name in this.members
             || this.is_excluded_by_options(name, options);
     }
-    // Record of skipped items, in case we later determine they are a dependency.
     // Maps name -> [parsed_idl, ...]
-    const skipped = new Map();
     const process = function(parsed) {
         var deps = [];
         if (parsed.name) {
@@ -284,13 +307,15 @@
         }
 
         deps = deps.filter(function(name) {
-            if (!name || should_skip(name) || !all_deps.has(name)) {
+            if (!name
+                || name === parsed.name && defined_or_untested(name)
+                || !all_deps.has(name)) {
                 // Flag as skipped, if it's not already processed, so we can
                 // come back to it later if we retrospectively call it a dep.
                 if (name && !(name in this.members)) {
-                    skipped.has(name)
-                        ? skipped.get(name).push(parsed)
-                        : skipped.set(name, [parsed]);
+                    this.skipped.has(name)
+                        ? this.skipped.get(name).push(parsed)
+                        : this.skipped.set(name, [parsed]);
                 }
                 return false;
             }
@@ -328,9 +353,9 @@
             }
 
             for (const deferred of follow_up) {
-                if (skipped.has(deferred)) {
-                    const next = skipped.get(deferred);
-                    skipped.delete(deferred);
+                if (this.skipped.has(deferred)) {
+                    const next = this.skipped.get(deferred);
+                    this.skipped.delete(deferred);
                     next.forEach(process);
                 }
             }
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
index c368ef5..ab39688 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -1,187 +1,8 @@
 This is a testharness.js-based test.
-Found 183 tests; 166 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Interfaces and attributes in ServiceWorkerGlobalScope
-PASS test setup (cache creation)
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
 FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
 PASS xhr is not exposed
 PASS URL.createObjectURL is not exposed
-FAIL ServiceWorker interface: existence and properties of interface object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface object length assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface object name assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: attribute scriptURL assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: attribute state assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: operation postMessage(any, [object Object]) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: operation postMessage(any, PostMessageOptions) assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-FAIL ServiceWorker interface: attribute onstatechange assert_own_property: self does not have own property "ServiceWorker" expected property "ServiceWorker" missing
-PASS ServiceWorkerRegistration interface: existence and properties of interface object
-PASS ServiceWorkerRegistration interface object length
-PASS ServiceWorkerRegistration interface object name
-PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object
-PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's "constructor" property
-PASS ServiceWorkerRegistration interface: existence and properties of interface prototype object's @@unscopables property
-PASS ServiceWorkerRegistration interface: attribute installing
-PASS ServiceWorkerRegistration interface: attribute waiting
-PASS ServiceWorkerRegistration interface: attribute active
-PASS ServiceWorkerRegistration interface: attribute navigationPreload
-PASS ServiceWorkerRegistration interface: attribute scope
-PASS ServiceWorkerRegistration interface: attribute updateViaCache
-PASS ServiceWorkerRegistration interface: operation update()
-PASS ServiceWorkerRegistration interface: operation unregister()
-PASS ServiceWorkerRegistration interface: attribute onupdatefound
-PASS ServiceWorkerRegistration must be primary interface of self.registration
-PASS Stringification of self.registration
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "installing" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "waiting" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "active" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "navigationPreload" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "scope" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "updateViaCache" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "update()" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "unregister()" with the proper type
-PASS ServiceWorkerRegistration interface: self.registration must inherit property "onupdatefound" with the proper type
-PASS NavigationPreloadManager interface: existence and properties of interface object
-PASS NavigationPreloadManager interface object length
-PASS NavigationPreloadManager interface object name
-PASS NavigationPreloadManager interface: existence and properties of interface prototype object
-PASS NavigationPreloadManager interface: existence and properties of interface prototype object's "constructor" property
-PASS NavigationPreloadManager interface: existence and properties of interface prototype object's @@unscopables property
-PASS NavigationPreloadManager interface: operation enable()
-PASS NavigationPreloadManager interface: operation disable()
-PASS NavigationPreloadManager interface: operation setHeaderValue(ByteString)
-PASS NavigationPreloadManager interface: operation getState()
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface object
-PASS ServiceWorkerGlobalScope interface object length
-PASS ServiceWorkerGlobalScope interface object name
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's "constructor" property
-PASS ServiceWorkerGlobalScope interface: existence and properties of interface prototype object's @@unscopables property
-PASS ServiceWorkerGlobalScope interface: attribute clients
-PASS ServiceWorkerGlobalScope interface: attribute registration
-FAIL ServiceWorkerGlobalScope interface: attribute serviceWorker assert_own_property: The global object must have a property "serviceWorker" expected property "serviceWorker" missing
-PASS ServiceWorkerGlobalScope interface: operation skipWaiting()
-PASS ServiceWorkerGlobalScope interface: attribute oninstall
-PASS ServiceWorkerGlobalScope interface: attribute onactivate
-PASS ServiceWorkerGlobalScope interface: attribute onfetch
-PASS ServiceWorkerGlobalScope interface: attribute onmessage
-FAIL ServiceWorkerGlobalScope interface: attribute onmessageerror assert_own_property: The global object must have a property "onmessageerror" expected property "onmessageerror" missing
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw
-PASS ServiceWorkerGlobalScope interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS ServiceWorkerGlobalScope must be primary interface of self
-PASS Stringification of self
-PASS ServiceWorkerGlobalScope interface: self must inherit property "clients" with the proper type
-PASS ServiceWorkerGlobalScope interface: self must inherit property "registration" with the proper type
-FAIL ServiceWorkerGlobalScope interface: self must inherit property "serviceWorker" with the proper type assert_own_property: expected property "serviceWorker" missing
-PASS ServiceWorkerGlobalScope interface: self must inherit property "skipWaiting()" with the proper type
-PASS ServiceWorkerGlobalScope interface: self must inherit property "oninstall" with the proper type
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onactivate" with the proper type
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onfetch" with the proper type
-PASS ServiceWorkerGlobalScope interface: self must inherit property "onmessage" with the proper type
-FAIL ServiceWorkerGlobalScope interface: self must inherit property "onmessageerror" with the proper type assert_own_property: expected property "onmessageerror" missing
-PASS Client interface: existence and properties of interface object
-PASS Client interface object length
-PASS Client interface object name
-PASS Client interface: existence and properties of interface prototype object
-PASS Client interface: existence and properties of interface prototype object's "constructor" property
-PASS Client interface: existence and properties of interface prototype object's @@unscopables property
-PASS Client interface: attribute url
-PASS Client interface: attribute frameType
-PASS Client interface: attribute id
-PASS Client interface: attribute type
-PASS Client interface: operation postMessage(any, [object Object])
-PASS Client interface: operation postMessage(any, PostMessageOptions)
-PASS WindowClient interface: existence and properties of interface object
-PASS WindowClient interface object length
-PASS WindowClient interface object name
-PASS WindowClient interface: existence and properties of interface prototype object
-PASS WindowClient interface: existence and properties of interface prototype object's "constructor" property
-PASS WindowClient interface: existence and properties of interface prototype object's @@unscopables property
-PASS WindowClient interface: attribute visibilityState
-PASS WindowClient interface: attribute focused
-FAIL WindowClient interface: attribute ancestorOrigins assert_true: The prototype object must have a property "ancestorOrigins" expected true got false
-PASS WindowClient interface: operation focus()
-PASS WindowClient interface: operation navigate(USVString)
-PASS Clients interface: existence and properties of interface object
-PASS Clients interface object length
-PASS Clients interface object name
-PASS Clients interface: existence and properties of interface prototype object
-PASS Clients interface: existence and properties of interface prototype object's "constructor" property
-PASS Clients interface: existence and properties of interface prototype object's @@unscopables property
-PASS Clients interface: operation get(DOMString)
-PASS Clients interface: operation matchAll(ClientQueryOptions)
-PASS Clients interface: operation openWindow(USVString)
-PASS Clients interface: operation claim()
-PASS Clients must be primary interface of self.clients
-PASS Stringification of self.clients
-PASS Clients interface: self.clients must inherit property "get(DOMString)" with the proper type
-PASS Clients interface: calling get(DOMString) on self.clients with too few arguments must throw TypeError
-PASS Clients interface: self.clients must inherit property "matchAll(ClientQueryOptions)" with the proper type
-PASS Clients interface: calling matchAll(ClientQueryOptions) on self.clients with too few arguments must throw TypeError
-PASS Clients interface: self.clients must inherit property "openWindow(USVString)" with the proper type
-PASS Clients interface: calling openWindow(USVString) on self.clients with too few arguments must throw TypeError
-PASS Clients interface: self.clients must inherit property "claim()" with the proper type
-PASS Cache interface: existence and properties of interface object
-PASS Cache interface object length
-PASS Cache interface object name
-PASS Cache interface: existence and properties of interface prototype object
-PASS Cache interface: existence and properties of interface prototype object's "constructor" property
-PASS Cache interface: existence and properties of interface prototype object's @@unscopables property
-PASS Cache interface: operation match(RequestInfo, CacheQueryOptions)
-PASS Cache interface: operation matchAll(RequestInfo, CacheQueryOptions)
-PASS Cache interface: operation add(RequestInfo)
-PASS Cache interface: operation addAll([object Object])
-PASS Cache interface: operation put(RequestInfo, Response)
-PASS Cache interface: operation delete(RequestInfo, CacheQueryOptions)
-PASS Cache interface: operation keys(RequestInfo, CacheQueryOptions)
-PASS Cache must be primary interface of self.cacheInstance
-PASS Stringification of self.cacheInstance
-PASS Cache interface: self.cacheInstance must inherit property "match(RequestInfo, CacheQueryOptions)" with the proper type
-PASS Cache interface: calling match(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "matchAll(RequestInfo, CacheQueryOptions)" with the proper type
-PASS Cache interface: calling matchAll(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "add(RequestInfo)" with the proper type
-PASS Cache interface: calling add(RequestInfo) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "addAll([object Object])" with the proper type
-PASS Cache interface: calling addAll([object Object]) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "put(RequestInfo, Response)" with the proper type
-PASS Cache interface: calling put(RequestInfo, Response) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "delete(RequestInfo, CacheQueryOptions)" with the proper type
-PASS Cache interface: calling delete(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError
-PASS Cache interface: self.cacheInstance must inherit property "keys(RequestInfo, CacheQueryOptions)" with the proper type
-PASS Cache interface: calling keys(RequestInfo, CacheQueryOptions) on self.cacheInstance with too few arguments must throw TypeError
-PASS CacheStorage interface: existence and properties of interface object
-PASS CacheStorage interface object length
-PASS CacheStorage interface object name
-PASS CacheStorage interface: existence and properties of interface prototype object
-PASS CacheStorage interface: existence and properties of interface prototype object's "constructor" property
-PASS CacheStorage interface: existence and properties of interface prototype object's @@unscopables property
-PASS CacheStorage interface: operation match(RequestInfo, MultiCacheQueryOptions)
-PASS CacheStorage interface: operation has(DOMString)
-PASS CacheStorage interface: operation open(DOMString)
-PASS CacheStorage interface: operation delete(DOMString)
-PASS CacheStorage interface: operation keys()
-PASS CacheStorage must be primary interface of self.caches
-PASS Stringification of self.caches
-PASS CacheStorage interface: self.caches must inherit property "match(RequestInfo, MultiCacheQueryOptions)" with the proper type
-PASS CacheStorage interface: calling match(RequestInfo, MultiCacheQueryOptions) on self.caches with too few arguments must throw TypeError
-PASS CacheStorage interface: self.caches must inherit property "has(DOMString)" with the proper type
-PASS CacheStorage interface: calling has(DOMString) on self.caches with too few arguments must throw TypeError
-PASS CacheStorage interface: self.caches must inherit property "open(DOMString)" with the proper type
-PASS CacheStorage interface: calling open(DOMString) on self.caches with too few arguments must throw TypeError
-PASS CacheStorage interface: self.caches must inherit property "delete(DOMString)" with the proper type
-PASS CacheStorage interface: calling delete(DOMString) on self.caches with too few arguments must throw TypeError
-PASS CacheStorage interface: self.caches must inherit property "keys()" with the proper type
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-window.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-window.https.html
index f70cf409..cc3bdaf11 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-window.https.html
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/interfaces-window.https.html
@@ -10,8 +10,8 @@
 'use strict';
 
 promise_test(async (t) => {
-  const srcs = ['dom', 'html', 'service-workers', 'dedicated-workers'];
-  const [dom, html, serviceWorkerIdl, dedicated] = await Promise.all(
+  const srcs = ['dom', 'html', 'service-workers'];
+  const [dom, html, serviceWorkerIdl] = await Promise.all(
     srcs.map(i => fetch(`/interfaces/${i}.idl`).then(r => r.text())));
 
   var idlArray = new IdlArray();
@@ -29,7 +29,6 @@
     'Cache',
     'CacheStorage',
   ]});
-  idlArray.add_dependency_idls(dedicated);
   idlArray.add_dependency_idls(dom);
   idlArray.add_dependency_idls(html);
   idlArray.add_objects({
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/update.https-expected.txt b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/update.https-expected.txt
index 8f751d02..3fcab32 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/update.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/update.https-expected.txt
@@ -5,5 +5,6 @@
 PASS update() should fail when a new script contains a syntax error.
 PASS update() should resolve when the install event throws.
 PASS update() should fail when the pending uninstall flag is set.
+PASS update() should succeed when the script shrinks.
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
index fe794a5..1f01341 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
@@ -408,10 +408,10 @@
         return m.group(1)
 
 
-class Fennec(Browser):
-    """Fennec-specific interface."""
+class FirefoxAndroid(Browser):
+    """Android-specific Firefox interface."""
 
-    product = "fennec"
+    product = "firefox_android"
     requirements = "requirements_firefox.txt"
 
     def install(self, dest=None, channel=None):
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/run.py b/third_party/blink/web_tests/external/wpt/tools/wpt/run.py
index 4693bb7f..6acc5b8e 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wpt/run.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wpt/run.py
@@ -251,9 +251,9 @@
         kwargs["extra_prefs"].append("media.navigator.streams.fake=true")
 
 
-class Fennec(BrowserSetup):
-    name = "fennec"
-    browser_cls = browser.Fennec
+class FirefoxAndroid(BrowserSetup):
+    name = "firefox_android"
+    browser_cls = browser.FirefoxAndroid
 
     def setup_kwargs(self, kwargs):
         pass
@@ -510,8 +510,8 @@
 
 
 product_setup = {
-    "fennec": Fennec,
     "firefox": Firefox,
+    "firefox_android": FirefoxAndroid,
     "chrome": Chrome,
     "chrome_android": ChromeAndroid,
     "chrome_ios": ChromeiOS,
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/__init__.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/__init__.py
index 8698e81..18434e4 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -28,8 +28,8 @@
                 "edgechromium",
                 "edge",
                 "edge_webdriver",
-                "fennec",
                 "firefox",
+                "firefox_android",
                 "ie",
                 "safari",
                 "sauce",
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/fennec.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
similarity index 94%
rename from third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/fennec.py
rename to third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
index b1f535a..d8d5c7f 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/fennec.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -20,9 +20,9 @@
                       FirefoxBrowser)  # noqa: F401
 
 
-__wptrunner__ = {"product": "fennec",
+__wptrunner__ = {"product": "firefox_android",
                  "check_args": "check_args",
-                 "browser": "FennecBrowser",
+                 "browser": "FirefoxAndroidBrowser",
                  "executor": {"testharness": "MarionetteTestharnessExecutor",
                               "reftest": "MarionetteRefTestExecutor"},
                  "browser_kwargs": "browser_kwargs",
@@ -100,31 +100,19 @@
         os.remove(hosts_path)
 
 
-class FennecBrowser(FirefoxBrowser):
+class FirefoxAndroidBrowser(FirefoxBrowser):
     init_timeout = 300
     shutdown_timeout = 60
 
-    def __init__(self, logger, prefs_root, test_type, package_name=None,
+    def __init__(self, logger, prefs_root, test_type, package_name="org.mozilla.geckoview.test",
                  device_serial="emulator-5444", **kwargs):
         FirefoxBrowser.__init__(self, logger, None, prefs_root, test_type, **kwargs)
-        self._package_name = package_name
+        self.package_name = package_name
         self.device_serial = device_serial
         self.tests_root = kwargs["tests_root"]
         self.install_fonts = kwargs["install_fonts"]
         self.stackwalk_binary = kwargs["stackwalk_binary"]
 
-    @property
-    def package_name(self):
-        """
-        Name of app to run on emulator.
-        """
-        if self._package_name is None:
-            self._package_name = "org.mozilla.fennec"
-            user = os.getenv("USER")
-            if user:
-                self._package_name += "_" + user
-        return self._package_name
-
     def start(self, **kwargs):
         if self.marionette_port is None:
             self.marionette_port = get_free_port()
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-button-gesture-target.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-button-gesture-target.html
index 35674a9..c8c1137 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-button-gesture-target.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-button-gesture-target.html
@@ -44,7 +44,9 @@
   let pointerPauseThenUp = new Promise((resolve, reject) => {
       chrome.gpuBenchmarking.pointerActionSequence([{
           source: 'mouse',
-          actions: [{ 'name': 'pause', duration: 100 },
+          // The autoscroll time begins 250ms after the mouse down so we add a
+          // bit of buffer.
+          actions: [{ 'name': 'pause', duration: 300 },
                     { 'name': 'pointerUp' }]
       }], resolve);
   });
diff --git a/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver-enabled.html b/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver-enabled.html
index 2687783..d5b7ce0b 100644
--- a/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver-enabled.html
+++ b/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver-enabled.html
@@ -33,29 +33,9 @@
       });
 }, 'fetch() from document with Data-Saver enabled.');
 
-window.top.promise_test(t => {
-  internals.setSaveDataEnabled(true);
-  var worker =
-    new Worker('./resources/data-saver-worker.php?dedicated-enabled');
-  return new Promise(resolve =>
-                     worker.addEventListener('message', resolve))
-     .then(msg => {
-         var result = msg.data;
-         assert_equals(
-             result['worker_script_header'], 'Save-Data: on',
-             'Save-Data header should be sent for worker script when enabled.');
-         for (var i = 0; i < METHODS.length; ++i) {
-           assert_equals(
-               result[METHODS[i]], 'Save-Data: on',
-               'Save-Data header should be sent when enabled. method: ' +
-               METHODS[i]);
-         }
-       });
-}, 'fetch() from dedicated worker with Data-Saver enabled.');
-
-// A test for shared workers is implemented as a browser test because shared
-// worker script is requested from the browser process when NetworkService is
-// enabled, and internals.setSaveDataEnable() doesn't work in that case.
+// Tests for dedicated workers and shared workers are implemented as browser
+// tests because they are requested from the browser process, and
+// internals.setSaveDataEnable() doesn't work in those cases.
 
 </script>
 "></iframe>
diff --git a/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver.html b/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver.html
index 560b6f2..ff05e0e 100644
--- a/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver.html
+++ b/third_party/blink/web_tests/http/tests/fetch/chromium/data-saver.html
@@ -32,31 +32,9 @@
       });
 }, 'fetch() from document with Data-Saver disabled.');
 
-
-window.top.promise_test(t => {
-  internals.setSaveDataEnabled(false);
-  var worker =
-      new Worker('./resources/data-saver-worker.php?dedicated-disabled');
-  return new Promise(resolve =>
-                     worker.addEventListener('message', resolve))
-     .then(msg => {
-         var result = msg.data;
-         assert_equals(
-             result['worker_script_header'], 'No Save-Data',
-             'Save-Data header should not be sent for worker script when ' +
-             'disabled.');
-         for (var i = 0; i < METHODS.length; ++i) {
-           assert_equals(
-               result[METHODS[i]], 'No Save-Data',
-               'Save-Data header should not be sent when disabled. method: ' +
-               METHODS[i]);
-         }
-       });
-}, 'fetch() from dedicated worker with Data-Saver disabled.');
-
-// A test for shared workers is implemented as a browser test because shared
-// worker script is requested from the browser process when NetworkService is
-// enabled, and internals.setSaveDataEnable() doesn't work in that case.
+// Tests for dedicated workers and shared workers are implemented as browser
+// tests because they are requested from the browser process, and
+// internals.setSaveDataEnable() doesn't work in those cases.
 
 </script>
 "></iframe>
diff --git a/third_party/blink/web_tests/http/tests/fetch/chromium/resources/data-saver-worker.php b/third_party/blink/web_tests/http/tests/fetch/chromium/resources/data-saver-worker.php
deleted file mode 100644
index 3a8c9d21..0000000
--- a/third_party/blink/web_tests/http/tests/fetch/chromium/resources/data-saver-worker.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-header('Content-Type: text/javascript');
-echo 'var result = {};' . "\n";
-echo 'result["worker_script_header"] = ';
-if (isset($_SERVER['HTTP_SAVE_DATA'])) {
-    echo '"Save-Data: ' . $_SERVER['HTTP_SAVE_DATA'] . '";' . "\n";
-} else {
-    echo '"No Save-Data";' . "\n";
-}
-?>
-
-var CHECK_PATH = './check-save-data-header.php';
-var METHODS = ['GET', 'POST', 'PUT'];
-var REQUESTS =
-    METHODS.map(method => new Request(CHECK_PATH, {method: method}));
-
-if (!self.postMessage) {
-  // For Shared Worker
-  var postMessagePromise =
-      new Promise(resolve => { self.postMessage = resolve; });
-  self.addEventListener('connect', event => {
-    postMessagePromise.then(data => event.ports[0].postMessage(data));
-  });
-}
-
-Promise.all(REQUESTS.map(request => fetch(request)))
-  .then(responses => Promise.all(responses.map(response => response.text())))
-  .then(texts => {
-      for (var i = 0; i < METHODS.length; ++i) {
-        result[METHODS[i]] = texts[i];
-      }
-      self.postMessage(result);
-    });
diff --git a/third_party/blink/web_tests/http/tests/websocket/send-receive-arraybuffer-1MB.html b/third_party/blink/web_tests/http/tests/websocket/send-receive-arraybuffer-1MB.html
new file mode 100644
index 0000000..75734e4
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/websocket/send-receive-arraybuffer-1MB.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+function randomValuesArrayBuffer(length)
+{
+  const array = new Uint8Array(length);
+  // crypto.getRandomValues has a quota. See
+  // https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues.
+  const cryptoQuota = 65535;
+  let index = 0;
+  const buffer = array.buffer;
+  while(index < buffer.byteLength) {
+    const bufferView = array.subarray(index, index + cryptoQuota);
+    window.crypto.getRandomValues(bufferView);
+    index += cryptoQuota;
+  }
+  return buffer;
+}
+
+function runTest(buffer, description) {
+  async_test((test) => {
+    const ws = new WebSocket("ws://127.0.0.1:8880/echo");
+    ws.binaryType = "arraybuffer";
+    let messageSHA256 = undefined;
+    let bufferSHA256 = window.crypto.subtle.digest("SHA-256", buffer);
+    ws.onopen = test.step_func(() => {
+      ws.send(buffer);
+    });
+    ws.onmessage = test.step_func((event) => {
+      if (event.data === "Goodbye")
+        return;
+      assert_equals(messageSHA256, undefined);
+      messageSHA256 = window.crypto.subtle.digest("SHA-256", event.data);
+      // Sending "Goodbye" lets the server close the connection.
+      ws.send("Goodbye");
+    });
+    ws.onclose = test.step_func((e) => {
+      assert_true(e.wasClean);
+      // Checking bytes in JS is slow with MSAN, so we compare the arrays on
+      // SHA dijest array.
+      Promise.all([messageSHA256, bufferSHA256]).then(
+        test.step_func_done(([messageDigest, bufferDigest]) => {
+          assert_array_equals(new Uint8Array(messageDigest),
+          new Uint8Array(bufferDigest), "Array dijest should be same.");
+        }),
+        test.unreached_func("digest should work")
+      );
+    });
+  }, description);
+}
+
+runTest(new ArrayBuffer(0), "empty array buffer");
+runTest(new TextEncoder().encode('Hello, world!'), "text array buffer");
+runTest(randomValuesArrayBuffer(256), "random 256 values");
+runTest(randomValuesArrayBuffer(2560), "random 2560 values");
+runTest(randomValuesArrayBuffer(25600), "random 25600 values");
+runTest(randomValuesArrayBuffer(256000), "random 256000 values");
+runTest(randomValuesArrayBuffer(1000000), "random 1000000 values");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/linux/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/linux/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/linux/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/linux/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-mac10.10/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-mac10.11/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac-retina/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/mac-retina/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac-retina/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/mac-retina/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/mac/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/mac/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/mac/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/mac/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/win/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/win/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/win/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/win/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/win/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
new file mode 100644
index 0000000..ee73f7ad
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 2024  ONE DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2025  TWO DOT LEADER may appear at line start if de and loose assert_true: expected true got false
+FAIL 2026  HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL 22EF  MIDLINE HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+FAIL FE19  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS may appear at line start if de and loose assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
new file mode 100644
index 0000000..5d9d42c5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-pr-strict-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL 00B1  PLUS-MINUS SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 20AC  EURO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL 2116  NUMERO SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FE69  SMALL DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FF04  FULLWIDTH DOLLAR SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE1  FULLWIDTH POUND SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE5  FULLWIDTH YEN SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+FAIL FFE6  FULLWIDTH WON SIGN may NOT appear at line start if zh and strict assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win7/external/wpt/css/cssom/interfaces-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/css/cssom/interfaces-expected.txt
deleted file mode 100644
index 7a79be6d..0000000
--- a/third_party/blink/web_tests/platform/win7/external/wpt/css/cssom/interfaces-expected.txt
+++ /dev/null
@@ -1,392 +0,0 @@
-This is a testharness.js-based test.
-Found 386 tests; 331 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS idl_test setup
-PASS Partial interface CSSStyleSheet: original interface defined
-PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined
-PASS Partial interface Window: original interface defined
-PASS MediaList interface: existence and properties of interface object
-PASS MediaList interface object length
-PASS MediaList interface object name
-PASS MediaList interface: existence and properties of interface prototype object
-PASS MediaList interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaList interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaList interface: attribute mediaText
-PASS MediaList interface: stringifier
-PASS MediaList interface: attribute length
-PASS MediaList interface: operation item(unsigned long)
-PASS MediaList interface: operation appendMedium(CSSOMString)
-PASS MediaList interface: operation deleteMedium(CSSOMString)
-PASS MediaList must be primary interface of sheet.media
-PASS Stringification of sheet.media
-PASS MediaList interface: sheet.media must inherit property "mediaText" with the proper type
-PASS MediaList interface: sheet.media must inherit property "length" with the proper type
-PASS MediaList interface: sheet.media must inherit property "item(unsigned long)" with the proper type
-PASS MediaList interface: calling item(unsigned long) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling appendMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS MediaList interface: sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type
-PASS MediaList interface: calling deleteMedium(CSSOMString) on sheet.media with too few arguments must throw TypeError
-PASS StyleSheet interface: existence and properties of interface object
-PASS StyleSheet interface object length
-PASS StyleSheet interface object name
-PASS StyleSheet interface: existence and properties of interface prototype object
-PASS StyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheet interface: attribute type
-PASS StyleSheet interface: attribute href
-PASS StyleSheet interface: attribute ownerNode
-PASS StyleSheet interface: attribute parentStyleSheet
-PASS StyleSheet interface: attribute title
-PASS StyleSheet interface: attribute media
-PASS StyleSheet interface: attribute disabled
-FAIL CSSStyleSheet interface: existence and properties of interface object assert_throws: interface object didn't throw TypeError when called as a constructor function "function() {
-                new interface_object();
-            }" did not throw
-PASS CSSStyleSheet interface object length
-PASS CSSStyleSheet interface object name
-PASS CSSStyleSheet interface: existence and properties of interface prototype object
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleSheet interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleSheet interface: attribute ownerRule
-PASS CSSStyleSheet interface: attribute cssRules
-PASS CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)
-PASS CSSStyleSheet interface: operation deleteRule(unsigned long)
-PASS CSSStyleSheet interface: attribute rules
-PASS CSSStyleSheet interface: operation addRule(DOMString, DOMString, unsigned long)
-PASS CSSStyleSheet interface: operation removeRule(unsigned long)
-PASS CSSStyleSheet must be primary interface of sheet
-PASS Stringification of sheet
-PASS CSSStyleSheet interface: sheet must inherit property "ownerRule" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "cssRules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling insertRule(CSSOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "deleteRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling deleteRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "rules" with the proper type
-PASS CSSStyleSheet interface: sheet must inherit property "addRule(DOMString, DOMString, unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling addRule(DOMString, DOMString, unsigned long) on sheet with too few arguments must throw TypeError
-PASS CSSStyleSheet interface: sheet must inherit property "removeRule(unsigned long)" with the proper type
-PASS CSSStyleSheet interface: calling removeRule(unsigned long) on sheet with too few arguments must throw TypeError
-PASS StyleSheet interface: sheet must inherit property "type" with the proper type
-PASS StyleSheet interface: sheet must inherit property "href" with the proper type
-PASS StyleSheet interface: sheet must inherit property "ownerNode" with the proper type
-PASS StyleSheet interface: sheet must inherit property "parentStyleSheet" with the proper type
-PASS StyleSheet interface: sheet must inherit property "title" with the proper type
-PASS StyleSheet interface: sheet must inherit property "media" with the proper type
-PASS StyleSheet interface: sheet must inherit property "disabled" with the proper type
-PASS StyleSheetList interface: existence and properties of interface object
-PASS StyleSheetList interface object length
-PASS StyleSheetList interface object name
-PASS StyleSheetList interface: existence and properties of interface prototype object
-PASS StyleSheetList interface: existence and properties of interface prototype object's "constructor" property
-PASS StyleSheetList interface: existence and properties of interface prototype object's @@unscopables property
-PASS StyleSheetList interface: operation item(unsigned long)
-PASS StyleSheetList interface: attribute length
-PASS StyleSheetList must be primary interface of document.styleSheets
-PASS Stringification of document.styleSheets
-PASS StyleSheetList interface: document.styleSheets must inherit property "item(unsigned long)" with the proper type
-PASS StyleSheetList interface: calling item(unsigned long) on document.styleSheets with too few arguments must throw TypeError
-PASS StyleSheetList interface: document.styleSheets must inherit property "length" with the proper type
-PASS CSSRuleList interface: existence and properties of interface object
-PASS CSSRuleList interface object length
-PASS CSSRuleList interface object name
-PASS CSSRuleList interface: existence and properties of interface prototype object
-PASS CSSRuleList interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRuleList interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRuleList interface: operation item(unsigned long)
-PASS CSSRuleList interface: attribute length
-PASS CSSRuleList must be primary interface of sheet.cssRules
-PASS Stringification of sheet.cssRules
-PASS CSSRuleList interface: sheet.cssRules must inherit property "item(unsigned long)" with the proper type
-PASS CSSRuleList interface: calling item(unsigned long) on sheet.cssRules with too few arguments must throw TypeError
-PASS CSSRuleList interface: sheet.cssRules must inherit property "length" with the proper type
-PASS CSSRule interface: existence and properties of interface object
-PASS CSSRule interface object length
-PASS CSSRule interface object name
-PASS CSSRule interface: existence and properties of interface prototype object
-PASS CSSRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSRule interface: constant STYLE_RULE on interface object
-PASS CSSRule interface: constant STYLE_RULE on interface prototype object
-PASS CSSRule interface: constant CHARSET_RULE on interface object
-PASS CSSRule interface: constant CHARSET_RULE on interface prototype object
-PASS CSSRule interface: constant IMPORT_RULE on interface object
-PASS CSSRule interface: constant IMPORT_RULE on interface prototype object
-PASS CSSRule interface: constant MEDIA_RULE on interface object
-PASS CSSRule interface: constant MEDIA_RULE on interface prototype object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface object
-PASS CSSRule interface: constant FONT_FACE_RULE on interface prototype object
-PASS CSSRule interface: constant PAGE_RULE on interface object
-PASS CSSRule interface: constant PAGE_RULE on interface prototype object
-FAIL CSSRule interface: constant MARGIN_RULE on interface object assert_own_property: expected property "MARGIN_RULE" missing
-FAIL CSSRule interface: constant MARGIN_RULE on interface prototype object assert_own_property: expected property "MARGIN_RULE" missing
-PASS CSSRule interface: constant NAMESPACE_RULE on interface object
-PASS CSSRule interface: constant NAMESPACE_RULE on interface prototype object
-PASS CSSRule interface: attribute type
-PASS CSSRule interface: attribute cssText
-PASS CSSRule interface: attribute parentRule
-PASS CSSRule interface: attribute parentStyleSheet
-PASS CSSStyleRule interface: existence and properties of interface object
-PASS CSSStyleRule interface object length
-PASS CSSStyleRule interface object name
-PASS CSSStyleRule interface: existence and properties of interface prototype object
-PASS CSSStyleRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleRule interface: attribute selectorText
-PASS CSSStyleRule interface: attribute style
-PASS CSSStyleRule must be primary interface of sheet.cssRules[4]
-PASS Stringification of sheet.cssRules[4]
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "selectorText" with the proper type
-PASS CSSStyleRule interface: sheet.cssRules[4] must inherit property "style" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[4] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[4] must inherit property "parentStyleSheet" with the proper type
-PASS CSSImportRule interface: existence and properties of interface object
-PASS CSSImportRule interface object length
-PASS CSSImportRule interface object name
-PASS CSSImportRule interface: existence and properties of interface prototype object
-PASS CSSImportRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSImportRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSImportRule interface: attribute href
-PASS CSSImportRule interface: attribute media
-PASS CSSImportRule interface: attribute styleSheet
-PASS CSSImportRule must be primary interface of sheet.cssRules[0]
-PASS Stringification of sheet.cssRules[0]
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "href" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "media" with the proper type
-PASS CSSImportRule interface: sheet.cssRules[0] must inherit property "styleSheet" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[0] must inherit property "parentStyleSheet" with the proper type
-PASS CSSGroupingRule interface: existence and properties of interface object
-PASS CSSGroupingRule interface object length
-PASS CSSGroupingRule interface object name
-PASS CSSGroupingRule interface: existence and properties of interface prototype object
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSGroupingRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSGroupingRule interface: attribute cssRules
-FAIL CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long) assert_equals: property has wrong .length expected 1 but got 2
-PASS CSSGroupingRule interface: operation deleteRule(unsigned long)
-FAIL CSSPageRule interface: existence and properties of interface object assert_equals: prototype of CSSPageRule is not CSSGroupingRule expected function "function CSSGroupingRule() { [native code] }" but got function "function CSSRule() { [native code] }"
-PASS CSSPageRule interface object length
-PASS CSSPageRule interface object name
-FAIL CSSPageRule interface: existence and properties of interface prototype object assert_equals: prototype of CSSPageRule.prototype is not CSSGroupingRule.prototype expected object "[object CSSGroupingRule]" but got object "[object CSSRule]"
-PASS CSSPageRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSPageRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSPageRule interface: attribute selectorText
-PASS CSSPageRule interface: attribute style
-PASS CSSPageRule must be primary interface of sheet.cssRules[2]
-PASS Stringification of sheet.cssRules[2]
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "selectorText" with the proper type
-PASS CSSPageRule interface: sheet.cssRules[2] must inherit property "style" with the proper type
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "cssRules" with the proper type assert_inherits: property "cssRules" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "insertRule(CSSOMString, unsigned long)" with the proper type assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling insertRule(CSSOMString, unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "insertRule" not found in prototype chain
-FAIL CSSGroupingRule interface: sheet.cssRules[2] must inherit property "deleteRule(unsigned long)" with the proper type assert_inherits: property "deleteRule" not found in prototype chain
-FAIL CSSGroupingRule interface: calling deleteRule(unsigned long) on sheet.cssRules[2] with too few arguments must throw TypeError assert_inherits: property "deleteRule" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[2] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[2] must inherit property "parentStyleSheet" with the proper type
-FAIL CSSMarginRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object length assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface object name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute name assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule interface: attribute style assert_own_property: self does not have own property "CSSMarginRule" expected property "CSSMarginRule" missing
-FAIL CSSMarginRule must be primary interface of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0] assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "name" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSMarginRule interface: sheet.cssRules[2].cssRules[0] must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "STYLE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "CHARSET_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "IMPORT_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MEDIA_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "FONT_FACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "PAGE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "MARGIN_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "NAMESPACE_RULE" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSRule interface: sheet.cssRules[2].cssRules[0] must inherit property "parentStyleSheet" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSNamespaceRule interface: existence and properties of interface object
-PASS CSSNamespaceRule interface object length
-PASS CSSNamespaceRule interface object name
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSNamespaceRule interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSNamespaceRule interface: attribute namespaceURI
-PASS CSSNamespaceRule interface: attribute prefix
-PASS CSSNamespaceRule must be primary interface of sheet.cssRules[1]
-PASS Stringification of sheet.cssRules[1]
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "namespaceURI" with the proper type
-PASS CSSNamespaceRule interface: sheet.cssRules[1] must inherit property "prefix" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "STYLE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "CHARSET_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "IMPORT_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "MEDIA_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "FONT_FACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "PAGE_RULE" with the proper type
-FAIL CSSRule interface: sheet.cssRules[1] must inherit property "MARGIN_RULE" with the proper type assert_inherits: property "MARGIN_RULE" not found in prototype chain
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "NAMESPACE_RULE" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "type" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "cssText" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentRule" with the proper type
-PASS CSSRule interface: sheet.cssRules[1] must inherit property "parentStyleSheet" with the proper type
-PASS CSSStyleDeclaration interface: existence and properties of interface object
-PASS CSSStyleDeclaration interface object length
-PASS CSSStyleDeclaration interface object name
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's "constructor" property
-PASS CSSStyleDeclaration interface: existence and properties of interface prototype object's @@unscopables property
-PASS CSSStyleDeclaration interface: attribute cssText
-PASS CSSStyleDeclaration interface: attribute length
-PASS CSSStyleDeclaration interface: operation item(unsigned long)
-PASS CSSStyleDeclaration interface: operation getPropertyValue(CSSOMString)
-PASS CSSStyleDeclaration interface: operation getPropertyPriority(CSSOMString)
-PASS CSSStyleDeclaration interface: operation setProperty(CSSOMString, CSSOMString, CSSOMString)
-PASS CSSStyleDeclaration interface: operation removeProperty(CSSOMString)
-PASS CSSStyleDeclaration interface: attribute parentRule
-PASS CSSStyleDeclaration interface: attribute cssFloat
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[4].style
-PASS Stringification of sheet.cssRules[4].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[4].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[4].style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of sheet.cssRules[2].style
-PASS Stringification of sheet.cssRules[2].style
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: sheet.cssRules[2].style must inherit property "cssFloat" with the proper type
-FAIL CSSStyleDeclaration must be primary interface of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL Stringification of sheet.cssRules[2].cssRules[0].style assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssText" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling item(unsigned long) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyValue(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "removeProperty(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on sheet.cssRules[2].cssRules[0].style with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "parentRule" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-FAIL CSSStyleDeclaration interface: sheet.cssRules[2].cssRules[0].style must inherit property "cssFloat" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "TypeError: Cannot read property '0' of undefined"
-PASS CSSStyleDeclaration must be primary interface of style_element.style
-PASS Stringification of style_element.style
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: style_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of svg_element.style
-PASS Stringification of svg_element.style
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type
-PASS CSSStyleDeclaration must be primary interface of getComputedStyle(svg_element)
-PASS Stringification of getComputedStyle(svg_element)
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssText" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "length" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "item(unsigned long)" with the proper type
-PASS CSSStyleDeclaration interface: calling item(unsigned long) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyValue(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "getPropertyPriority(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "removeProperty(CSSOMString)" with the proper type
-PASS CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on getComputedStyle(svg_element) with too few arguments must throw TypeError
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type
-PASS CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "cssFloat" with the proper type
-PASS CSS namespace: operation escape(CSSOMString)
-PASS SVGElement interface: attribute style
-PASS SVGElement interface: svg_element must inherit property "style" with the proper type
-PASS HTMLElement interface: attribute style
-PASS HTMLElement interface: style_element must inherit property "style" with the proper type
-PASS HTMLElement interface: document.createElement("unknownelement") must inherit property "style" with the proper type
-PASS Window interface: operation getComputedStyle(Element, CSSOMString)
-PASS Window interface: window must inherit property "getComputedStyle(Element, CSSOMString)" with the proper type
-PASS Window interface: calling getComputedStyle(Element, CSSOMString) on window with too few arguments must throw TypeError
-PASS Document interface: attribute styleSheets
-PASS Document interface: document must inherit property "styleSheets" with the proper type
-PASS Document interface: new Document() must inherit property "styleSheets" with the proper type
-PASS ShadowRoot interface: attribute styleSheets
-PASS ProcessingInstruction interface: attribute sheet
-PASS ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type
-Harness: the test ran to completion.
-
diff --git "a/third_party/blink/web_tests/platform/win7/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/platform/win7/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
new file mode 100644
index 0000000..c00f802
--- /dev/null
+++ "b/third_party/blink/web_tests/platform/win7/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -0,0 +1,1266 @@
+This is a testharness.js-based test.
+Found 1262 tests; 1214 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS Partial interface Document: original interface defined
+PASS Partial interface mixin NavigatorID: original interface mixin defined
+PASS Partial interface HTMLAnchorElement: original interface defined
+PASS Partial interface HTMLAreaElement: original interface defined
+PASS Partial interface HTMLBodyElement: original interface defined
+PASS Partial interface HTMLBRElement: original interface defined
+PASS Partial interface HTMLTableCaptionElement: original interface defined
+PASS Partial interface HTMLTableColElement: original interface defined
+PASS Partial interface HTMLDivElement: original interface defined
+PASS Partial interface HTMLDListElement: original interface defined
+PASS Partial interface HTMLEmbedElement: original interface defined
+PASS Partial interface HTMLHeadingElement: original interface defined
+PASS Partial interface HTMLHRElement: original interface defined
+PASS Partial interface HTMLHtmlElement: original interface defined
+PASS Partial interface HTMLIFrameElement: original interface defined
+PASS Partial interface HTMLImageElement: original interface defined
+PASS Partial interface HTMLInputElement: original interface defined
+PASS Partial interface HTMLLegendElement: original interface defined
+PASS Partial interface HTMLLIElement: original interface defined
+PASS Partial interface HTMLLinkElement: original interface defined
+PASS Partial interface HTMLMenuElement: original interface defined
+PASS Partial interface HTMLMetaElement: original interface defined
+PASS Partial interface HTMLObjectElement: original interface defined
+PASS Partial interface HTMLOListElement: original interface defined
+PASS Partial interface HTMLParagraphElement: original interface defined
+PASS Partial interface HTMLParamElement: original interface defined
+PASS Partial interface HTMLPreElement: original interface defined
+PASS Partial interface HTMLStyleElement: original interface defined
+PASS Partial interface HTMLScriptElement: original interface defined
+PASS Partial interface HTMLTableElement: original interface defined
+PASS Partial interface HTMLTableSectionElement: original interface defined
+PASS Partial interface HTMLTableCellElement: original interface defined
+PASS Partial interface HTMLTableRowElement: original interface defined
+PASS Partial interface HTMLUListElement: original interface defined
+PASS Partial interface Document[2]: original interface defined
+PASS Partial interface Window: original interface defined
+PASS RadioNodeList interface: existence and properties of interface object
+PASS RadioNodeList interface object length
+PASS RadioNodeList interface object name
+PASS RadioNodeList interface: existence and properties of interface prototype object
+PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
+PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
+PASS RadioNodeList interface: attribute value
+PASS DOMStringList interface: existence and properties of interface object
+PASS DOMStringList interface object length
+PASS DOMStringList interface object name
+PASS DOMStringList interface: existence and properties of interface prototype object
+PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringList interface: attribute length
+PASS DOMStringList interface: operation item(unsigned long)
+PASS DOMStringList interface: operation contains(DOMString)
+PASS DOMStringMap interface: existence and properties of interface object
+PASS DOMStringMap interface object length
+PASS DOMStringMap interface object name
+PASS DOMStringMap interface: existence and properties of interface prototype object
+PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
+PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS DOMStringMap must be primary interface of document.head.dataset
+PASS Stringification of document.head.dataset
+PASS MediaError interface: existence and properties of interface object
+PASS MediaError interface object length
+PASS MediaError interface object name
+PASS MediaError interface: existence and properties of interface prototype object
+PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
+PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
+PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
+PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
+PASS MediaError interface: attribute code
+PASS MediaError interface: attribute message
+PASS MediaError must be primary interface of errorVideo.error
+PASS Stringification of errorVideo.error
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
+PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
+PASS AudioTrackList interface: existence and properties of interface object
+PASS AudioTrackList interface object length
+PASS AudioTrackList interface object name
+PASS AudioTrackList interface: existence and properties of interface prototype object
+PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrackList interface: attribute length
+PASS AudioTrackList interface: operation getTrackById(DOMString)
+PASS AudioTrackList interface: attribute onchange
+PASS AudioTrackList interface: attribute onaddtrack
+PASS AudioTrackList interface: attribute onremovetrack
+PASS AudioTrack interface: existence and properties of interface object
+PASS AudioTrack interface object length
+PASS AudioTrack interface object name
+PASS AudioTrack interface: existence and properties of interface prototype object
+PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioTrack interface: attribute id
+PASS AudioTrack interface: attribute kind
+PASS AudioTrack interface: attribute label
+PASS AudioTrack interface: attribute language
+PASS AudioTrack interface: attribute enabled
+PASS VideoTrackList interface: existence and properties of interface object
+PASS VideoTrackList interface object length
+PASS VideoTrackList interface object name
+PASS VideoTrackList interface: existence and properties of interface prototype object
+PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrackList interface: attribute length
+PASS VideoTrackList interface: operation getTrackById(DOMString)
+PASS VideoTrackList interface: attribute selectedIndex
+PASS VideoTrackList interface: attribute onchange
+PASS VideoTrackList interface: attribute onaddtrack
+PASS VideoTrackList interface: attribute onremovetrack
+PASS VideoTrack interface: existence and properties of interface object
+PASS VideoTrack interface object length
+PASS VideoTrack interface object name
+PASS VideoTrack interface: existence and properties of interface prototype object
+PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS VideoTrack interface: attribute id
+PASS VideoTrack interface: attribute kind
+PASS VideoTrack interface: attribute label
+PASS VideoTrack interface: attribute language
+PASS VideoTrack interface: attribute selected
+PASS TextTrackList interface: existence and properties of interface object
+PASS TextTrackList interface object length
+PASS TextTrackList interface object name
+PASS TextTrackList interface: existence and properties of interface prototype object
+PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackList interface: attribute length
+PASS TextTrackList interface: operation getTrackById(DOMString)
+PASS TextTrackList interface: attribute onchange
+PASS TextTrackList interface: attribute onaddtrack
+PASS TextTrackList interface: attribute onremovetrack
+PASS TextTrackList must be primary interface of document.createElement("video").textTracks
+PASS Stringification of document.createElement("video").textTracks
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
+PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
+PASS TextTrack interface: existence and properties of interface object
+PASS TextTrack interface object length
+PASS TextTrack interface object name
+PASS TextTrack interface: existence and properties of interface prototype object
+PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrack interface: attribute kind
+PASS TextTrack interface: attribute label
+PASS TextTrack interface: attribute language
+PASS TextTrack interface: attribute id
+FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
+PASS TextTrack interface: attribute mode
+PASS TextTrack interface: attribute cues
+PASS TextTrack interface: attribute activeCues
+PASS TextTrack interface: operation addCue(TextTrackCue)
+PASS TextTrack interface: operation removeCue(TextTrackCue)
+PASS TextTrack interface: attribute oncuechange
+PASS TextTrack must be primary interface of document.createElement("track").track
+PASS Stringification of document.createElement("track").track
+PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
+FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
+PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
+PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
+PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
+PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
+PASS TextTrackCueList interface: existence and properties of interface object
+PASS TextTrackCueList interface object length
+PASS TextTrackCueList interface object name
+PASS TextTrackCueList interface: existence and properties of interface prototype object
+PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCueList interface: attribute length
+PASS TextTrackCueList interface: operation getCueById(DOMString)
+PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
+PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
+PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
+PASS TextTrackCue interface: existence and properties of interface object
+PASS TextTrackCue interface object length
+PASS TextTrackCue interface object name
+PASS TextTrackCue interface: existence and properties of interface prototype object
+PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
+PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextTrackCue interface: attribute track
+PASS TextTrackCue interface: attribute id
+PASS TextTrackCue interface: attribute startTime
+PASS TextTrackCue interface: attribute endTime
+PASS TextTrackCue interface: attribute pauseOnExit
+PASS TextTrackCue interface: attribute onenter
+PASS TextTrackCue interface: attribute onexit
+PASS TimeRanges interface: existence and properties of interface object
+PASS TimeRanges interface object length
+PASS TimeRanges interface object name
+PASS TimeRanges interface: existence and properties of interface prototype object
+PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
+PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
+PASS TimeRanges interface: attribute length
+PASS TimeRanges interface: operation start(unsigned long)
+PASS TimeRanges interface: operation end(unsigned long)
+PASS TimeRanges must be primary interface of document.createElement("video").buffered
+PASS Stringification of document.createElement("video").buffered
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
+PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
+PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
+PASS TrackEvent interface: existence and properties of interface object
+PASS TrackEvent interface object length
+PASS TrackEvent interface object name
+PASS TrackEvent interface: existence and properties of interface prototype object
+PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TrackEvent interface: attribute track
+PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
+PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
+PASS ValidityState interface: existence and properties of interface object
+PASS ValidityState interface object length
+PASS ValidityState interface object name
+PASS ValidityState interface: existence and properties of interface prototype object
+PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
+PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
+PASS ValidityState interface: attribute valueMissing
+PASS ValidityState interface: attribute typeMismatch
+PASS ValidityState interface: attribute patternMismatch
+PASS ValidityState interface: attribute tooLong
+PASS ValidityState interface: attribute tooShort
+PASS ValidityState interface: attribute rangeUnderflow
+PASS ValidityState interface: attribute rangeOverflow
+PASS ValidityState interface: attribute stepMismatch
+PASS ValidityState interface: attribute badInput
+PASS ValidityState interface: attribute customError
+PASS ValidityState interface: attribute valid
+PASS ValidityState must be primary interface of document.createElement("input").validity
+PASS Stringification of document.createElement("input").validity
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
+PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
+PASS FormDataEvent interface: existence and properties of interface object
+PASS FormDataEvent interface object length
+PASS FormDataEvent interface object name
+PASS FormDataEvent interface: existence and properties of interface prototype object
+PASS FormDataEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS FormDataEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS FormDataEvent interface: attribute formData
+PASS FormDataEvent must be primary interface of new FormDataEvent("formdata", { formData: new FormData() })
+PASS Stringification of new FormDataEvent("formdata", { formData: new FormData() })
+PASS FormDataEvent interface: new FormDataEvent("formdata", { formData: new FormData() }) must inherit property "formData" with the proper type
+PASS CanvasRenderingContext2D interface: existence and properties of interface object
+PASS CanvasRenderingContext2D interface object length
+PASS CanvasRenderingContext2D interface object name
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasRenderingContext2D interface: attribute canvas
+PASS CanvasRenderingContext2D interface: operation getContextAttributes()
+PASS CanvasRenderingContext2D interface: operation save()
+PASS CanvasRenderingContext2D interface: operation restore()
+PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation getTransform()
+PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
+PASS CanvasRenderingContext2D interface: operation resetTransform()
+PASS CanvasRenderingContext2D interface: attribute globalAlpha
+PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS CanvasRenderingContext2D interface: attribute strokeStyle
+PASS CanvasRenderingContext2D interface: attribute fillStyle
+PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS CanvasRenderingContext2D interface: attribute shadowBlur
+PASS CanvasRenderingContext2D interface: attribute shadowColor
+PASS CanvasRenderingContext2D interface: attribute filter
+PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation beginPath()
+PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation stroke()
+PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
+PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
+PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
+PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS CanvasRenderingContext2D interface: attribute lineWidth
+PASS CanvasRenderingContext2D interface: attribute lineCap
+PASS CanvasRenderingContext2D interface: attribute lineJoin
+PASS CanvasRenderingContext2D interface: attribute miterLimit
+PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS CanvasRenderingContext2D interface: operation getLineDash()
+PASS CanvasRenderingContext2D interface: attribute lineDashOffset
+PASS CanvasRenderingContext2D interface: attribute font
+PASS CanvasRenderingContext2D interface: attribute textAlign
+PASS CanvasRenderingContext2D interface: attribute textBaseline
+PASS CanvasRenderingContext2D interface: attribute direction
+PASS CanvasRenderingContext2D interface: operation closePath()
+PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
+PASS Stringification of document.createElement("canvas").getContext("2d")
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getContextAttributes()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
+PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
+PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
+PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
+PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
+PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
+PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
+PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
+PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
+PASS CanvasGradient interface: existence and properties of interface object
+PASS CanvasGradient interface object length
+PASS CanvasGradient interface object name
+PASS CanvasGradient interface: existence and properties of interface prototype object
+PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasGradient interface: operation addColorStop(double, DOMString)
+PASS CanvasPattern interface: existence and properties of interface object
+PASS CanvasPattern interface object length
+PASS CanvasPattern interface object name
+PASS CanvasPattern interface: existence and properties of interface prototype object
+PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
+PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
+PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
+PASS TextMetrics interface: existence and properties of interface object
+PASS TextMetrics interface object length
+PASS TextMetrics interface object name
+PASS TextMetrics interface: existence and properties of interface prototype object
+PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
+PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
+PASS TextMetrics interface: attribute width
+PASS TextMetrics interface: attribute actualBoundingBoxLeft
+PASS TextMetrics interface: attribute actualBoundingBoxRight
+PASS TextMetrics interface: attribute fontBoundingBoxAscent
+PASS TextMetrics interface: attribute fontBoundingBoxDescent
+PASS TextMetrics interface: attribute actualBoundingBoxAscent
+PASS TextMetrics interface: attribute actualBoundingBoxDescent
+PASS TextMetrics interface: attribute emHeightAscent
+PASS TextMetrics interface: attribute emHeightDescent
+FAIL TextMetrics interface: attribute hangingBaseline assert_true: The prototype object must have a property "hangingBaseline" expected true got false
+FAIL TextMetrics interface: attribute alphabeticBaseline assert_true: The prototype object must have a property "alphabeticBaseline" expected true got false
+FAIL TextMetrics interface: attribute ideographicBaseline assert_true: The prototype object must have a property "ideographicBaseline" expected true got false
+PASS ImageData interface: existence and properties of interface object
+PASS ImageData interface object length
+PASS ImageData interface object name
+PASS ImageData interface: existence and properties of interface prototype object
+PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageData interface: attribute width
+PASS ImageData interface: attribute height
+PASS ImageData interface: attribute data
+PASS ImageData must be primary interface of new ImageData(10, 10)
+PASS Stringification of new ImageData(10, 10)
+PASS ImageData interface: new ImageData(10, 10) must inherit property "width" with the proper type
+PASS ImageData interface: new ImageData(10, 10) must inherit property "height" with the proper type
+FAIL ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain
+PASS Path2D interface: existence and properties of interface object
+PASS Path2D interface object length
+PASS Path2D interface object name
+PASS Path2D interface: existence and properties of interface prototype object
+PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
+PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
+PASS Path2D interface: operation closePath()
+PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS ImageBitmapRenderingContext interface: existence and properties of interface object
+PASS ImageBitmapRenderingContext interface object length
+PASS ImageBitmapRenderingContext interface object name
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmapRenderingContext interface: attribute canvas
+PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
+PASS OffscreenCanvas interface: existence and properties of interface object
+PASS OffscreenCanvas interface object length
+PASS OffscreenCanvas interface object name
+PASS OffscreenCanvas interface: existence and properties of interface prototype object
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvas interface: attribute width
+PASS OffscreenCanvas interface: attribute height
+PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
+PASS OffscreenCanvas interface: operation transferToImageBitmap()
+PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
+PASS OffscreenCanvasRenderingContext2D interface object length
+PASS OffscreenCanvasRenderingContext2D interface object name
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
+PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
+PASS OffscreenCanvasRenderingContext2D interface: operation commit()
+PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
+PASS OffscreenCanvasRenderingContext2D interface: operation save()
+PASS OffscreenCanvasRenderingContext2D interface: operation restore()
+PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
+FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
+PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
+PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
+PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
+PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
+PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
+PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
+PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
+PASS OffscreenCanvasRenderingContext2D interface: attribute filter
+PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
+PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation measureText(DOMString)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
+PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
+PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
+PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
+PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
+PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
+PASS OffscreenCanvasRenderingContext2D interface: attribute font
+PASS OffscreenCanvasRenderingContext2D interface: attribute textAlign
+PASS OffscreenCanvasRenderingContext2D interface: attribute textBaseline
+PASS OffscreenCanvasRenderingContext2D interface: attribute direction
+PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
+PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
+PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
+PASS CustomElementRegistry interface: existence and properties of interface object
+PASS CustomElementRegistry interface object length
+PASS CustomElementRegistry interface object name
+PASS CustomElementRegistry interface: existence and properties of interface prototype object
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
+PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
+PASS CustomElementRegistry interface: operation define(DOMString, CustomElementConstructor, ElementDefinitionOptions)
+PASS CustomElementRegistry interface: operation get(DOMString)
+PASS CustomElementRegistry interface: operation whenDefined(DOMString)
+PASS CustomElementRegistry interface: operation upgrade(Node)
+PASS ElementInternals interface: existence and properties of interface object
+PASS ElementInternals interface object length
+PASS ElementInternals interface object name
+PASS ElementInternals interface: existence and properties of interface prototype object
+PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
+PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
+PASS ElementInternals interface: operation setFormValue([object Object],[object Object],[object Object], [object Object],[object Object],[object Object])
+PASS ElementInternals interface: attribute form
+PASS ElementInternals interface: operation setValidity(ValidityStateFlags, DOMString, HTMLElement)
+PASS ElementInternals interface: attribute willValidate
+PASS ElementInternals interface: attribute validity
+PASS ElementInternals interface: attribute validationMessage
+PASS ElementInternals interface: operation checkValidity()
+PASS ElementInternals interface: operation reportValidity()
+PASS ElementInternals interface: attribute labels
+PASS DataTransfer interface: existence and properties of interface object
+PASS DataTransfer interface object length
+PASS DataTransfer interface object name
+PASS DataTransfer interface: existence and properties of interface prototype object
+PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransfer interface: attribute dropEffect
+PASS DataTransfer interface: attribute effectAllowed
+PASS DataTransfer interface: attribute items
+PASS DataTransfer interface: operation setDragImage(Element, long, long)
+PASS DataTransfer interface: attribute types
+PASS DataTransfer interface: operation getData(DOMString)
+PASS DataTransfer interface: operation setData(DOMString, DOMString)
+PASS DataTransfer interface: operation clearData(DOMString)
+PASS DataTransfer interface: attribute files
+PASS DataTransferItemList interface: existence and properties of interface object
+PASS DataTransferItemList interface object length
+PASS DataTransferItemList interface object name
+PASS DataTransferItemList interface: existence and properties of interface prototype object
+PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItemList interface: attribute length
+PASS DataTransferItemList interface: operation add(DOMString, DOMString)
+PASS DataTransferItemList interface: operation add(File)
+PASS DataTransferItemList interface: operation remove(unsigned long)
+PASS DataTransferItemList interface: operation clear()
+PASS DataTransferItem interface: existence and properties of interface object
+PASS DataTransferItem interface object length
+PASS DataTransferItem interface object name
+PASS DataTransferItem interface: existence and properties of interface prototype object
+PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
+PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
+PASS DataTransferItem interface: attribute kind
+PASS DataTransferItem interface: attribute type
+PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
+PASS DataTransferItem interface: operation getAsFile()
+PASS DragEvent interface: existence and properties of interface object
+PASS DragEvent interface object length
+PASS DragEvent interface object name
+PASS DragEvent interface: existence and properties of interface prototype object
+PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS DragEvent interface: attribute dataTransfer
+PASS BarProp interface: existence and properties of interface object
+PASS BarProp interface object length
+PASS BarProp interface object name
+PASS BarProp interface: existence and properties of interface prototype object
+PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
+PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
+PASS BarProp interface: attribute visible
+PASS History interface: existence and properties of interface object
+PASS History interface object length
+PASS History interface object name
+PASS History interface: existence and properties of interface prototype object
+PASS History interface: existence and properties of interface prototype object's "constructor" property
+PASS History interface: existence and properties of interface prototype object's @@unscopables property
+PASS History interface: attribute length
+PASS History interface: attribute scrollRestoration
+PASS History interface: attribute state
+PASS History interface: operation go(long)
+PASS History interface: operation back()
+PASS History interface: operation forward()
+PASS History interface: operation pushState(any, DOMString, USVString)
+PASS History interface: operation replaceState(any, DOMString, USVString)
+PASS History must be primary interface of window.history
+PASS Stringification of window.history
+PASS History interface: window.history must inherit property "length" with the proper type
+PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
+PASS History interface: window.history must inherit property "state" with the proper type
+PASS History interface: window.history must inherit property "go(long)" with the proper type
+PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "back()" with the proper type
+PASS History interface: window.history must inherit property "forward()" with the proper type
+PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
+PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
+PASS Location interface: existence and properties of interface object
+PASS Location interface object length
+PASS Location interface object name
+PASS Location interface: existence and properties of interface prototype object
+PASS Location interface: existence and properties of interface prototype object's "constructor" property
+PASS Location interface: existence and properties of interface prototype object's @@unscopables property
+FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+PASS Location must be primary interface of window.location
+PASS Stringification of window.location
+FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
+PASS Location interface: window.location must have own property "origin"
+PASS Location interface: window.location must have own property "protocol"
+PASS Location interface: window.location must have own property "host"
+PASS Location interface: window.location must have own property "hostname"
+PASS Location interface: window.location must have own property "port"
+PASS Location interface: window.location must have own property "pathname"
+PASS Location interface: window.location must have own property "search"
+PASS Location interface: window.location must have own property "hash"
+PASS Location interface: window.location must have own property "assign"
+PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "replace"
+PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
+PASS Location interface: window.location must have own property "reload"
+PASS Location interface: window.location must have own property "ancestorOrigins"
+PASS PopStateEvent interface: existence and properties of interface object
+PASS PopStateEvent interface object length
+PASS PopStateEvent interface object name
+PASS PopStateEvent interface: existence and properties of interface prototype object
+PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PopStateEvent interface: attribute state
+PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
+PASS Stringification of new PopStateEvent("popstate", { data: {} })
+PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
+PASS HashChangeEvent interface: existence and properties of interface object
+PASS HashChangeEvent interface object length
+PASS HashChangeEvent interface object name
+PASS HashChangeEvent interface: existence and properties of interface prototype object
+PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS HashChangeEvent interface: attribute oldURL
+PASS HashChangeEvent interface: attribute newURL
+PASS PageTransitionEvent interface: existence and properties of interface object
+PASS PageTransitionEvent interface object length
+PASS PageTransitionEvent interface object name
+PASS PageTransitionEvent interface: existence and properties of interface prototype object
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PageTransitionEvent interface: attribute persisted
+PASS BeforeUnloadEvent interface: existence and properties of interface object
+PASS BeforeUnloadEvent interface object length
+PASS BeforeUnloadEvent interface object name
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS BeforeUnloadEvent interface: attribute returnValue
+PASS ApplicationCache interface: existence and properties of interface object
+PASS ApplicationCache interface object length
+PASS ApplicationCache interface object name
+PASS ApplicationCache interface: existence and properties of interface prototype object
+PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
+PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
+PASS ApplicationCache interface: constant UNCACHED on interface object
+PASS ApplicationCache interface: constant UNCACHED on interface prototype object
+PASS ApplicationCache interface: constant IDLE on interface object
+PASS ApplicationCache interface: constant IDLE on interface prototype object
+PASS ApplicationCache interface: constant CHECKING on interface object
+PASS ApplicationCache interface: constant CHECKING on interface prototype object
+PASS ApplicationCache interface: constant DOWNLOADING on interface object
+PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
+PASS ApplicationCache interface: constant UPDATEREADY on interface object
+PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
+PASS ApplicationCache interface: constant OBSOLETE on interface object
+PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
+PASS ApplicationCache interface: attribute status
+PASS ApplicationCache interface: operation update()
+PASS ApplicationCache interface: operation abort()
+PASS ApplicationCache interface: operation swapCache()
+PASS ApplicationCache interface: attribute onchecking
+PASS ApplicationCache interface: attribute onerror
+PASS ApplicationCache interface: attribute onnoupdate
+PASS ApplicationCache interface: attribute ondownloading
+PASS ApplicationCache interface: attribute onprogress
+PASS ApplicationCache interface: attribute onupdateready
+PASS ApplicationCache interface: attribute oncached
+PASS ApplicationCache interface: attribute onobsolete
+PASS ApplicationCache must be primary interface of window.applicationCache
+PASS Stringification of window.applicationCache
+PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
+PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
+PASS ErrorEvent interface: existence and properties of interface object
+PASS ErrorEvent interface object length
+PASS ErrorEvent interface object name
+PASS ErrorEvent interface: existence and properties of interface prototype object
+PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS ErrorEvent interface: attribute message
+PASS ErrorEvent interface: attribute filename
+PASS ErrorEvent interface: attribute lineno
+PASS ErrorEvent interface: attribute colno
+PASS ErrorEvent interface: attribute error
+PASS PromiseRejectionEvent interface: existence and properties of interface object
+PASS PromiseRejectionEvent interface object length
+PASS PromiseRejectionEvent interface object name
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS PromiseRejectionEvent interface: attribute promise
+PASS PromiseRejectionEvent interface: attribute reason
+PASS Navigator interface: existence and properties of interface object
+PASS Navigator interface object length
+PASS Navigator interface object name
+PASS Navigator interface: existence and properties of interface prototype object
+PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
+PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
+PASS Navigator interface: attribute appCodeName
+PASS Navigator interface: attribute appName
+PASS Navigator interface: attribute appVersion
+PASS Navigator interface: attribute platform
+PASS Navigator interface: attribute product
+PASS Navigator interface: attribute productSub
+PASS Navigator interface: attribute userAgent
+PASS Navigator interface: attribute vendor
+PASS Navigator interface: attribute vendorSub
+FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
+FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
+PASS Navigator interface: attribute language
+PASS Navigator interface: attribute languages
+PASS Navigator interface: attribute onLine
+PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
+PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
+PASS Navigator interface: attribute cookieEnabled
+PASS Navigator interface: attribute plugins
+PASS Navigator interface: attribute mimeTypes
+PASS Navigator interface: operation javaEnabled()
+PASS Navigator interface: attribute hardwareConcurrency
+PASS Navigator must be primary interface of window.navigator
+PASS Stringification of window.navigator
+PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
+PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
+PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
+PASS Navigator interface: window.navigator must inherit property "product" with the proper type
+PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
+PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
+PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
+FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
+FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
+PASS Navigator interface: window.navigator must inherit property "language" with the proper type
+PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
+PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
+PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
+PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
+PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
+PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
+PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
+PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
+PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
+PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
+PASS PluginArray interface: existence and properties of interface object
+PASS PluginArray interface object length
+PASS PluginArray interface object name
+PASS PluginArray interface: existence and properties of interface prototype object
+PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
+PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS PluginArray interface: operation refresh(boolean)
+PASS PluginArray interface: attribute length
+PASS PluginArray interface: operation item(unsigned long)
+PASS PluginArray interface: operation namedItem(DOMString)
+PASS MimeTypeArray interface: existence and properties of interface object
+PASS MimeTypeArray interface object length
+PASS MimeTypeArray interface object name
+PASS MimeTypeArray interface: existence and properties of interface prototype object
+PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeTypeArray interface: attribute length
+PASS MimeTypeArray interface: operation item(unsigned long)
+PASS MimeTypeArray interface: operation namedItem(DOMString)
+PASS Plugin interface: existence and properties of interface object
+PASS Plugin interface object length
+PASS Plugin interface object name
+PASS Plugin interface: existence and properties of interface prototype object
+PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
+PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
+PASS Plugin interface: attribute name
+PASS Plugin interface: attribute description
+PASS Plugin interface: attribute filename
+PASS Plugin interface: attribute length
+PASS Plugin interface: operation item(unsigned long)
+PASS Plugin interface: operation namedItem(DOMString)
+PASS MimeType interface: existence and properties of interface object
+PASS MimeType interface object length
+PASS MimeType interface object name
+PASS MimeType interface: existence and properties of interface prototype object
+PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
+PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
+PASS MimeType interface: attribute type
+PASS MimeType interface: attribute description
+PASS MimeType interface: attribute suffixes
+PASS MimeType interface: attribute enabledPlugin
+PASS ImageBitmap interface: existence and properties of interface object
+PASS ImageBitmap interface object length
+PASS ImageBitmap interface object name
+PASS ImageBitmap interface: existence and properties of interface prototype object
+PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
+PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
+PASS ImageBitmap interface: attribute width
+PASS ImageBitmap interface: attribute height
+PASS ImageBitmap interface: operation close()
+PASS MessageEvent interface: existence and properties of interface object
+PASS MessageEvent interface object length
+PASS MessageEvent interface object name
+PASS MessageEvent interface: existence and properties of interface prototype object
+PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageEvent interface: attribute data
+PASS MessageEvent interface: attribute origin
+PASS MessageEvent interface: attribute lastEventId
+PASS MessageEvent interface: attribute source
+PASS MessageEvent interface: attribute ports
+PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
+PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
+PASS Stringification of new MessageEvent("message", { data: 5 })
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
+FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
+PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
+PASS EventSource interface: existence and properties of interface object
+PASS EventSource interface object length
+PASS EventSource interface object name
+PASS EventSource interface: existence and properties of interface prototype object
+PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
+PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
+PASS EventSource interface: attribute url
+PASS EventSource interface: attribute withCredentials
+PASS EventSource interface: constant CONNECTING on interface object
+PASS EventSource interface: constant CONNECTING on interface prototype object
+PASS EventSource interface: constant OPEN on interface object
+PASS EventSource interface: constant OPEN on interface prototype object
+PASS EventSource interface: constant CLOSED on interface object
+PASS EventSource interface: constant CLOSED on interface prototype object
+PASS EventSource interface: attribute readyState
+PASS EventSource interface: attribute onopen
+PASS EventSource interface: attribute onmessage
+PASS EventSource interface: attribute onerror
+PASS EventSource interface: operation close()
+PASS WebSocket interface: existence and properties of interface object
+PASS WebSocket interface object length
+PASS WebSocket interface object name
+PASS WebSocket interface: existence and properties of interface prototype object
+PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
+PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
+PASS WebSocket interface: attribute url
+PASS WebSocket interface: constant CONNECTING on interface object
+PASS WebSocket interface: constant CONNECTING on interface prototype object
+PASS WebSocket interface: constant OPEN on interface object
+PASS WebSocket interface: constant OPEN on interface prototype object
+PASS WebSocket interface: constant CLOSING on interface object
+PASS WebSocket interface: constant CLOSING on interface prototype object
+PASS WebSocket interface: constant CLOSED on interface object
+PASS WebSocket interface: constant CLOSED on interface prototype object
+PASS WebSocket interface: attribute readyState
+PASS WebSocket interface: attribute bufferedAmount
+PASS WebSocket interface: attribute onopen
+PASS WebSocket interface: attribute onerror
+PASS WebSocket interface: attribute onclose
+PASS WebSocket interface: attribute extensions
+PASS WebSocket interface: attribute protocol
+PASS WebSocket interface: operation close(unsigned short, USVString)
+PASS WebSocket interface: attribute onmessage
+PASS WebSocket interface: attribute binaryType
+PASS WebSocket interface: operation send(USVString)
+PASS WebSocket interface: operation send(Blob)
+PASS WebSocket interface: operation send(ArrayBuffer)
+PASS WebSocket interface: operation send(ArrayBufferView)
+PASS WebSocket must be primary interface of new WebSocket("wss://nonexistent.web-platform.test")
+PASS Stringification of new WebSocket("wss://nonexistent.web-platform.test")
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "url" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CONNECTING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "OPEN" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSING" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "CLOSED" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "readyState" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "bufferedAmount" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onopen" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onerror" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onclose" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "extensions" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "protocol" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "close(unsigned short, USVString)" with the proper type
+PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "onmessage" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "binaryType" with the proper type
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(USVString)" with the proper type
+PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(Blob)" with the proper type
+PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBuffer)" with the proper type
+PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS WebSocket interface: new WebSocket("wss://nonexistent.web-platform.test") must inherit property "send(ArrayBufferView)" with the proper type
+PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://nonexistent.web-platform.test") with too few arguments must throw TypeError
+PASS CloseEvent interface: existence and properties of interface object
+PASS CloseEvent interface object length
+PASS CloseEvent interface object name
+PASS CloseEvent interface: existence and properties of interface prototype object
+PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS CloseEvent interface: attribute wasClean
+PASS CloseEvent interface: attribute code
+PASS CloseEvent interface: attribute reason
+PASS CloseEvent must be primary interface of new CloseEvent("close")
+PASS Stringification of new CloseEvent("close")
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
+PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
+PASS MessageChannel interface: existence and properties of interface object
+PASS MessageChannel interface object length
+PASS MessageChannel interface object name
+PASS MessageChannel interface: existence and properties of interface prototype object
+PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessageChannel interface: attribute port1
+PASS MessageChannel interface: attribute port2
+PASS MessagePort interface: existence and properties of interface object
+PASS MessagePort interface object length
+PASS MessagePort interface object name
+PASS MessagePort interface: existence and properties of interface prototype object
+PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
+PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MessagePort interface: operation postMessage(any, [object Object])
+PASS MessagePort interface: operation postMessage(any, PostMessageOptions)
+PASS MessagePort interface: operation start()
+PASS MessagePort interface: operation close()
+PASS MessagePort interface: attribute onmessage
+PASS MessagePort interface: attribute onmessageerror
+PASS BroadcastChannel interface: existence and properties of interface object
+PASS BroadcastChannel interface object length
+PASS BroadcastChannel interface object name
+PASS BroadcastChannel interface: existence and properties of interface prototype object
+PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
+PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
+PASS BroadcastChannel interface: attribute name
+PASS BroadcastChannel interface: operation postMessage(any)
+PASS BroadcastChannel interface: operation close()
+PASS BroadcastChannel interface: attribute onmessage
+PASS BroadcastChannel interface: attribute onmessageerror
+PASS WorkerGlobalScope interface: existence and properties of interface object
+PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
+PASS SharedWorkerGlobalScope interface: existence and properties of interface object
+PASS Worker interface: existence and properties of interface object
+PASS Worker interface object length
+PASS Worker interface object name
+PASS Worker interface: existence and properties of interface prototype object
+PASS Worker interface: existence and properties of interface prototype object's "constructor" property
+PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
+PASS Worker interface: operation terminate()
+PASS Worker interface: operation postMessage(any, [object Object])
+PASS Worker interface: operation postMessage(any, PostMessageOptions)
+PASS Worker interface: attribute onmessage
+FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+PASS Worker interface: attribute onerror
+PASS SharedWorker interface: existence and properties of interface object
+PASS SharedWorker interface object length
+PASS SharedWorker interface object name
+PASS SharedWorker interface: existence and properties of interface prototype object
+PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
+PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
+PASS SharedWorker interface: attribute port
+PASS SharedWorker interface: attribute onerror
+PASS WorkerNavigator interface: existence and properties of interface object
+PASS WorkerLocation interface: existence and properties of interface object
+PASS Storage interface: existence and properties of interface object
+PASS Storage interface object length
+PASS Storage interface object name
+PASS Storage interface: existence and properties of interface prototype object
+PASS Storage interface: existence and properties of interface prototype object's "constructor" property
+PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
+PASS Storage interface: attribute length
+PASS Storage interface: operation key(unsigned long)
+PASS Storage interface: operation getItem(DOMString)
+PASS Storage interface: operation setItem(DOMString, DOMString)
+PASS Storage interface: operation removeItem(DOMString)
+PASS Storage interface: operation clear()
+PASS StorageEvent interface: existence and properties of interface object
+PASS StorageEvent interface object length
+PASS StorageEvent interface object name
+PASS StorageEvent interface: existence and properties of interface prototype object
+PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS StorageEvent interface: attribute key
+PASS StorageEvent interface: attribute oldValue
+PASS StorageEvent interface: attribute newValue
+PASS StorageEvent interface: attribute url
+PASS StorageEvent interface: attribute storageArea
+PASS StorageEvent interface: operation initStorageEvent(DOMString, boolean, boolean, DOMString, DOMString, DOMString, USVString, Storage)
+PASS External interface: existence and properties of interface object
+PASS External interface object length
+PASS External interface object name
+PASS External interface: existence and properties of interface prototype object
+PASS External interface: existence and properties of interface prototype object's "constructor" property
+PASS External interface: existence and properties of interface prototype object's @@unscopables property
+PASS External interface: operation AddSearchProvider()
+PASS External interface: operation IsSearchProviderInstalled()
+PASS External must be primary interface of window.external
+PASS Stringification of window.external
+PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
+PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
+PASS SVGElement interface: attribute onabort
+PASS SVGElement interface: attribute onauxclick
+PASS SVGElement interface: attribute onblur
+PASS SVGElement interface: attribute oncancel
+PASS SVGElement interface: attribute oncanplay
+PASS SVGElement interface: attribute oncanplaythrough
+PASS SVGElement interface: attribute onchange
+PASS SVGElement interface: attribute onclick
+PASS SVGElement interface: attribute onclose
+PASS SVGElement interface: attribute oncontextmenu
+PASS SVGElement interface: attribute oncuechange
+PASS SVGElement interface: attribute ondblclick
+PASS SVGElement interface: attribute ondrag
+PASS SVGElement interface: attribute ondragend
+PASS SVGElement interface: attribute ondragenter
+FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
+PASS SVGElement interface: attribute ondragleave
+PASS SVGElement interface: attribute ondragover
+PASS SVGElement interface: attribute ondragstart
+PASS SVGElement interface: attribute ondrop
+PASS SVGElement interface: attribute ondurationchange
+PASS SVGElement interface: attribute onemptied
+PASS SVGElement interface: attribute onended
+PASS SVGElement interface: attribute onerror
+PASS SVGElement interface: attribute onfocus
+PASS SVGElement interface: attribute onformdata
+PASS SVGElement interface: attribute oninput
+PASS SVGElement interface: attribute oninvalid
+PASS SVGElement interface: attribute onkeydown
+PASS SVGElement interface: attribute onkeypress
+PASS SVGElement interface: attribute onkeyup
+PASS SVGElement interface: attribute onload
+PASS SVGElement interface: attribute onloadeddata
+PASS SVGElement interface: attribute onloadedmetadata
+FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
+PASS SVGElement interface: attribute onloadstart
+PASS SVGElement interface: attribute onmousedown
+PASS SVGElement interface: attribute onmouseenter
+PASS SVGElement interface: attribute onmouseleave
+PASS SVGElement interface: attribute onmousemove
+PASS SVGElement interface: attribute onmouseout
+PASS SVGElement interface: attribute onmouseover
+PASS SVGElement interface: attribute onmouseup
+PASS SVGElement interface: attribute onwheel
+PASS SVGElement interface: attribute onpause
+PASS SVGElement interface: attribute onplay
+PASS SVGElement interface: attribute onplaying
+PASS SVGElement interface: attribute onprogress
+PASS SVGElement interface: attribute onratechange
+PASS SVGElement interface: attribute onreset
+PASS SVGElement interface: attribute onresize
+PASS SVGElement interface: attribute onscroll
+FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
+PASS SVGElement interface: attribute onseeked
+PASS SVGElement interface: attribute onseeking
+PASS SVGElement interface: attribute onselect
+PASS SVGElement interface: attribute onstalled
+PASS SVGElement interface: attribute onsubmit
+PASS SVGElement interface: attribute onsuspend
+PASS SVGElement interface: attribute ontimeupdate
+PASS SVGElement interface: attribute ontoggle
+PASS SVGElement interface: attribute onvolumechange
+PASS SVGElement interface: attribute onwaiting
+PASS SVGElement interface: attribute oncopy
+PASS SVGElement interface: attribute oncut
+PASS SVGElement interface: attribute onpaste
+PASS SVGElement interface: attribute dataset
+PASS SVGElement interface: attribute nonce
+PASS SVGElement interface: attribute tabIndex
+PASS SVGElement interface: operation focus(FocusOptions)
+PASS SVGElement interface: operation blur()
+FAIL SVGSVGElement interface: attribute onafterprint assert_true: The prototype object must have a property "onafterprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeprint assert_true: The prototype object must have a property "onbeforeprint" expected true got false
+FAIL SVGSVGElement interface: attribute onbeforeunload assert_true: The prototype object must have a property "onbeforeunload" expected true got false
+FAIL SVGSVGElement interface: attribute onhashchange assert_true: The prototype object must have a property "onhashchange" expected true got false
+FAIL SVGSVGElement interface: attribute onlanguagechange assert_true: The prototype object must have a property "onlanguagechange" expected true got false
+FAIL SVGSVGElement interface: attribute onmessage assert_true: The prototype object must have a property "onmessage" expected true got false
+FAIL SVGSVGElement interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
+FAIL SVGSVGElement interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false
+FAIL SVGSVGElement interface: attribute ononline assert_true: The prototype object must have a property "ononline" expected true got false
+FAIL SVGSVGElement interface: attribute onpagehide assert_true: The prototype object must have a property "onpagehide" expected true got false
+FAIL SVGSVGElement interface: attribute onpageshow assert_true: The prototype object must have a property "onpageshow" expected true got false
+FAIL SVGSVGElement interface: attribute onpopstate assert_true: The prototype object must have a property "onpopstate" expected true got false
+FAIL SVGSVGElement interface: attribute onrejectionhandled assert_true: The prototype object must have a property "onrejectionhandled" expected true got false
+FAIL SVGSVGElement interface: attribute onstorage assert_true: The prototype object must have a property "onstorage" expected true got false
+FAIL SVGSVGElement interface: attribute onunhandledrejection assert_true: The prototype object must have a property "onunhandledrejection" expected true got false
+FAIL SVGSVGElement interface: attribute onunload assert_true: The prototype object must have a property "onunload" expected true got false
+FAIL SVGAElement interface: attribute href assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+FAIL SVGAElement interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
+FAIL SVGAElement interface: attribute origin assert_true: The prototype object must have a property "origin" expected true got false
+FAIL SVGAElement interface: attribute protocol assert_true: The prototype object must have a property "protocol" expected true got false
+FAIL SVGAElement interface: attribute username assert_true: The prototype object must have a property "username" expected true got false
+FAIL SVGAElement interface: attribute password assert_true: The prototype object must have a property "password" expected true got false
+FAIL SVGAElement interface: attribute host assert_true: The prototype object must have a property "host" expected true got false
+FAIL SVGAElement interface: attribute hostname assert_true: The prototype object must have a property "hostname" expected true got false
+FAIL SVGAElement interface: attribute port assert_true: The prototype object must have a property "port" expected true got false
+FAIL SVGAElement interface: attribute pathname assert_true: The prototype object must have a property "pathname" expected true got false
+FAIL SVGAElement interface: attribute search assert_true: The prototype object must have a property "search" expected true got false
+FAIL SVGAElement interface: attribute hash assert_true: The prototype object must have a property "hash" expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win7/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt b/third_party/blink/web_tests/platform/win7/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
new file mode 100644
index 0000000..ab39688
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS Interfaces and attributes in ServiceWorkerGlobalScope
+FAIL test setup (cache creation) promise_test: Unhandled rejection with value: object "Duplicate identifier WindowOrWorkerGlobalScope"
+FAIL Event constructors assert_equals: FetchEvent.isReload should not exist expected (undefined) undefined but got (boolean) false
+PASS xhr is not exposed
+PASS URL.createObjectURL is not exposed
+Harness: the test ran to completion.
+
diff --git a/third_party/brotli/OWNERS b/third_party/brotli/OWNERS
index 458697e6..9416e2a3 100644
--- a/third_party/brotli/OWNERS
+++ b/third_party/brotli/OWNERS
@@ -1,2 +1,5 @@
 ksakamoto@chromium.org
 bashi@chromium.org
+
+# COMPONENT: Blink>WebFonts
+# TEAM: loading-dev@chromium.org
diff --git a/third_party/crashpad/OWNERS b/third_party/crashpad/OWNERS
index 0960ebde..c87635f6 100644
--- a/third_party/crashpad/OWNERS
+++ b/third_party/crashpad/OWNERS
@@ -15,3 +15,4 @@
 scottmg@chromium.org
 
 # TEAM: crashpad-dev@chromium.org
+# COMPONENT: Internals>CrashReporting
diff --git a/third_party/glslang/OWNERS b/third_party/glslang/OWNERS
index 4bae66b3..c6532a0 100644
--- a/third_party/glslang/OWNERS
+++ b/third_party/glslang/OWNERS
@@ -3,3 +3,4 @@
 vmiura@chromium.org
 
 # COMPONENT: Internals>GPU>Internals
+# TEAM: graphics-dev@chromium.org
diff --git a/third_party/google_android_play_core/OWNERS b/third_party/google_android_play_core/OWNERS
index b18865e..ff1b6cf 100644
--- a/third_party/google_android_play_core/OWNERS
+++ b/third_party/google_android_play_core/OWNERS
@@ -1,2 +1,4 @@
 agrieve@chromium.org
 tiborg@chromium.org
+# COMPONENT: Mobile>FeatureModules
+# TEAM: chromium-reviews@chromium.org
diff --git a/third_party/google_toolbox_for_mac/OWNERS b/third_party/google_toolbox_for_mac/OWNERS
index 720b872..4c9fb06 100644
--- a/third_party/google_toolbox_for_mac/OWNERS
+++ b/third_party/google_toolbox_for_mac/OWNERS
@@ -1,3 +1,4 @@
 avi@chromium.org
 mark@chromium.org
 rsesek@chromium.org
+# COMPONENT: Platform>Apps>Feedback
diff --git a/third_party/ink/OWNERS b/third_party/ink/OWNERS
index 0392501d..4479cfe 100644
--- a/third_party/ink/OWNERS
+++ b/third_party/ink/OWNERS
@@ -1,3 +1,4 @@
 dstockwell@chromium.org
 dvallet@chromium.org
 martiw@chromium.org
+# COMPONENT: Internals
diff --git a/third_party/libaom/OWNERS b/third_party/libaom/OWNERS
index 6524678..94c24159 100644
--- a/third_party/libaom/OWNERS
+++ b/third_party/libaom/OWNERS
@@ -2,3 +2,4 @@
 johannkoenig@google.com
 jzern@chromium.org
 jzern@google.com
+# COMPONENT: Internals>Media>Video
diff --git a/third_party/libpng/OWNERS b/third_party/libpng/OWNERS
index 6b9f107..cc568ca 100644
--- a/third_party/libpng/OWNERS
+++ b/third_party/libpng/OWNERS
@@ -1,3 +1,4 @@
 scroggo@chromium.org
 
 # COMPONENT: Internals>Images>Codecs
+# TEAM: skia-discuss@googlegroups.com
diff --git a/third_party/libsecret/OWNERS b/third_party/libsecret/OWNERS
index 10b6284b..915e79f 100644
--- a/third_party/libsecret/OWNERS
+++ b/third_party/libsecret/OWNERS
@@ -1,2 +1,4 @@
 cfroussios@chromium.org
 dvadym@chromium.org
+# COMPONENT: Internals>LocalDataEncryption
+# TEAM: chromium-dev@chromium.org
diff --git a/third_party/libsync/OWNERS b/third_party/libsync/OWNERS
index c21539f..884a81ade 100644
--- a/third_party/libsync/OWNERS
+++ b/third_party/libsync/OWNERS
@@ -1,3 +1,4 @@
 dcastagna@chromium.org
 dnicoara@chromium.org
 piman@chromium.org
+# COMPONENT: Internals
diff --git a/third_party/libwebp/OWNERS b/third_party/libwebp/OWNERS
index 2f08782..c24c505 100644
--- a/third_party/libwebp/OWNERS
+++ b/third_party/libwebp/OWNERS
@@ -2,3 +2,4 @@
 jzern@chromium.org
 jzern@google.com
 urvang@chromium.org
+# COMPONENT: Blink>Image
diff --git a/third_party/libxslt/OWNERS b/third_party/libxslt/OWNERS
index 35db4ea9..dba40d5f 100644
--- a/third_party/libxslt/OWNERS
+++ b/third_party/libxslt/OWNERS
@@ -1,2 +1,3 @@
 dcheng@chromium.org
 palmer@chromium.org
+# COMPONENT: Blink>XML
diff --git a/third_party/lottie/README.md b/third_party/lottie/README.md
new file mode 100644
index 0000000..6d86f99
--- /dev/null
+++ b/third_party/lottie/README.md
@@ -0,0 +1,56 @@
+# Lottie Web Worker
+
+#### Using the lottie player on a worker thread and an offscreen canvas.
+
+## Sample usage
+### 1. Setting up a new animation
+#### HTML:
+```html
+<canvas id="a"></canvas>
+```
+
+#### Javascript:
+```js
+let offscreenCanvas = document.getElementById('a').transferControlToOffscreen();
+let animationData = JSON_LOTTIE_ANIMATION_DATA;
+
+let worker = new Worker('lottie_worker.min.js');
+worker.postMessage({
+  canvas: offscreenCanvas,
+  animationData: animationData,
+  drawSize: {
+    width: 200,
+    height: 100
+  }
+  params: {
+    loop: true,
+    autoplay: true
+  }
+})
+```
+
+### 2. Updating the size of the canvas
+```js
+worker.postMessage({
+  drawSize: {
+    width: 250,
+    height: 150
+  }
+})
+```
+
+## Message field description
+```python
+data: {
+  canvas: 'The offscreen canvas that will display the animation.',
+  animationData: 'The json lottie animation data.',
+  drawSize: {
+    width: 'The width of the rendered frame in pixels',
+    height: 'The height of the rendered frame in pixels',
+  },
+  params: {
+    loop: 'Set "true" for a looping animation',
+    autoplay: 'Set "true" for the animation to autoplay on load',
+  }
+},
+```
diff --git a/third_party/lottie/lottie_worker.js b/third_party/lottie/lottie_worker.js
index ac40e37..fdf9a1a 100644
--- a/third_party/lottie/lottie_worker.js
+++ b/third_party/lottie/lottie_worker.js
@@ -12150,24 +12150,47 @@
  * a wrapper that manages animation control for each animation.
  */
 
-var animations = [];
+var currentAnimation = null;
 
 onmessage = function(evt) {
-    if (!evt || !evt.data || !evt.data.params || !evt.data.canvas) return;
-    var canvas = evt.data.canvas;
-    var params = evt.data.params;
-    var ctx = canvas.getContext("2d");
-    var animation = lottiejs.loadAnimation({
-        renderer: 'canvas',
-        loop: params.loop,
-        autoplay: params.autoplay,
-        animationData: evt.data.animationData,
-        rendererSettings: {
-            context: ctx,
-            scaleMode: 'noScale',
-            clearCanvas: true
-        }
-    });
-    animations.push(animation);
-    animation.play();
+    if (!evt || !evt.data) return;
+
+    var canvas = null;
+    if (currentAnimation) {
+        canvas = currentAnimation.renderer.canvasContext.canvas;
+    } else if (evt.data.canvas) {
+        canvas = evt.data.canvas;
+    } else {
+        return;
+    }
+
+    // Set the draw size of the canvas. This is the pixel size at which the
+    // lottie renderer will render the frames.
+    if (evt.data.drawSize) {
+        canvas.height = evt.data.drawSize.height;
+        canvas.width = evt.data.drawSize.width;
+
+        // Update lottie player to use the new canvas size.
+        if (currentAnimation)
+            currentAnimation.resize();
+    }
+
+    if (!currentAnimation) {
+        if (!evt.data.animationData || !evt.data.params)
+            return;
+        var params = evt.data.params;
+        var ctx = canvas.getContext("2d");
+        currentAnimation = lottiejs.loadAnimation({
+            renderer: 'canvas',
+            loop: params.loop,
+            autoplay: params.autoplay,
+            animationData: evt.data.animationData,
+            rendererSettings: {
+                context: ctx,
+                scaleMode: 'noScale',
+                clearCanvas: true
+            }
+        });
+        currentAnimation.play();
+    }
 };
diff --git a/third_party/lottie/lottie_worker.min.js b/third_party/lottie/lottie_worker.min.js
index e400409..7626d80 100644
--- a/third_party/lottie/lottie_worker.min.js
+++ b/third_party/lottie/lottie_worker.min.js
@@ -1 +1 @@
-var lottiejs=function(window){"use strict";var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};function ProjectInterface(){return{}}!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){if("object"==typeof t&&t.length){var e,r=createSizedArray(t.length),i=t.length;for(e=0;e<i;e+=1)r[e]=Math.abs(t[e]);return r}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function BMEnterFrameEvent(t,e,r,i){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=i<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,i){this.type=t,this.currentLoop=r,this.totalLoops=e,this.direction=i<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this.firstFrame=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}roundValues(!1);var createElementID=(B=0,function(){return"__lottie_element_"+ ++B}),B;function HSVtoRGB(t,e,r){var i,s,a,n,o,h,p,l;switch(h=r*(1-e),p=r*(1-(o=6*t-(n=Math.floor(6*t)))*e),l=r*(1-(1-o)*e),n%6){case 0:i=r,s=l,a=h;break;case 1:i=p,s=r,a=h;break;case 2:i=h,s=r,a=l;break;case 3:i=h,s=p,a=r;break;case 4:i=l,s=h,a=r;break;case 5:i=r,s=h,a=p}return[i,s,a]}function RGBtoHSV(t,e,r){var i,s=Math.max(t,e,r),a=Math.min(t,e,r),n=s-a,o=0===s?0:n/s,h=s/255;switch(s){case a:i=0;break;case t:i=e-r+n*(e<r?6:0),i/=6*n;break;case e:i=r-t+2*n,i/=6*n;break;case r:i=t-e+4*n,i/=6*n}return[i,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,1<r[1]?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,1<r[2]?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,1<r[0]?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}var rgbToHex=function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1==e.length?"0"+e:e;return function(t,e,r){return t<0&&(t=0),e<0&&(e=0),r<0&&(r=0),"#"+i[t]+i[e]+i[r]}}();function BaseEvent(){}BaseEvent.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,i=0;i<r;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var r=0,i=this._cbs[t].length;r<i;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,i-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var createTypedArray="function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}:function(t,e){var r,i=0,s=[];switch(t){case"int16":case"uint8c":r=1;break;default:r=1.1}for(i=0;i<e;i+=1)s.push(r);return s};function createSizedArray(t){return Array.apply(null,{length:t})}function createTag(t){return document.createElement(t)}function DynamicPropertyContainer(){}DynamicPropertyContainer.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){this._mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var getBlendMode=(Ja={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return Ja[t]||""}),Ja,Matrix=(La=Math.cos,Ma=Math.sin,Na=Math.tan,Oa=Math.round,function(){this.reset=Pa,this.rotate=Qa,this.rotateX=Ra,this.rotateY=Sa,this.rotateZ=Ta,this.skew=Va,this.skewFromAxis=Wa,this.shear=Ua,this.scale=Xa,this.setTransform=Ya,this.translate=Za,this.transform=$a,this.applyToPoint=db,this.applyToX=eb,this.applyToY=fb,this.applyToZ=gb,this.applyToPointArray=kb,this.applyToTriplePoints=jb,this.applyToPointStringified=lb,this.toCSS=mb,this.to2dCSS=pb,this.clone=bb,this.cloneFromProps=cb,this.equals=ab,this.inversePoints=ib,this.inversePoint=hb,this._t=this.transform,this.isIdentity=_a,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}),La,Ma,Na,Oa;function Pa(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function Qa(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function Ra(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(1,0,0,0,0,e,-r,0,0,r,e,0,0,0,0,1)}function Sa(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,0,r,0,0,1,0,0,-r,0,e,0,0,0,0,1)}function Ta(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function Ua(t,e){return this._t(1,e,t,1,0,0)}function Va(t,e){return this.shear(Na(t),Na(e))}function Wa(t,e){var r=La(e),i=Ma(e);return this._t(r,i,0,0,-i,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Na(t),1,0,0,0,0,1,0,0,0,0,1)._t(r,-i,0,0,i,r,0,0,0,0,1,0,0,0,0,1)}function Xa(t,e,r){return r||0===r||(r=1),1===t&&1===e&&1===r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function Ya(t,e,r,i,s,a,n,o,h,p,l,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=i,this.props[4]=s,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=p,this.props[10]=l,this.props[11]=m,this.props[12]=f,this.props[13]=c,this.props[14]=d,this.props[15]=u,this}function Za(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function $a(t,e,r,i,s,a,n,o,h,p,l,m,f,c,d,u){var y=this.props;if(1===t&&0===e&&0===r&&0===i&&0===s&&1===a&&0===n&&0===o&&0===h&&0===p&&1===l&&0===m)return y[12]=y[12]*t+y[15]*f,y[13]=y[13]*a+y[15]*c,y[14]=y[14]*l+y[15]*d,y[15]=y[15]*u,this._identityCalculated=!1,this;var g=y[0],v=y[1],P=y[2],b=y[3],x=y[4],_=y[5],S=y[6],T=y[7],A=y[8],C=y[9],E=y[10],k=y[11],D=y[12],M=y[13],I=y[14],w=y[15];return y[0]=g*t+v*s+P*h+b*f,y[1]=g*e+v*a+P*p+b*c,y[2]=g*r+v*n+P*l+b*d,y[3]=g*i+v*o+P*m+b*u,y[4]=x*t+_*s+S*h+T*f,y[5]=x*e+_*a+S*p+T*c,y[6]=x*r+_*n+S*l+T*d,y[7]=x*i+_*o+S*m+T*u,y[8]=A*t+C*s+E*h+k*f,y[9]=A*e+C*a+E*p+k*c,y[10]=A*r+C*n+E*l+k*d,y[11]=A*i+C*o+E*m+k*u,y[12]=D*t+M*s+I*h+w*f,y[13]=D*e+M*a+I*p+w*c,y[14]=D*r+M*n+I*l+w*d,y[15]=D*i+M*o+I*m+w*u,this._identityCalculated=!1,this}function _a(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function ab(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function bb(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function cb(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function db(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function eb(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function fb(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function gb(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function hb(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,i=-this.props[1]/e,s=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*s+n,t[0]*i+t[1]*a+o,0]}function ib(t){var e,r=t.length,i=[];for(e=0;e<r;e+=1)i[e]=hb(t[e]);return i}function jb(t,e,r){var i=createTypedArray("float32",6);if(this.isIdentity())i[0]=t[0],i[1]=t[1],i[2]=e[0],i[3]=e[1],i[4]=r[0],i[5]=r[1];else{var s=this.props[0],a=this.props[1],n=this.props[4],o=this.props[5],h=this.props[12],p=this.props[13];i[0]=t[0]*s+t[1]*n+h,i[1]=t[0]*a+t[1]*o+p,i[2]=e[0]*s+e[1]*n+h,i[3]=e[0]*a+e[1]*o+p,i[4]=r[0]*s+r[1]*n+h,i[5]=r[0]*a+r[1]*o+p}return i}function kb(t,e,r){return this.isIdentity()?[t,e,r]:[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function lb(t,e){if(this.isIdentity())return t+","+e;var r=this.props;return Math.round(100*(t*r[0]+e*r[4]+r[12]))/100+","+Math.round(100*(t*r[1]+e*r[5]+r[13]))/100}function mb(){for(var t=0,e=this.props,r="matrix3d(";t<16;)r+=Oa(1e4*e[t])/1e4,r+=15===t?")":",",t+=1;return r}function nb(t){return t<1e-6&&0<t||-1e-6<t&&t<0?Oa(1e4*t)/1e4:t}function pb(){var t=this.props;return"matrix("+nb(t[0])+","+nb(t[1])+","+nb(t[4])+","+nb(t[5])+","+nb(t[12])+","+nb(t[13])+")"}!function(o,h){var p,l=this,m=256,f=6,c="random",d=h.pow(m,f),u=h.pow(2,52),y=2*u,g=m-1;function v(t){var e,r=t.length,n=this,i=0,s=n.i=n.j=0,a=n.S=[];for(r||(t=[r++]);i<m;)a[i]=i++;for(i=0;i<m;i++)a[i]=a[s=g&s+t[i%r]+(e=a[i])],a[s]=e;n.g=function(t){for(var e,r=0,i=n.i,s=n.j,a=n.S;t--;)e=a[i=g&i+1],r=r*m+a[g&(a[i]=a[s=g&s+e])+(a[s]=e)];return n.i=i,n.j=s,r}}function P(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function b(t,e){for(var r,i=t+"",s=0;s<i.length;)e[g&s]=g&(r^=19*e[g&s])+i.charCodeAt(s++);return x(e)}function x(t){return String.fromCharCode.apply(0,t)}h["seed"+c]=function(t,e,r){function i(){for(var t=n.g(f),e=d,r=0;t<u;)t=(t+r)*m,e*=m,r=n.g(1);for(;y<=t;)t/=2,e/=2,r>>>=1;return(t+r)/e}var s=[],a=b(function t(e,r){var i,s=[],a=typeof e;if(r&&"object"==a)for(i in e)try{s.push(t(e[i],r-1))}catch(t){}return s.length?s:"string"==a?e:e+"\0"}((e=!0===e?{entropy:!0}:e||{}).entropy?[t,x(o)]:null===t?function(){try{if(p)return x(p.randomBytes(m));var t=new Uint8Array(m);return(l.crypto||l.msCrypto).getRandomValues(t),x(t)}catch(t){var e=l.navigator,r=e&&e.plugins;return[+new Date,l,r,l.screen,x(o)]}}():t,3),s),n=new v(s);return i.int32=function(){return 0|n.g(4)},i.quick=function(){return n.g(4)/4294967296},i.double=i,b(x(n.S),o),(e.pass||r||function(t,e,r,i){return i&&(i.S&&P(i,n),t.state=function(){return P(n,{})}),r?(h[c]=t,e):t})(i,a,"global"in e?e.global:this==h,e.state)},b(h.random(),o)}([],BMMath);var BezierFactory=(_e={getBezierEasing:function(t,e,r,i,s){var a=s||("bez_"+t+"_"+e+"_"+r+"_"+i).replace(/\./g,"p");if(af[a])return af[a];var n=new rf([t,e,r,i]);return af[a]=n}},af={},gf=11,hf=1/(gf-1),jf="function"==typeof Float32Array,rf.prototype={get:function(t){var e=this._p[0],r=this._p[1],i=this._p[2],s=this._p[3];return this._precomputed||this._precompute(),e===r&&i===s?t:0===t?0:1===t?1:nf(this._getTForX(t),r,s)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],i=this._p[3];this._precomputed=!0,t===e&&r===i||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<gf;++r)this._mSampleValues[r]=nf(r*hf,t,e)},_getTForX:function(t){for(var e=this._p[0],r=this._p[2],i=this._mSampleValues,s=0,a=1,n=gf-1;a!==n&&i[a]<=t;++a)s+=hf;var o=s+(t-i[--a])/(i[a+1]-i[a])*hf,h=of(o,e,r);return.001<=h?function(t,e,r,i){for(var s=0;s<4;++s){var a=of(e,r,i);if(0===a)return e;e-=(nf(e,r,i)-t)/a}return e}(t,o,e,r):0===h?o:function(t,e,r,i,s){for(var a,n,o=0;0<(a=nf(n=e+(r-e)/2,i,s)-t)?r=n:e=n,1e-7<Math.abs(a)&&++o<10;);return n}(t,s,s+hf,e,r)}},_e),_e,af,gf,hf,jf;function kf(t,e){return 1-3*e+3*t}function lf(t,e){return 3*e-6*t}function mf(t){return 3*t}function nf(t,e,r){return((kf(e,r)*t+lf(e,r))*t+mf(e))*t}function of(t,e,r){return 3*kf(e,r)*t*t+2*lf(e,r)*t+mf(e)}function rf(t){this._p=t,this._mSampleValues=jf?new Float32Array(gf):new Array(gf),this._precomputed=!1,this.get=this.get.bind(this)}function extendPrototype(t,e){var r,i,s=t.length;for(r=0;r<s;r+=1)for(var a in i=t[r].prototype)i.hasOwnProperty(a)&&(e.prototype[a]=i[a])}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function createProxyFunction(t){function e(){}return e.prototype=t,e}function bezFunction(){Math;function y(t,e,r,i,s,a){var n=t*i+e*s+r*a-s*i-a*t-r*e;return-.001<n&&n<.001}var l=function(t,e,r,i){var s,a,n,o,h,p,l=defaultCurveSegments,m=0,f=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,s=0;s<l;s+=1){for(h=s/(l-1),a=p=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*i[a]+bm_pow(h,3)*e[a],f[a]=o,null!==c[a]&&(p+=bm_pow(f[a]-c[a],2)),c[a]=f[a];p&&(m+=p=bm_sqrt(p)),d.percents[s]=h,d.lengths[s]=m}return d.addedLength=m,d};function g(t){this.segmentLength=0,this.points=new Array(t)}function v(t,e){this.partialLength=t,this.point=e}var P,t=(P={},function(t,e,r,i){var s=(t[0]+"_"+t[1]+"_"+e[0]+"_"+e[1]+"_"+r[0]+"_"+r[1]+"_"+i[0]+"_"+i[1]).replace(/\./g,"p");if(!P[s]){var a,n,o,h,p,l,m,f=defaultCurveSegments,c=0,d=null;2===t.length&&(t[0]!=e[0]||t[1]!=e[1])&&y(t[0],t[1],e[0],e[1],t[0]+r[0],t[1]+r[1])&&y(t[0],t[1],e[0],e[1],e[0]+i[0],e[1]+i[1])&&(f=2);var u=new g(f);for(o=r.length,a=0;a<f;a+=1){for(m=createSizedArray(o),p=a/(f-1),n=l=0;n<o;n+=1)h=bm_pow(1-p,3)*t[n]+3*bm_pow(1-p,2)*p*(t[n]+r[n])+3*(1-p)*bm_pow(p,2)*(e[n]+i[n])+bm_pow(p,3)*e[n],m[n]=h,null!==d&&(l+=bm_pow(m[n]-d[n],2));c+=l=bm_sqrt(l),u.points[a]=new v(l,m),d=m}u.segmentLength=c,P[s]=u}return P[s]});function D(t,e){var r=e.percents,i=e.lengths,s=r.length,a=bm_floor((s-1)*t),n=t*e.addedLength,o=0;if(a===s-1||0===a||n===i[a])return r[a];for(var h=i[a]>n?-1:1,p=!0;p;)if(i[a]<=n&&i[a+1]>n?(o=(n-i[a])/(i[a+1]-i[a]),p=!1):a+=h,a<0||s-1<=a){if(a===s-1)return r[a];p=!1}return r[a]+(r[a+1]-r[a])*o}var M=createTypedArray("float32",8);return{getSegmentsLength:function(t){var e,r=segments_length_pool.newElement(),i=t.c,s=t.v,a=t.o,n=t.i,o=t._length,h=r.lengths,p=0;for(e=0;e<o-1;e+=1)h[e]=l(s[e],s[e+1],a[e],n[e+1]),p+=h[e].addedLength;return i&&o&&(h[e]=l(s[e],s[0],a[e],n[0]),p+=h[e].addedLength),r.totalLength=p,r},getNewSegment:function(t,e,r,i,s,a,n){var o,h=D(s=s<0?0:1<s?1:s,n),p=D(a=1<a?1:a,n),l=t.length,m=1-h,f=1-p,c=m*m*m,d=h*m*m*3,u=h*h*m*3,y=h*h*h,g=m*m*f,v=h*m*f+m*h*f+m*m*p,P=h*h*f+m*h*p+h*m*p,b=h*h*p,x=m*f*f,_=h*f*f+m*p*f+m*f*p,S=h*p*f+m*p*p+h*f*p,T=h*p*p,A=f*f*f,C=p*f*f+f*p*f+f*f*p,E=p*p*f+f*p*p+p*f*p,k=p*p*p;for(o=0;o<l;o+=1)M[4*o]=Math.round(1e3*(c*t[o]+d*r[o]+u*i[o]+y*e[o]))/1e3,M[4*o+1]=Math.round(1e3*(g*t[o]+v*r[o]+P*i[o]+b*e[o]))/1e3,M[4*o+2]=Math.round(1e3*(x*t[o]+_*r[o]+S*i[o]+T*e[o]))/1e3,M[4*o+3]=Math.round(1e3*(A*t[o]+C*r[o]+E*i[o]+k*e[o]))/1e3;return M},getPointInSegment:function(t,e,r,i,s,a){var n=D(s,a),o=1-n;return[Math.round(1e3*(o*o*o*t[0]+(n*o*o+o*n*o+o*o*n)*r[0]+(n*n*o+o*n*n+n*o*n)*i[0]+n*n*n*e[0]))/1e3,Math.round(1e3*(o*o*o*t[1]+(n*o*o+o*n*o+o*o*n)*r[1]+(n*n*o+o*n*n+n*o*n)*i[1]+n*n*n*e[1]))/1e3]},buildBezierData:t,pointOnLine2D:y,pointOnLine3D:function(t,e,r,i,s,a,n,o,h){if(0===r&&0===a&&0===h)return y(t,e,i,s,n,o);var p,l=Math.sqrt(Math.pow(i-t,2)+Math.pow(s-e,2)+Math.pow(a-r,2)),m=Math.sqrt(Math.pow(n-t,2)+Math.pow(o-e,2)+Math.pow(h-r,2)),f=Math.sqrt(Math.pow(n-i,2)+Math.pow(o-s,2)+Math.pow(h-a,2));return-1e-4<(p=m<l?f<l?l-m-f:f-m-l:m<f?f-m-l:m-l-f)&&p<1e-4}}}!function(){for(var a=0,t=["ms","moz","webkit","o"],e=0;e<t.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[t[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[e]+"CancelAnimationFrame"]||window[t[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t,e){var r=(new Date).getTime(),i=Math.max(0,16-(r-a)),s=setTimeout(function(){t(r+i)},i);return a=r+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction();function dataFunctionManager(){function m(t,e,r){var i,s,a,n,o,h,p=t.length;for(s=0;s<p;s+=1)if("ks"in(i=t[s])&&!i.completed){if(i.completed=!0,i.tt&&(t[s-1].td=i.tt),[],-1,i.hasMask){var l=i.masksProperties;for(n=l.length,a=0;a<n;a+=1)if(l[a].pt.k.i)d(l[a].pt.k);else for(h=l[a].pt.k.length,o=0;o<h;o+=1)l[a].pt.k[o].s&&d(l[a].pt.k[o].s[0]),l[a].pt.k[o].e&&d(l[a].pt.k[o].e[0])}0===i.ty?(i.layers=f(i.refId,e),m(i.layers,e,r)):4===i.ty?c(i.shapes):5==i.ty&&b(i,r)}}function f(t,e){for(var r=0,i=e.length;r<i;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function c(t){var e,r,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)d(t[e].ks.k);else for(i=t[e].ks.k.length,r=0;r<i;r+=1)t[e].ks.k[r].s&&d(t[e].ks.k[r].s[0]),t[e].ks.k[r].e&&d(t[e].ks.k[r].e[0]);!0}else"gr"==t[e].ty&&c(t[e].it)}function d(t){var e,r=t.i.length;for(e=0;e<r;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function o(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}var i,r=(i=[4,4,14],function(t){if(o(i,t.v)&&(s(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&s(t.assets[e].layers)}});function s(t){var e,r,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(r=t[e],void 0,i=r.t.d,r.t.d={k:[{s:i,t:0}]})}var h,a,n=(h=[4,7,99],function(t){if(t.chars&&!o(h,t.v)){var e,r,i,s,a,n=t.chars.length;for(e=0;e<n;e+=1)if(t.chars[e].data&&t.chars[e].data.shapes)for(i=(a=t.chars[e].data.shapes[0].it).length,r=0;r<i;r+=1)(s=a[r].ks.k).__converted||(d(a[r].ks.k),s.__converted=!0)}}),p=(a=[4,1,9],function(t){if(o(a,t.v)&&(u(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&u(t.assets[e].layers)}});function l(t){var e,r,i,s=t.length;for(e=0;e<s;e+=1)if("gr"===t[e].ty)l(t[e].it);else if("fl"===t[e].ty||"st"===t[e].ty)if(t[e].c.k&&t[e].c.k[0].i)for(i=t[e].c.k.length,r=0;r<i;r+=1)t[e].c.k[r].s&&(t[e].c.k[r].s[0]/=255,t[e].c.k[r].s[1]/=255,t[e].c.k[r].s[2]/=255,t[e].c.k[r].s[3]/=255),t[e].c.k[r].e&&(t[e].c.k[r].e[0]/=255,t[e].c.k[r].e[1]/=255,t[e].c.k[r].e[2]/=255,t[e].c.k[r].e[3]/=255);else t[e].c.k[0]/=255,t[e].c.k[1]/=255,t[e].c.k[2]/=255,t[e].c.k[3]/=255}function u(t){var e,r=t.length;for(e=0;e<r;e+=1)4===t[e].ty&&l(t[e].shapes)}var y,g=(y=[4,4,18],function(t){if(o(y,t.v)&&(P(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&P(t.assets[e].layers)}});function v(t){var e,r,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)t[e].ks.k.c=t[e].closed;else for(i=t[e].ks.k.length,r=0;r<i;r+=1)t[e].ks.k[r].s&&(t[e].ks.k[r].s[0].c=t[e].closed),t[e].ks.k[r].e&&(t[e].ks.k[r].e[0].c=t[e].closed);!0}else"gr"==t[e].ty&&v(t[e].it)}function P(t){var e,r,i,s,a,n,o=t.length;for(r=0;r<o;r+=1){if((e=t[r]).hasMask){var h=e.masksProperties;for(s=h.length,i=0;i<s;i+=1)if(h[i].pt.k.i)h[i].pt.k.c=h[i].cl;else for(n=h[i].pt.k.length,a=0;a<n;a+=1)h[i].pt.k[a].s&&(h[i].pt.k[a].s[0].c=h[i].cl),h[i].pt.k[a].e&&(h[i].pt.k[a].e[0].c=h[i].cl)}4===e.ty&&v(e.shapes)}}function b(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var t={completeData:function(t,e){t.__complete||(p(t),r(t),n(t),g(t),m(t.layers,t.assets,e),t.__complete=!0)}};return t.checkColors=p,t.checkChars=n,t.checkShapes=g,t.completeLayers=m,t}var dataManager=dataFunctionManager();dataManager.completeData=function(t,e){t.__complete||(this.checkColors(t),this.checkChars(t),this.checkShapes(t),this.completeLayers(t.layers,t.assets,e),t.__complete=!0)};var FontManager=function(){var a={w:0,size:0,shapes:[]},t=[];function u(t,e){var r=createTag("span");r.style.fontFamily=e;var i=createTag("span");i.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(i),document.body.appendChild(r);var s=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:s,parent:r}}t=t.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);function e(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()}return e.getCombinedCharacterCodes=function(){return t},e.prototype.addChars=function(t){if(t){this.chars||(this.chars=[]);var e,r,i,s=t.length,a=this.chars.length;for(e=0;e<s;e+=1){for(r=0,i=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(i=!0),r+=1;i||(this.chars.push(t[e]),a+=1)}}},e.prototype.addFonts=function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);var r,i,s,a,n=t.list,o=n.length,h=o;for(r=0;r<o;r+=1){var p,l,m=!0;if(n[r].loaded=!1,n[r].monoCase=u(n[r].fFamily,"monospace"),n[r].sansCase=u(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){if(0<(p=document.querySelectorAll('style[f-forigin="p"][f-family="'+n[r].fFamily+'"], style[f-origin="3"][f-family="'+n[r].fFamily+'"]')).length&&(m=!1),m){var f=createTag("style");f.setAttribute("f-forigin",n[r].fOrigin),f.setAttribute("f-origin",n[r].origin),f.setAttribute("f-family",n[r].fFamily),f.type="text/css",f.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",e.appendChild(f)}}else if("g"===n[r].fOrigin||1===n[r].origin){for(p=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),l=0;l<p.length;l++)-1!==p[l].href.indexOf(n[r].fPath)&&(m=!1);if(m){var c=createTag("link");c.setAttribute("f-forigin",n[r].fOrigin),c.setAttribute("f-origin",n[r].origin),c.type="text/css",c.rel="stylesheet",c.href=n[r].fPath,document.body.appendChild(c)}}else if("t"===n[r].fOrigin||2===n[r].origin){for(p=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),l=0;l<p.length;l++)n[r].fPath===p[l].src&&(m=!1);if(m){var d=createTag("link");d.setAttribute("f-forigin",n[r].fOrigin),d.setAttribute("f-origin",n[r].origin),d.setAttribute("rel","stylesheet"),d.setAttribute("href",n[r].fPath),e.appendChild(d)}}}else n[r].loaded=!0,h-=1;n[r].helper=(i=e,s=n[r],a=void 0,(a=createNS("text")).style.fontSize="100px",a.setAttribute("font-family",s.fFamily),a.setAttribute("font-style",s.fStyle),a.setAttribute("font-weight",s.fWeight),a.textContent="1",s.fClass?(a.style.fontFamily="inherit",a.setAttribute("class",s.fClass)):a.style.fontFamily=s.fFamily,i.appendChild(a),createTag("canvas").getContext("2d").font=s.fWeight+" "+s.fStyle+" 100px "+s.fFamily,a),n[r].cache={},this.fonts.push(n[r])}0===h?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},e.prototype.getCharData=function(t,e,r){for(var i=0,s=this.chars.length;i<s;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===r)return this.chars[i];i+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,r),a},e.prototype.getFontByName=function(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},e.prototype.measureText=function(t,e,r){var i=this.getFontByName(e),s=t.charCodeAt(0);if(!i.cache[s+1]){var a=i.helper;if(" "===t){a.textContent="|"+t+"|";var n=a.getComputedTextLength();a.textContent="||";var o=a.getComputedTextLength();i.cache[s+1]=(n-o)/100}else a.textContent=t,i.cache[s+1]=a.getComputedTextLength()/100}return i.cache[s+1]*r},e.prototype.checkLoadedFonts=function(){var t,e,r,i=this.fonts.length,s=i;for(t=0;t<i;t+=1)this.fonts[t].loaded?s-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,r=this.fonts[t].monoCase.w,e.offsetWidth!==r?(s-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,r=this.fonts[t].sansCase.w,e.offsetWidth!==r&&(s-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==s&&Date.now()-this.initTime<5e3?setTimeout(this.checkLoadedFonts.bind(this),20):setTimeout(function(){this.isLoaded=!0}.bind(this),0)},e.prototype.loaded=function(){return this.isLoaded},e}();FontManager=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()};var PropertyFactory=(km=initialDefaultFrame,lm=Math.abs,{getProp:function(t,e,r,i,s){var a;if(e.k.length)if("number"==typeof e.k[0])a=new vm(t,e,i,s);else switch(r){case 0:a=new wm(t,e,i,s);break;case 1:a=new xm(t,e,i,s)}else a=new um(t,e,i,s);return a.effectsSequence.length&&s.addDynamicProperty(a),a}}),km,lm;function mm(t,e){var r,i=this.offsetTime;"multidimensional"===this.propType&&(r=createTypedArray("float32",this.pv.length));for(var s,a,n,o,h,p,l,m,f=e.lastIndex,c=f,d=this.keyframes.length-1,u=!0;u;){if(s=this.keyframes[c],a=this.keyframes[c+1],c===d-1&&t>=a.t-i){s.h&&(s=a),f=0;break}if(a.t-i>t){f=c;break}c<d-1?c+=1:(f=0,u=!1)}var y,g=a.t-i,v=s.t-i;if(s.to){s.bezierData||(s.bezierData=bez.buildBezierData(s.s,a.s||s.e,s.to,s.ti));var P=s.bezierData;if(g<=t||t<v){var b=g<=t?P.points.length-1:0;for(o=P.points[b].point.length,n=0;n<o;n+=1)r[n]=P.points[b].point[n]}else{s.__fnct?m=s.__fnct:(m=BezierFactory.getBezierEasing(s.o.x,s.o.y,s.i.x,s.i.y,s.n).get,s.__fnct=m),h=m((t-v)/(g-v));var x,_=P.segmentLength*h,S=e.lastFrame<t&&e._lastKeyframeIndex===c?e._lastAddedLength:0;for(l=e.lastFrame<t&&e._lastKeyframeIndex===c?e._lastPoint:0,u=!0,p=P.points.length;u;){if(S+=P.points[l].partialLength,0==_||0===h||l===P.points.length-1){for(o=P.points[l].point.length,n=0;n<o;n+=1)r[n]=P.points[l].point[n];break}if(S<=_&&_<S+P.points[l+1].partialLength){for(x=(_-S)/P.points[l+1].partialLength,o=P.points[l].point.length,n=0;n<o;n+=1)r[n]=P.points[l].point[n]+(P.points[l+1].point[n]-P.points[l].point[n])*x;break}l<p-1?l+=1:u=!1}e._lastPoint=l,e._lastAddedLength=S-P.points[l].partialLength,e._lastKeyframeIndex=c}}else{var T,A,C,E,k;if(d=s.s.length,y=a.s||s.e,this.sh&&1!==s.h)if(g<=t)r[0]=y[0],r[1]=y[1],r[2]=y[2];else if(t<=v)r[0]=s.s[0],r[1]=s.s[1],r[2]=s.s[2];else{!function(t,e){var r=e[0],i=e[1],s=e[2],a=e[3],n=Math.atan2(2*i*a-2*r*s,1-2*i*i-2*s*s),o=Math.asin(2*r*i+2*s*a),h=Math.atan2(2*r*a-2*i*s,1-2*r*r-2*s*s);t[0]=n/degToRads,t[1]=o/degToRads,t[2]=h/degToRads}(r,function(t,e,r){var i,s,a,n,o,h=[],p=t[0],l=t[1],m=t[2],f=t[3],c=e[0],d=e[1],u=e[2],y=e[3];(s=p*c+l*d+m*u+f*y)<0&&(s=-s,c=-c,d=-d,u=-u,y=-y);o=1e-6<1-s?(i=Math.acos(s),a=Math.sin(i),n=Math.sin((1-r)*i)/a,Math.sin(r*i)/a):(n=1-r,r);return h[0]=n*p+o*c,h[1]=n*l+o*d,h[2]=n*m+o*u,h[3]=n*f+o*y,h}(pm(s.s),pm(y),(t-v)/(g-v)))}else for(c=0;c<d;c+=1)1!==s.h&&(h=g<=t?1:t<v?0:(s.o.x.constructor===Array?(s.__fnct||(s.__fnct=[]),s.__fnct[c]?m=s.__fnct[c]:(T=void 0===s.o.x[c]?s.o.x[0]:s.o.x[c],A=void 0===s.o.y[c]?s.o.y[0]:s.o.y[c],C=void 0===s.i.x[c]?s.i.x[0]:s.i.x[c],E=void 0===s.i.y[c]?s.i.y[0]:s.i.y[c],m=BezierFactory.getBezierEasing(T,A,C,E).get,s.__fnct[c]=m)):s.__fnct?m=s.__fnct:(T=s.o.x,A=s.o.y,C=s.i.x,E=s.i.y,m=BezierFactory.getBezierEasing(T,A,C,E).get,s.__fnct=m),m((t-v)/(g-v)))),y=a.s||s.e,k=1===s.h?s.s[c]:s.s[c]+(y[c]-s.s[c])*h,1===d?r=k:r[c]=k}return e.lastIndex=f,r}function pm(t){var e=t[0]*degToRads,r=t[1]*degToRads,i=t[2]*degToRads,s=Math.cos(e/2),a=Math.cos(r/2),n=Math.cos(i/2),o=Math.sin(e/2),h=Math.sin(r/2),p=Math.sin(i/2);return[o*h*n+s*a*p,o*a*n+s*h*p,s*h*n-o*a*p,s*a*n-o*h*p]}function qm(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==km&&(this._caching.lastFrame>=r&&r<=t||this._caching.lastFrame<e&&t<e))){this._caching.lastFrame>=t&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var i=this.interpolateValue(t,this._caching);this.pv=i}return this._caching.lastFrame=t,this.pv}function rm(t){var e;if("unidimensional"===this.propType)e=t*this.mult,1e-5<lm(this.v-e)&&(this.v=e,this._mdf=!0);else for(var r=0,i=this.v.length;r<i;)e=t[r]*this.mult,1e-5<lm(this.v[r]-e)&&(this.v[r]=e,this._mdf=!0),r+=1}function sm(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=this._isFirstFrame;var t,e=this.effectsSequence.length,r=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)r=this.effectsSequence[t](r);this.setVValue(r),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function tm(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function um(t,e,r,i){this.propType="unidimensional",this.mult=r||1,this.data=e,this.v=r?e.k*r:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=sm,this.setVValue=rm,this.addEffect=tm}function vm(t,e,r,i){this.propType="multidimensional",this.mult=r||1,this.data=e,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var s,a=e.k.length;this.v=createTypedArray("float32",a),this.pv=createTypedArray("float32",a);createTypedArray("float32",a);for(this.vel=createTypedArray("float32",a),s=0;s<a;s+=1)this.v[s]=e.k[s]*this.mult,this.pv[s]=e.k[s];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=sm,this.setVValue=rm,this.addEffect=tm}function wm(t,e,r,i){this.propType="unidimensional",this.keyframes=e.k,this.offsetTime=t.data.st,this.frameId=-1,this._caching={lastFrame:km,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=e,this.mult=r||1,this.elem=t,this.container=i,this.comp=t.comp,this.v=km,this.pv=km,this._isFirstFrame=!0,this.getValue=sm,this.setVValue=rm,this.interpolateValue=mm,this.effectsSequence=[qm.bind(this)],this.addEffect=tm}function xm(t,e,r,i){this.propType="multidimensional";var s,a,n,o,h,p=e.k.length;for(s=0;s<p-1;s+=1)e.k[s].to&&e.k[s].s&&e.k[s].e&&(a=e.k[s].s,n=e.k[s].e,o=e.k[s].to,h=e.k[s].ti,(2===a.length&&(a[0]!==n[0]||a[1]!==n[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])||3===a.length&&(a[0]!==n[0]||a[1]!==n[1]||a[2]!==n[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],a[0]+o[0],a[1]+o[1],a[2]+o[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],n[0]+h[0],n[1]+h[1],n[2]+h[2]))&&(e.k[s].to=null,e.k[s].ti=null),a[0]===n[0]&&a[1]===n[1]&&0===o[0]&&0===o[1]&&0===h[0]&&0===h[1]&&(2===a.length||a[2]===n[2]&&0===o[2]&&0===h[2])&&(e.k[s].to=null,e.k[s].ti=null));this.effectsSequence=[qm.bind(this)],this.keyframes=e.k,this.offsetTime=t.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=r||1,this.elem=t,this.container=i,this.comp=t.comp,this.getValue=sm,this.setVValue=rm,this.interpolateValue=mm,this.frameId=-1;var l=e.k[0].s.length;for(this.v=createTypedArray("float32",l),this.pv=createTypedArray("float32",l),s=0;s<l;s+=1)this.v[s]=km,this.pv[s]=km;this._caching={lastFrame:km,lastIndex:0,value:createTypedArray("float32",l)},this.addEffect=tm}var TransformPropertyFactory=(Qo.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(t){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||t){if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var e,r,i=this.elem.globalData.frameRate;if(this.p&&this.p.keyframes&&this.p.getValueAtTime)r=this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(e=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(e=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/i,0)):(e=this.p.pv,this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){e=[],r=[];var s=this.px,a=this.py;s._caching.lastFrame+s.offsetTime<=s.keyframes[0].t?(e[0]=s.getValueAtTime((s.keyframes[0].t+.01)/i,0),e[1]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),r[0]=s.getValueAtTime(s.keyframes[0].t/i,0),r[1]=a.getValueAtTime(a.keyframes[0].t/i,0)):s._caching.lastFrame+s.offsetTime>=s.keyframes[s.keyframes.length-1].t?(e[0]=s.getValueAtTime(s.keyframes[s.keyframes.length-1].t/i,0),e[1]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),r[0]=s.getValueAtTime((s.keyframes[s.keyframes.length-1].t-.01)/i,0),r[1]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0)):(e=[s.pv,a.pv],r[0]=s.getValueAtTime((s._caching.lastFrame+s.offsetTime-.01)/i,s.offsetTime),r[1]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime))}this.v.rotate(-Math.atan2(e[1]-r[1],e[0]-r[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}if(this.r){if(this.r.effectsSequence.length)return;this.pre.rotate(-this.r.v),this.appliedTransformations=4}else this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},extendPrototype([DynamicPropertyContainer],Qo),Qo.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},Qo.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty,{getTransformProperty:function(t,e,r){return new Qo(t,e,r)}});function Qo(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(r||t),e.p&&e.p.s?(this.px=PropertyFactory.getProp(t,e.p.x,0,0,this),this.py=PropertyFactory.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=PropertyFactory.getProp(t,e.p.z,0,0,this))):this.p=PropertyFactory.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=PropertyFactory.getProp(t,e.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(t,e.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(t,e.rz,0,degToRads,this),e.or.k[0].ti){var i,s=e.or.k.length;for(i=0;i<s;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=PropertyFactory.getProp(t,e.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(t,e.r||{k:0},0,degToRads,this);e.sk&&(this.sk=PropertyFactory.getProp(t,e.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(t,e.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=PropertyFactory.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}function ShapePath(){this.c=!1,this._length=0,this._maxLength=8,this.v=createSizedArray(this._maxLength),this.o=createSizedArray(this._maxLength),this.i=createSizedArray(this._maxLength)}ShapePath.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},ShapePath.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},ShapePath.prototype.doubleArrayLength=function(){this.v=this.v.concat(createSizedArray(this._maxLength)),this.i=this.i.concat(createSizedArray(this._maxLength)),this.o=this.o.concat(createSizedArray(this._maxLength)),this._maxLength*=2},ShapePath.prototype.setXYAt=function(t,e,r,i,s){var a;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}a[i]&&(!a[i]||s)||(a[i]=point_pool.newElement()),a[i][0]=t,a[i][1]=e},ShapePath.prototype.setTripleAt=function(t,e,r,i,s,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(r,i,"o",n,o),this.setXYAt(s,a,"i",n,o)},ShapePath.prototype.reverse=function(){var t=new ShapePath;t.setPathData(this.c,this._length);var e=this.v,r=this.o,i=this.i,s=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],r[0][0],r[0][1],0,!1),s=1);var a,n=this._length-1,o=this._length;for(a=s;a<o;a+=1)t.setTripleAt(e[n][0],e[n][1],i[n][0],i[n][1],r[n][0],r[n][1],a,!1),n-=1;return t};var ShapePropertyFactory=function(){var s=-999999;function t(t,e,r){var i,s,a,n,o,h,p,l,m,f=r.lastIndex,c=this.keyframes;if(t<c[0].t-this.offsetTime)i=c[0].s[0],a=!0,f=0;else if(t>=c[c.length-1].t-this.offsetTime)i=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var d,u,y=f,g=c.length-1,v=!0;v&&(d=c[y],!((u=c[y+1]).t-this.offsetTime>t));)y<g-1?y+=1:v=!1;if(f=y,!(a=1===d.h)){if(t>=u.t-this.offsetTime)l=1;else if(t<d.t-this.offsetTime)l=0;else{var P;d.__fnct?P=d.__fnct:(P=BezierFactory.getBezierEasing(d.o.x,d.o.y,d.i.x,d.i.y).get,d.__fnct=P),l=P((t-(d.t-this.offsetTime))/(u.t-this.offsetTime-(d.t-this.offsetTime)))}s=u.s?u.s[0]:d.e[0]}i=d.s[0]}for(h=e._length,p=i.i[0].length,r.lastIndex=f,n=0;n<h;n+=1)for(o=0;o<p;o+=1)m=a?i.i[n][o]:i.i[n][o]+(s.i[n][o]-i.i[n][o])*l,e.i[n][o]=m,m=a?i.o[n][o]:i.o[n][o]+(s.o[n][o]-i.o[n][o])*l,e.o[n][o]=m,m=a?i.v[n][o]:i.v[n][o]+(s.v[n][o]-i.v[n][o])*l,e.v[n][o]=m}function a(){this.paths=this.localShapeCollection}function e(t){!function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,i=t._length;for(r=0;r<i;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0}(this.v,t)&&(this.v=shape_pool.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function r(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=!1;var t,e=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k,r=this.effectsSequence.length;for(t=0;t<r;t+=1)e=this.effectsSequence[t](e);this.setVValue(e),this.lock=!1,this.frameId=this.elem.globalData.frameId}}function n(t,e,r){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var i=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(i),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=a,this.effectsSequence=[]}function i(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function o(t,e,r){this.propType="shape",this.comp=t.comp,this.elem=t,this.container=t,this.offsetTime=t.data.st,this.keyframes=3===r?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=s,this.reset=a,this._caching={lastFrame:s,lastIndex:0},this.effectsSequence=[function(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime,i=this._caching.lastFrame;return i!==s&&(i<e&&t<e||r<i&&r<t)||(this._caching.lastIndex=i<t?this._caching.lastIndex:0,this.interpolateShape(t,this.pv,this._caching)),this._caching.lastFrame=t,this.pv}.bind(this)]}n.prototype.interpolateShape=t,n.prototype.getValue=r,n.prototype.setVValue=e,n.prototype.addEffect=i,o.prototype.getValue=r,o.prototype.interpolateShape=t,o.prototype.setVValue=e,o.prototype.addEffect=i;var h,p=(h=roundCorner,l.prototype={reset:a,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,i=this.s.v[1]/2,s=3!==this.d,a=this.v;a.v[0][0]=t,a.v[0][1]=e-i,a.v[1][0]=s?t+r:t-r,a.v[1][1]=e,a.v[2][0]=t,a.v[2][1]=e+i,a.v[3][0]=s?t-r:t+r,a.v[3][1]=e,a.i[0][0]=s?t-r*h:t+r*h,a.i[0][1]=e-i,a.i[1][0]=s?t+r:t-r,a.i[1][1]=e-i*h,a.i[2][0]=s?t+r*h:t-r*h,a.i[2][1]=e+i,a.i[3][0]=s?t-r:t+r,a.i[3][1]=e+i*h,a.o[0][0]=s?t+r*h:t-r*h,a.o[0][1]=e-i,a.o[1][0]=s?t+r:t-r,a.o[1][1]=e+i*h,a.o[2][0]=s?t-r*h:t+r*h,a.o[2][1]=e+i,a.o[3][0]=s?t-r:t+r,a.o[3][1]=e-i*h}},extendPrototype([DynamicPropertyContainer],l),l);function l(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}var m=(f.prototype={reset:a,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,r,i,s=2*Math.floor(this.pt.v),a=2*Math.PI/s,n=!0,o=this.or.v,h=this.ir.v,p=this.os.v,l=this.is.v,m=2*Math.PI*o/(2*s),f=2*Math.PI*h/(2*s),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(t=this.v._length=0;t<s;t+=1){r=n?p:l,i=n?m:f;var u=(e=n?o:h)*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.setTripleAt(u,y,u-g*i*r*d,y-v*i*r*d,u+g*i*r*d,y+v*i*r*d,t,!0),n=!n,c+=a*d}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,i=this.or.v,s=this.os.v,a=2*Math.PI*i/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,t=this.v._length=0;t<e;t+=1){var h=i*Math.cos(n),p=i*Math.sin(n),l=0===h&&0===p?0:p/Math.sqrt(h*h+p*p),m=0===h&&0===p?0:-h/Math.sqrt(h*h+p*p);h+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(h,p,h-l*a*s*o,p-m*a*s*o,h+l*a*s*o,p+m*a*s*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}},extendPrototype([DynamicPropertyContainer],f),f);function f(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=PropertyFactory.getProp(t,e.ir,0,0,this),this.is=PropertyFactory.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=PropertyFactory.getProp(t,e.pt,0,0,this),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,degToRads,this),this.or=PropertyFactory.getProp(t,e.or,0,0,this),this.os=PropertyFactory.getProp(t,e.os,0,.01,this),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}var c=(d.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,i=this.s.v[1]/2,s=bm_min(r,i,this.r.v),a=s*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+s,t+r,e-i+a,0,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-a,t+r,e+i-s,1,!0),0!==s?(this.v.setTripleAt(t+r-s,e+i,t+r-s,e+i,t+r-a,e+i,2,!0),this.v.setTripleAt(t-r+s,e+i,t-r+a,e+i,t-r+s,e+i,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-s,t-r,e+i-a,4,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+a,t-r,e-i+s,5,!0),this.v.setTripleAt(t-r+s,e-i,t-r+s,e-i,t-r+a,e-i,6,!0),this.v.setTripleAt(t+r-s,e-i,t+r-a,e-i,t+r-s,e-i,7,!0)):(this.v.setTripleAt(t-r,e+i,t-r+a,e+i,t-r,e+i,2),this.v.setTripleAt(t-r,e-i,t-r,e-i+a,t-r,e-i,3))):(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+a,t+r,e-i+s,0,!0),0!==s?(this.v.setTripleAt(t+r-s,e-i,t+r-s,e-i,t+r-a,e-i,1,!0),this.v.setTripleAt(t-r+s,e-i,t-r+a,e-i,t-r+s,e-i,2,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+s,t-r,e-i+a,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-a,t-r,e+i-s,4,!0),this.v.setTripleAt(t-r+s,e+i,t-r+s,e+i,t-r+a,e+i,5,!0),this.v.setTripleAt(t+r-s,e+i,t+r-a,e+i,t+r-s,e+i,6,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-s,t+r,e+i-a,7,!0)):(this.v.setTripleAt(t-r,e-i,t-r+a,e-i,t-r,e-i,1,!0),this.v.setTripleAt(t-r,e+i,t-r,e+i-a,t-r,e+i,2,!0),this.v.setTripleAt(t+r,e+i,t+r-a,e+i,t+r,e+i,3,!0)))},getValue:function(t){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:a},extendPrototype([DynamicPropertyContainer],d),d);function d(t,e){this.v=shape_pool.newElement(),this.v.c=!0,this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}var u={getShapeProp:function(t,e,r){var i;return 3===r||4===r?i=(3===r?e.pt:e.ks).k.length?new o(t,e,r):new n(t,e,r):5===r?i=new c(t,e):6===r?i=new p(t,e):7===r&&(i=new m(t,e)),i.k&&t.addDynamicProperty(i),i},getConstructorFunction:function(){return n},getKeyframedConstructorFunction:function(){return o}};return u}(),ShapeModifiers=(Tr={},Ur={},Tr.registerModifier=function(t,e){Ur[t]||(Ur[t]=e)},Tr.getModifier=function(t,e,r){return new Ur[t](e,r)},Tr),Tr,Ur;function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function RepeaterModifier(){}function ShapeCollection(){this._length=0,this._maxLength=4,this.shapes=createSizedArray(this._maxLength)}function DashProperty(t,e,r,i){this.elem=t,this.frameId=-1,this.dataProps=createSizedArray(e.length),this.renderer=r,this.k=!1,this.dashStr="",this.dashArray=createTypedArray("float32",e.length?e.length-1:0),this.dashoffset=createTypedArray("float32",1),this.initDynamicPropertyContainer(i);var s,a,n=e.length||0;for(s=0;s<n;s+=1)a=PropertyFactory.getProp(t,e[s].v,0,0,this),this.k=a.k||this.k,this.dataProps[s]={n:e[s].n,p:a};this.k||this.getValue(!0),this._isAnimated=this.k}function GradientProperty(t,e,r){this.data=e,this.c=createTypedArray("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=createTypedArray("float32",i),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.initDynamicPropertyContainer(r),this.prop=PropertyFactory.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,localShapeCollection:shapeCollection_pool.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},ShapeModifier.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(t,e){this.s=PropertyFactory.getProp(t,e.s,0,.01,this),this.e=PropertyFactory.getProp(t,e.e,0,.01,this),this.o=PropertyFactory.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(t){t.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(t,e,r,i,s){var a=[];e<=1?a.push({s:t,e:e}):1<=t?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],p=a.length;for(n=0;n<p;n+=1){var l,m;if((o=a[n]).e*s<i||o.s*s>i+r);else l=o.s*s<=i?0:(o.s*s-i)/r,m=o.e*s>=i+r?1:(o.e*s-i)/r,h.push([l,m])}return h.length||h.push([0,0]),h},TrimModifier.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},TrimModifier.prototype.processShapes=function(t){var e,r,i;if(this._mdf||t){var s=this.o.v%360/360;if(s<0&&(s+=1),e=(1<this.s.v?1:this.s.v<0?0:this.s.v)+s,(r=(1<this.e.v?1:this.e.v<0?0:this.e.v)+s)<e){var a=e;e=r,r=a}e=1e-4*Math.round(1e4*e),r=1e-4*Math.round(1e4*r),this.sValue=e,this.eValue=r}else e=this.sValue,r=this.eValue;var n,o,h,p,l,m,f=this.shapes.length,c=0;if(r===e)for(n=0;n<f;n+=1)this.shapes[n].localShapeCollection.releaseShapes(),this.shapes[n].shape._mdf=!0,this.shapes[n].shape.paths=this.shapes[n].localShapeCollection;else if(1===r&&0===e||0===r&&1===e){if(this._mdf)for(n=0;n<f;n+=1)this.shapes[n].pathsData.length=0,this.shapes[n].shape._mdf=!0}else{var d,u,y=[];for(n=0;n<f;n+=1)if((d=this.shapes[n]).shape._mdf||this._mdf||t||2===this.m){if(h=(i=d.shape.paths)._length,m=0,!d.shape._mdf&&d.pathsData.length)m=d.totalShapeLength;else{for(p=this.releasePathsData(d.pathsData),o=0;o<h;o+=1)l=bez.getSegmentsLength(i.shapes[o]),p.push(l),m+=l.totalLength;d.totalShapeLength=m,d.pathsData=p}c+=m,d.shape._mdf=!0}else d.shape.paths=d.localShapeCollection;var g,v=e,P=r,b=0;for(n=f-1;0<=n;n-=1)if((d=this.shapes[n]).shape._mdf){for((u=d.localShapeCollection).releaseShapes(),2===this.m&&1<f?(g=this.calculateShapeEdges(e,r,d.totalShapeLength,b,c),b+=d.totalShapeLength):g=[[v,P]],h=g.length,o=0;o<h;o+=1){v=g[o][0],P=g[o][1],y.length=0,P<=1?y.push({s:d.totalShapeLength*v,e:d.totalShapeLength*P}):1<=v?y.push({s:d.totalShapeLength*(v-1),e:d.totalShapeLength*(P-1)}):(y.push({s:d.totalShapeLength*v,e:d.totalShapeLength}),y.push({s:0,e:d.totalShapeLength*(P-1)}));var x=this.addShapes(d,y[0]);if(y[0].s!==y[0].e){if(1<y.length)if(d.shape.paths.shapes[d.shape.paths._length-1].c){var _=x.pop();this.addPaths(x,u),x=this.addShapes(d,y[1],_)}else this.addPaths(x,u),x=this.addShapes(d,y[1]);this.addPaths(x,u)}}d.shape.paths=u}}},TrimModifier.prototype.addPaths=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)e.addShape(t[r])},TrimModifier.prototype.addSegment=function(t,e,r,i,s,a,n){s.setXYAt(e[0],e[1],"o",a),s.setXYAt(r[0],r[1],"i",a+1),n&&s.setXYAt(t[0],t[1],"v",a),s.setXYAt(i[0],i[1],"v",a+1)},TrimModifier.prototype.addSegmentFromArray=function(t,e,r,i){e.setXYAt(t[1],t[5],"o",r),e.setXYAt(t[2],t[6],"i",r+1),i&&e.setXYAt(t[0],t[4],"v",r),e.setXYAt(t[3],t[7],"v",r+1)},TrimModifier.prototype.addShapes=function(t,e,r){var i,s,a,n,o,h,p,l,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(l=r?(o=r._length,r._length):(r=shape_pool.newElement(),o=0),u.push(r),i=0;i<c;i+=1){for(h=m[i].lengths,r.c=f[i].c,a=f[i].c?h.length:h.length+1,s=1;s<a;s+=1)if(d+(n=h[s-1]).addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[i].v[s-1],f[i].o[s-1],f[i].i[s],f[i].v[s],r,o,y),y=!1):(p=bez.getNewSegment(f[i].v[s-1],f[i].v[s],f[i].o[s-1],f[i].i[s],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(f[i].c&&h.length){if(n=h[s-1],d<=e.e){var g=h[s-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[i].v[s-1],f[i].o[s-1],f[i].i[0],f[i].v[0],r,o,y),y=!1):(p=bez.getNewSegment(f[i].v[s-1],f[i].v[0],f[i].o[s-1],f[i].i[0],(e.s-d)/g,(e.e-d)/g,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r.setXYAt(r.v[l][0],r.v[l][1],"i",l),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;i<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var i,s,a,n,o,h,p,l,m,f,c,d,u,y=t._length,g=0;for(i=0;i<y;i+=1)s=t.v[i],n=t.o[i],a=t.i[i],s[0]===n[0]&&s[1]===n[1]&&s[0]===a[0]&&s[1]===a[1]?0!==i&&i!==y-1||t.c?(o=0===i?t.v[y-1]:t.v[i-1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=d=s[0]+(o[0]-s[0])*p,m=u=s[1]-(s[1]-o[1])*p,f=l-(l-s[0])*roundCorner,c=m-(m-s[1])*roundCorner,r.setTripleAt(l,m,f,c,d,u,g),g+=1,o=i===y-1?t.v[0]:t.v[i+1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=f=s[0]+(o[0]-s[0])*p,m=c=s[1]+(o[1]-s[1])*p,d=l-(l-s[0])*roundCorner,u=m-(m-s[1])*roundCorner,r.setTripleAt(l,m,f,c,d,u,g)):r.setTripleAt(s[0],s[1],n[0],n[1],a[0],a[1],g):r.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],g),g+=1;return r},RoundCornersModifier.prototype.processShapes=function(t){var e,r,i,s,a,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(r=0;r<o;r+=1){if((a=this.shapes[r]).shape.paths,n=a.localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,s=a.shape.paths._length,i=0;i<s;i+=1)n.addShape(this.processPath(e[i],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier),extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(t,e.c,0,null,this),this.o=PropertyFactory.getProp(t,e.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(t,e.tr,this),this.so=PropertyFactory.getProp(t,e.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(t,e,r,i,s,a){var n=a?-1:1,o=i.s.v[0]+(1-i.s.v[0])*(1-s),h=i.s.v[1]+(1-i.s.v[1])*(1-s);t.translate(i.p.v[0]*n*s,i.p.v[1]*n*s,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*s),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),r.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(i.a.v[0],i.a.v[1],i.a.v[2])},RepeaterModifier.prototype.init=function(t,e,r,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=i,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[r]);for(;0<r;)r-=1,this._elements.unshift(e[r]),1;this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},RepeaterModifier.prototype.cloneElements=function(t){t.length;var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},RepeaterModifier.prototype.changeGroupRender=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},RepeaterModifier.prototype.processShapes=function(t){var e,r,i,s,a;if(this._mdf||t){var n,o=Math.ceil(this.c.v);if(this._groups.length<o){for(;this._groups.length<o;){var h={it:this.cloneElements(this._elements),ty:"gr"};h.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,h),this._groups.splice(0,0,h),this._currentCopies+=1}this.elem.reloadShapes()}for(i=a=0;i<=this._groups.length-1;i+=1)n=a<o,this._groups[i]._render=n,this.changeGroupRender(this._groups[i].it,n),a+=1;this._currentCopies=o;var p=this.o.v,l=p%1,m=0<p?Math.floor(p):Math.ceil(p),f=(this.tr.v.props,this.pMatrix.props),c=this.rMatrix.props,d=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var u,y,g=0;if(0<p){for(;g<m;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),g+=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,l,!1),g+=l)}else if(p<0){for(;m<g;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),g-=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-l,!0),g-=l)}for(i=1===this.data.m?0:this._currentCopies-1,s=1===this.data.m?1:-1,a=this._currentCopies;a;){if(y=(r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==g){for((0!==i&&1===s||i!==this._currentCopies-1&&-1===s)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),this.matrix.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15]),u=0;u<y;u+=1)r[u]=this.matrix.props[u];this.matrix.reset()}else for(this.matrix.reset(),u=0;u<y;u+=1)r[u]=this.matrix.props[u];g+=1,a-=1,i+=s}}else for(a=this._currentCopies,i=0,s=1;a;)r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,a-=1,i+=s},RepeaterModifier.prototype.addShape=function(){},ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeCollection.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(createSizedArray(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ShapeCollection.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,r=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),GradientProperty.prototype.comparePoints=function(t,e){for(var r=0,i=this.o.length/2;r<i;){if(.01<Math.abs(t[4*r]-t[4*e+2*r]))return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,r,i,s=4*this.data.p;for(e=0;e<s;e+=1)r=e%4==0?100:255,i=Math.round(this.prop.v[e]*r),this.c[e]!==i&&(this.c[e]=i,this._cmdf=!t);if(this.o.length)for(s=this.prop.v.length,e=4*this.data.p;e<s;e+=1)r=e%2==0?100:1,i=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this._omdf=!t);this._mdf=!t}},extendPrototype([DynamicPropertyContainer],GradientProperty);var buildShapeString=function(t,e,r,i){if(0===e)return"";var s,a=t.o,n=t.i,o=t.v,h=" M"+i.applyToPointStringified(o[0][0],o[0][1]);for(s=1;s<e;s+=1)h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[s][0],n[s][1])+" "+i.applyToPointStringified(o[s][0],o[s][1]);return r&&e&&(h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[0][0],n[0][1])+" "+i.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},ImagePreloader=function(){},featureSupport=(Iv={maskType:!0},(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(Iv.maskType=!1),Iv),Iv,filtersFactory=(Jv={},Jv.createFilter=function(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e},Jv.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},Jv),Jv,assetLoader={load:function(t,e,r){var i,s=new XMLHttpRequest;s.open("GET",t,!0);try{s.responseType="json"}catch(t){}s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i=Pv(s),e(i);else try{i=Pv(s),e(i)}catch(t){r&&r(t)}}}};function Pv(t){return t.response&&"object"==typeof t.response?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):void 0}var assetLoader=null;function TextAnimatorProperty(t,e,r){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=createSizedArray(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(r)}function TextAnimatorDataProperty(t,e,r){var i={propType:!1},s=PropertyFactory.getProp,a=e.a;this.a={r:a.r?s(t,a.r,0,degToRads,r):i,rx:a.rx?s(t,a.rx,0,degToRads,r):i,ry:a.ry?s(t,a.ry,0,degToRads,r):i,sk:a.sk?s(t,a.sk,0,degToRads,r):i,sa:a.sa?s(t,a.sa,0,degToRads,r):i,s:a.s?s(t,a.s,1,.01,r):i,a:a.a?s(t,a.a,1,0,r):i,o:a.o?s(t,a.o,0,.01,r):i,p:a.p?s(t,a.p,1,0,r):i,sw:a.sw?s(t,a.sw,0,0,r):i,sc:a.sc?s(t,a.sc,1,0,r):i,fc:a.fc?s(t,a.fc,1,0,r):i,fh:a.fh?s(t,a.fh,0,0,r):i,fs:a.fs?s(t,a.fs,0,.01,r):i,fb:a.fb?s(t,a.fb,0,.01,r):i,t:a.t?s(t,a.t,0,0,r):i},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,i,s,a){this.o=t,this.sw=e,this.sc=r,this.fc=i,this.m=s,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!r,fc:!!i,m:!0,p:!0}}function TextProperty(t,e){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}TextAnimatorProperty.prototype.searchProperties=function(){var t,e,r=this._textData.a.length,i=PropertyFactory.getProp;for(t=0;t<r;t+=1)e=this._textData.a[t],this._animatorsData[t]=new TextAnimatorDataProperty(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this),l:i(this._elem,this._textData.p.l,0,0,this),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var r,i,s,a,n,o,h,p,l,m,f,c,d,u,y,g,v,P,b,x=this._moreOptions.alignment.v,_=this._animatorsData,S=this._textData,T=this.mHelper,A=this._renderType,C=this.renderedLetters.length,E=(this.data,t.l);if(this._hasMaskedPath){if(b=this._pathData.m,!this._pathData.n||this._pathData._mdf){var k,D=b.v;for(this._pathData.r&&(D=D.reverse()),n={tLength:0,segments:[]},a=D._length-1,s=g=0;s<a;s+=1)k=bez.buildBezierData(D.v[s],D.v[s+1],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[s+1][0]-D.v[s+1][0],D.i[s+1][1]-D.v[s+1][1]]),n.tLength+=k.segmentLength,n.segments.push(k),g+=k.segmentLength;s=a,b.v.c&&(k=bez.buildBezierData(D.v[s],D.v[0],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[0][0]-D.v[0][0],D.i[0][1]-D.v[0][1]]),n.tLength+=k.segmentLength,n.segments.push(k),g+=k.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,m=1,l=!(p=f=0),u=n.segments,o<0&&b.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),m=(d=u[f=u.length-1].points).length-1;o<0;)o+=d[m].partialLength,(m-=1)<0&&(m=(d=u[f-=1].points).length-1);c=(d=u[f].points)[m-1],y=(h=d[m]).partialLength}a=E.length,i=r=0;var M,I,w,F,V=1.2*t.finalSize*.714,R=!0;w=_.length;var L,z,O,B,N,G,j,J,K,q,H,W,X,Y=-1,Q=o,$=f,U=m,Z=-1,tt="",et=this.defaultPropsArray;if(2===t.j||1===t.j){var rt=0,it=0,st=2===t.j?-.5:-1,at=0,nt=!0;for(s=0;s<a;s+=1)if(E[s].n){for(rt&&(rt+=it);at<s;)E[at].animatorJustifyOffset=rt,at+=1;nt=!(rt=0)}else{for(I=0;I<w;I+=1)(M=_[I].a).t.propType&&(nt&&2===t.j&&(it+=M.t.v*st),(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?rt+=M.t.v*L[0]*st:rt+=M.t.v*L*st);nt=!1}for(rt&&(rt+=it);at<s;)E[at].animatorJustifyOffset=rt,at+=1}for(s=0;s<a;s+=1){if(T.reset(),N=1,E[s].n)r=0,i+=t.yOffset,i+=R?1:0,o=Q,R=!1,0,this._hasMaskedPath&&(m=U,c=(d=u[f=$].points)[m-1],y=(h=d[m]).partialLength,p=0),X=q=W=tt="",et=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Z!==E[s].line){switch(t.j){case 1:o+=g-t.lineWidths[E[s].line];break;case 2:o+=(g-t.lineWidths[E[s].line])/2}Z=E[s].line}Y!==E[s].ind&&(E[Y]&&(o+=E[Y].extra),o+=E[s].an/2,Y=E[s].ind),o+=x[0]*E[s].an/200;var ot=0;for(I=0;I<w;I+=1)(M=_[I].a).p.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?ot+=M.p.v[0]*L[0]:ot+=M.p.v[0]*L),M.a.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?ot+=M.a.v[0]*L[0]:ot+=M.a.v[0]*L);for(l=!0;l;)o+ot<=p+y||!d?(v=(o+ot-p)/h.partialLength,O=c.point[0]+(h.point[0]-c.point[0])*v,B=c.point[1]+(h.point[1]-c.point[1])*v,T.translate(-x[0]*E[s].an/200,-x[1]*V/100),l=!1):d&&(p+=h.partialLength,(m+=1)>=d.length&&(m=0,d=u[f+=1]?u[f].points:b.v.c?u[f=m=0].points:(p-=h.partialLength,null)),d&&(c=h,y=(h=d[m]).partialLength));z=E[s].an/2-E[s].add,T.translate(-z,0,0)}else z=E[s].an/2-E[s].add,T.translate(-z,0,0),T.translate(-x[0]*E[s].an/200,-x[1]*V/100,0);for(E[s].l/2,I=0;I<w;I+=1)(M=_[I].a).t.propType&&(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),0===r&&0===t.j||(this._hasMaskedPath?L.length?o+=M.t.v*L[0]:o+=M.t.v*L:L.length?r+=M.t.v*L[0]:r+=M.t.v*L));for(E[s].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(G=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(J=[t.fc[0],t.fc[1],t.fc[2]]),I=0;I<w;I+=1)(M=_[I].a).a.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?T.translate(-M.a.v[0]*L[0],-M.a.v[1]*L[1],M.a.v[2]*L[2]):T.translate(-M.a.v[0]*L,-M.a.v[1]*L,M.a.v[2]*L));for(I=0;I<w;I+=1)(M=_[I].a).s.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?T.scale(1+(M.s.v[0]-1)*L[0],1+(M.s.v[1]-1)*L[1],1):T.scale(1+(M.s.v[0]-1)*L,1+(M.s.v[1]-1)*L,1));for(I=0;I<w;I+=1){if(M=_[I].a,L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),M.sk.propType&&(L.length?T.skewFromAxis(-M.sk.v*L[0],M.sa.v*L[1]):T.skewFromAxis(-M.sk.v*L,M.sa.v*L)),M.r.propType&&(L.length?T.rotateZ(-M.r.v*L[2]):T.rotateZ(-M.r.v*L)),M.ry.propType&&(L.length?T.rotateY(M.ry.v*L[1]):T.rotateY(M.ry.v*L)),M.rx.propType&&(L.length?T.rotateX(M.rx.v*L[0]):T.rotateX(M.rx.v*L)),M.o.propType&&(L.length?N+=(M.o.v*L[0]-N)*L[0]:N+=(M.o.v*L-N)*L),t.strokeWidthAnim&&M.sw.propType&&(L.length?j+=M.sw.v*L[0]:j+=M.sw.v*L),t.strokeColorAnim&&M.sc.propType)for(K=0;K<3;K+=1)L.length?G[K]=G[K]+(M.sc.v[K]-G[K])*L[0]:G[K]=G[K]+(M.sc.v[K]-G[K])*L;if(t.fillColorAnim&&t.fc){if(M.fc.propType)for(K=0;K<3;K+=1)L.length?J[K]=J[K]+(M.fc.v[K]-J[K])*L[0]:J[K]=J[K]+(M.fc.v[K]-J[K])*L;M.fh.propType&&(J=L.length?addHueToRGB(J,M.fh.v*L[0]):addHueToRGB(J,M.fh.v*L)),M.fs.propType&&(J=L.length?addSaturationToRGB(J,M.fs.v*L[0]):addSaturationToRGB(J,M.fs.v*L)),M.fb.propType&&(J=L.length?addBrightnessToRGB(J,M.fb.v*L[0]):addBrightnessToRGB(J,M.fb.v*L))}}for(I=0;I<w;I+=1)(M=_[I].a).p.propType&&(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),this._hasMaskedPath?L.length?T.translate(0,M.p.v[1]*L[0],-M.p.v[2]*L[1]):T.translate(0,M.p.v[1]*L,-M.p.v[2]*L):L.length?T.translate(M.p.v[0]*L[0],M.p.v[1]*L[1],-M.p.v[2]*L[2]):T.translate(M.p.v[0]*L,M.p.v[1]*L,-M.p.v[2]*L));if(t.strokeWidthAnim&&(q=j<0?0:j),t.strokeColorAnim&&(H="rgb("+Math.round(255*G[0])+","+Math.round(255*G[1])+","+Math.round(255*G[2])+")"),t.fillColorAnim&&t.fc&&(W="rgb("+Math.round(255*J[0])+","+Math.round(255*J[1])+","+Math.round(255*J[2])+")"),this._hasMaskedPath){if(T.translate(0,-t.ls),T.translate(0,x[1]*V/100+i,0),S.p.p){P=(h.point[1]-c.point[1])/(h.point[0]-c.point[0]);var ht=180*Math.atan(P)/Math.PI;h.point[0]<c.point[0]&&(ht+=180),T.rotate(-ht*Math.PI/180)}T.translate(O,B,0),o-=x[0]*E[s].an/200,E[s+1]&&Y!==E[s+1].ind&&(o+=E[s].an/2,o+=t.tr/1e3*t.finalSize)}else{switch(T.translate(r,i,0),t.ps&&T.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:T.translate(E[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[E[s].line]),0,0);break;case 2:T.translate(E[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[E[s].line])/2,0,0)}T.translate(0,-t.ls),T.translate(z,0,0),T.translate(x[0]*E[s].an/200,x[1]*V/100,0),r+=E[s].l+t.tr/1e3*t.finalSize}"html"===A?tt=T.toCSS():"svg"===A?tt=T.to2dCSS():et=[T.props[0],T.props[1],T.props[2],T.props[3],T.props[4],T.props[5],T.props[6],T.props[7],T.props[8],T.props[9],T.props[10],T.props[11],T.props[12],T.props[13],T.props[14],T.props[15]],X=N}C<=s?(F=new LetterProps(X,q,H,W,tt,et),this.renderedLetters.push(F),C+=1,this.lettersChangedFlag=!0):(F=this.renderedLetters[s],this.lettersChangedFlag=F.update(X,q,H,W,tt,et)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),LetterProps.prototype.update=function(t,e,r,i,s,a){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1;var n=this._mdf.p=!1;return this.o!==t&&(this.o=t,n=this._mdf.o=!0),this.sw!==e&&(this.sw=e,n=this._mdf.sw=!0),this.sc!==r&&(this.sc=r,n=this._mdf.sc=!0),this.fc!==i&&(this.fc=i,n=this._mdf.fc=!0),this.m!==s&&(this.m=s,n=this._mdf.m=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,n=this._mdf.p=!0),n},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},TextProperty.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=1<this.data.d.k.length,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,r=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{this.lock=!0,this._mdf=!1;var i,s=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(i=0;i<s;i+=1)a=r!==this.keysIndex?this.effectsSequence[i](a,a.t):this.effectsSequence[i](this.currentData,a.t);e!==a&&this.setCurrentData(a),this.pv=this.v=this.currentData,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},TextProperty.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,r=0,i=t.length;r<=i-1&&(t[r].s,!(r===i-1||t[r+1].t>e));)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(t){for(var e=FontManager.getCombinedCharacterCodes(),r=[],i=0,s=t.length;i<s;)-1!==e.indexOf(t.charCodeAt(i))?r[r.length-1]+=t.charAt(i):r.push(t.charAt(i)),i+=1;return r},TextProperty.prototype.completeTextData=function(t){t.__complete=!0;var e,r,i,s,a,n,o,h=this.elem.globalData.fontManager,p=this.data,l=[],m=0,f=p.m.g,c=0,d=0,u=0,y=[],g=0,v=0,P=h.getFontByName(t.f),b=0,x=P.fStyle?P.fStyle.split(" "):[],_="normal",S="normal";for(r=x.length,e=0;e<r;e+=1)switch(x[e].toLowerCase()){case"italic":S="italic";break;case"bold":_="700";break;case"black":_="900";break;case"medium":_="500";break;case"regular":case"normal":_="400";break;case"light":case"thin":_="200"}t.fWeight=P.fWeight||_,t.fStyle=S,r=t.t.length,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),t.finalLineHeight=t.lh;var T,A=t.tr/1e3*t.finalSize;if(t.sz)for(var C,E,k=!0,D=t.sz[0],M=t.sz[1];k;){g=C=0,r=(E=this.buildFinalText(t.t)).length,A=t.tr/1e3*t.finalSize;var I=-1;for(e=0;e<r;e+=1)T=E[e].charCodeAt(0),i=!1," "===E[e]?I=e:13!==T&&3!==T||(i=!(g=0),C+=t.finalLineHeight||1.2*t.finalSize),D<g+(b=h.chars?(o=h.getCharData(E[e],P.fStyle,P.fFamily),i?0:o.w*t.finalSize/100):h.measureText(E[e],t.f,t.finalSize))&&" "!==E[e]?(-1===I?r+=1:e=I,C+=t.finalLineHeight||1.2*t.finalSize,E.splice(e,I===e?1:0,"\r"),I=-1,g=0):(g+=b,g+=A);C+=P.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&M<C?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=E,r=t.finalText.length,k=!1)}g=-A;var w,F=b=0;for(e=0;e<r;e+=1)if(i=!1,T=(w=t.finalText[e]).charCodeAt(0)," "===w?s="\xa0":13===T||3===T?(F=0,y.push(g),v=v<g?g:v,g=-2*A,i=!(s=""),u+=1):s=t.finalText[e],b=h.chars?(o=h.getCharData(w,P.fStyle,h.getFontByName(t.f).fFamily),i?0:o.w*t.finalSize/100):h.measureText(s,t.f,t.finalSize)," "===w?F+=b+A:(g+=b+A+F,F=0),l.push({l:b,an:b,add:c,n:i,anIndexes:[],val:s,line:u,animatorJustifyOffset:0}),2==f){if(c+=b,""===s||"\xa0"===s||e===r-1){for(""!==s&&"\xa0"!==s||(c-=b);d<=e;)l[d].an=c,l[d].ind=m,l[d].extra=b,d+=1;m+=1,c=0}}else if(3==f){if(c+=b,""===s||e===r-1){for(""===s&&(c-=b);d<=e;)l[d].an=c,l[d].ind=m,l[d].extra=b,d+=1;c=0,m+=1}}else l[m].ind=m,l[m].extra=0,m+=1;if(t.l=l,v=v<g?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var V,R,L=p.a;n=L.length;var z,O,B=[];for(a=0;a<n;a+=1){for((V=L[a]).a.sc&&(t.strokeColorAnim=!0),V.a.sw&&(t.strokeWidthAnim=!0),(V.a.fc||V.a.fh||V.a.fs||V.a.fb)&&(t.fillColorAnim=!0),O=0,z=V.s.b,e=0;e<r;e+=1)(R=l[e]).anIndexes[a]=O,(1==z&&""!==R.val||2==z&&""!==R.val&&"\xa0"!==R.val||3==z&&(R.n||"\xa0"==R.val||e==r-1)||4==z&&(R.n||e==r-1))&&(1===V.s.rn&&B.push(O),O+=1);p.a[a].s.totalChars=O;var N,G=-1;if(1===V.s.rn)for(e=0;e<r;e+=1)G!=(R=l[e]).anIndexes[a]&&(G=R.anIndexes[a],N=B.splice(Math.floor(Math.random()*B.length),1)[0]),R.anIndexes[a]=N}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=P.ascent*t.finalSize/100},TextProperty.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.copyData({},this.data.d.k[e].s);r=this.copyData(r,t),this.data.d.k[e].s=r,this.recalculate(e),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},TextProperty.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var TextSelectorProp=(cz=Math.max,dz=Math.min,ez=Math.floor,fz.prototype={getMult:function(t){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,i=this.finalS,s=this.finalE,a=this.data.sh;if(2==a)r=e(r=s===i?s<=t?1:0:cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)));else if(3==a)r=e(r=s===i?s<=t?0:1:1-cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)));else if(4==a)s===i?r=0:(r=cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)))<.5?r*=2:r=1-2*(r-.5),r=e(r);else if(5==a){if(s===i)r=0;else{var n=s-i,o=-n/2+(t=dz(cz(0,t+.5-i),s-i)),h=n/2;r=Math.sqrt(1-o*o/(h*h))}r=e(r)}else r=6==a?e(r=s===i?0:(t=dz(cz(0,t+.5-i),s-i),(1+Math.cos(Math.PI+2*Math.PI*t/(s-i)))/2)):(t>=ez(i)&&(r=t-i<0?1-(i-t):cz(0,dz(s-t,1))),e(r));return r*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,r=this.o.v/e,i=this.s.v/e+r,s=this.e.v/e+r;if(s<i){var a=i;i=s,s=a}this.finalS=i,this.finalE=s}},extendPrototype([DynamicPropertyContainer],fz),{getTextSelectorProp:function(t,e,r){return new fz(t,e,r)}}),cz,dz,ez;function fz(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=PropertyFactory.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?PropertyFactory.getProp(t,e.e,0,0,this):{v:100},this.o=PropertyFactory.getProp(t,e.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(t,e.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(t,e.ne||{k:0},0,0,this),this.a=PropertyFactory.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}var pool_factory=function(t,e,r,i){var s=0,a=t,n=createSizedArray(a);function o(){return s?n[s-=1]:e()}return{newElement:o,release:function(t){s===a&&(n=pooling.double(n),a*=2),r&&r(t),n[s]=t,s+=1}}},pooling={double:function(t){return t.concat(createSizedArray(t.length))}},point_pool=pool_factory(8,function(){return createTypedArray("float32",2)}),shape_pool=(Vz=pool_factory(4,function(){return new ShapePath},function(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}),Vz.clone=function(t){var e,r=Vz.newElement(),i=void 0===t._length?t.v.length:t._length;for(r.setLength(i),r.c=t.c,e=0;e<i;e+=1)r.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return r},Vz),Vz,shapeCollection_pool=(cA={newShapeCollection:function(){var t;t=dA?fA[dA-=1]:new ShapeCollection;return t},release:function(t){var e,r=t._length;for(e=0;e<r;e+=1)shape_pool.release(t.shapes[e]);t._length=0,dA===eA&&(fA=pooling.double(fA),eA*=2);fA[dA]=t,dA+=1}},dA=0,eA=4,fA=createSizedArray(eA),cA),cA,dA,eA,fA,segments_length_pool=pool_factory(8,function(){return{lengths:[],totalLength:0}},function(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0}),bezier_length_pool=pool_factory(8,function(){return{addedLength:0,percents:createTypedArray("float32",defaultCurveSegments),lengths:createTypedArray("float32",defaultCurveSegments)}});function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=createNS("svg");var r="";if(e&&e.title){var i=createNS("title"),s=createElementID();i.setAttribute("id",s),i.textContent=e.title,this.svgElement.appendChild(i),r+=s}if(e&&e.description){var a=createNS("desc"),n=createElementID();a.setAttribute("id",n),a.textContent=e.description,this.svgElement.appendChild(a),r+=" "+n}r&&this.svgElement.setAttribute("aria-labelledby",r);var o=createNS("defs");this.svgElement.appendChild(o);var h=createNS("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||!1!==e.hideOnTransparent,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1,_mdf:!1,renderConfig:this.renderConfig,currentGlobalAlpha:-1},this.contextData=new CVContextData,this.elements=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1,this.rendererType="canvas"}function MaskElement(t,e,r){this.data=t,this.element=e,this.globalData=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var i,s=this.globalData.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=createSizedArray(a),this.solidPath="";var n,o,h,p,l,m,f,c=this.masksProperties,d=0,u=[],y=createElementID(),g="clipPath",v="clip-path";for(i=0;i<a;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(v=g="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!==d?p=null:((p=createNS("rect")).setAttribute("fill","#ffffff"),p.setAttribute("width",this.element.comp.data.w||0),p.setAttribute("height",this.element.comp.data.h||0),u.push(p)),n=createNS("path"),"n"!=c[i].mode){var P;if(d+=1,n.setAttribute("fill","s"===c[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[i].x.k?(v=g="mask",f=PropertyFactory.getProp(this.element,c[i].x,0,null,this.element),P=createElementID(),(l=createNS("filter")).setAttribute("id",P),(m=createNS("feMorphology")).setAttribute("operator","erode"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),l.appendChild(m),s.appendChild(l),n.setAttribute("stroke","s"===c[i].mode?"#000000":"#ffffff")):f=m=null,this.storedData[i]={elem:n,x:f,expan:m,lastPath:"",lastOperator:"",filterId:P,lastRadius:0},"i"==c[i].mode){h=u.length;var b=createNS("g");for(o=0;o<h;o+=1)b.appendChild(u[o]);var x=createNS("mask");x.setAttribute("mask-type","alpha"),x.setAttribute("id",y+"_"+d),x.appendChild(n),s.appendChild(x),b.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(b)}else u.push(n);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),invRect:p},this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),elem:n,lastPath:""},s.appendChild(n);for(this.maskElement=createNS(g),a=u.length,i=0;i<a;i+=1)this.maskElement.appendChild(u[i]);0<d&&(this.maskElement.setAttribute("id",y),this.element.maskedElement.setAttribute(v,"url("+locationHref+"#"+y+")"),s.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}function HierarchyElement(){}function FrameElement(){}function TransformElement(){}function RenderableElement(){}function RenderableDOMElement(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e,this._isAnimated=!!r.k;for(var i=0,s=t.length;i<s;){if(t[i].mProps.dynamicProperties.length){this._isAnimated=!0;break}i+=1}}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function ShapeTransformManager(){this.sequences={},this.sequenceList=[],this.transform_key_count=0}function CVShapeData(t,e,r,i){this.styledShapes=[],this.tr=[0,0,0,0,0,0];var s=4;"rc"==e.ty?s=5:"el"==e.ty?s=6:"sr"==e.ty&&(s=7),this.sh=ShapePropertyFactory.getShapeProp(t,e,s,t);var a,n,o=r.length;for(a=0;a<o;a+=1)r[a].closed||(n={transforms:i.addTransformSequence(r[a].transforms),trNodes:[]},this.styledShapes.push(n),r[a].elements.push(n))}function BaseElement(){}function NullElement(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function SVGBaseElement(){}function IShapeElement(){}function ITextElement(){}function ICompElement(){}function IImageElement(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function ISolidElement(t,e,r){this.initElement(t,e,r)}function SVGShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,r),this.prevViewData=[]}function CVContextData(){this.saved=[],this.cArrPos=0,this.cTr=new Matrix,this.cO=1;var t;for(this.savedOp=createTypedArray("float32",15),t=0;t<15;t+=1)this.saved[t]=createTypedArray("float32",16);this._length=15}function CVBaseElement(){}function CVCompElement(t,e,r){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this.elements=createSizedArray(this.layers.length),this.initElement(t,e,r),this.tm=t.tm?PropertyFactory.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function CVMaskElement(t,e){this.data=t,this.element=e,this.masksProperties=this.data.masksProperties||[],this.viewData=createSizedArray(this.masksProperties.length);var r,i=this.masksProperties.length,s=!1;for(r=0;r<i;r++)"n"!==this.masksProperties[r].mode&&(s=!0),this.viewData[r]=ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[r],3);(this.hasMasks=s)&&this.element.addRenderableComponent(this)}function CVShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.transformsManager=new ShapeTransformManager,this.initElement(t,e,r)}function CVSolidElement(t,e,r){this.initElement(t,e,r)}function CVEffects(){}BaseRenderer.prototype.checkLayers=function(t){var e,r,i=this.layers.length;for(this.completeLayers=!0,e=i-1;0<=e;e--)this.elements[e]||(r=this.layers[e]).ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t)}return this.createNull(t)},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,r,i=t.length,s=this.layers.length;for(e=0;e<i;e+=1)for(r=0;r<s;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e,r){for(var i=this.elements,s=this.layers,a=0,n=s.length;a<n;)s[a].ind==e&&(i[a]&&!0!==i[a]?(r.push(i[a]),i[a].setAsParent(),void 0!==s[a].parent?this.buildElementParenting(t,s[a].parent,r):t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},BaseRenderer.prototype.addPendingElement=function(t){this.pendingElements.push(t)},BaseRenderer.prototype.searchExtraCompositions=function(t){var e,r=t.length;for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e]);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},BaseRenderer.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},extendPrototype([BaseRenderer],SVGRenderer),SVGRenderer.prototype.createNull=function(t){return new NullElement(t,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new SVGShapeElement(t,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new SVGCompElement(t,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)"),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var r=createNS("clipPath"),i=createNS("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var s=createElementID();r.setAttribute("id",s),r.appendChild(i),this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+s+")"),e.appendChild(r),this.layers=t.layers,this.elements=createSizedArray(t.layers.length)},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},SVGRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this.elements.length;e<r;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=r-1;0<=e;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<r;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var r=t.getBaseElement();if(r){for(var i,s=0;s<e;)this.elements[s]&&!0!==this.elements[s]&&this.elements[s].getBaseElement()&&(i=this.elements[s].getBaseElement()),s+=1;i?this.layerElement.insertBefore(r,i):this.layerElement.appendChild(r)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},extendPrototype([BaseRenderer],CanvasRenderer),CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData,this)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData,this)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData,this)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData,this)},CanvasRenderer.prototype.createNull=SVGRenderer.prototype.createNull,CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13])if(this.renderConfig.clearCanvas){this.transformMat.cloneFromProps(t);var e=this.contextData.cTr.props;this.transformMat.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}else this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13])},CanvasRenderer.prototype.ctxOpacity=function(t){if(!this.renderConfig.clearCanvas)return this.canvasContext.globalAlpha*=t<0?0:t,void(this.globalData.currentGlobalAlpha=this.contextData.cO);this.contextData.cO*=t<0?0:t,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},CanvasRenderer.prototype.reset=function(){this.renderConfig.clearCanvas?this.contextData.reset():this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(this.renderConfig.clearCanvas){t&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,i=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)i[r]=e[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1}else this.canvasContext.save()},CanvasRenderer.prototype.restore=function(t){if(this.renderConfig.clearCanvas){t&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var e,r=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;e<16;e+=1)i[e]=r[e];this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13]),r=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=r,this.globalData.currentGlobalAlpha!==r&&(this.canvasContext.globalAlpha=r,this.globalData.currentGlobalAlpha=r)}else this.canvasContext.restore()},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(t,document.body),this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(t.layers.length),this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e,r,i;if(this.reset(),this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr),-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var s=this.renderConfig.preserveAspectRatio.split(" "),a=s[1]||"meet",n=s[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);(r=t/e)<(i=this.transformCanvas.w/this.transformCanvas.h)&&"meet"===a||i<r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===o&&(i<r&&"meet"===a||r<i&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(i<r&&"meet"===a||r<i&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(r<i&&"meet"===a||i<r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(r<i&&"meet"===a||i<r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0;this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip(),this.renderFrame(this.renderedFrame,!0)},CanvasRenderer.prototype.destroy=function(){var t;for(this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML=""),t=(this.layers?this.layers.length:0)-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var r,i=this.layers.length;for(this.completeLayers||this.checkLayers(t),r=0;r<i;r++)(this.completeLayers||this.elements[r])&&this.elements[r].prepareFrame(t-this.layers[r].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),r=i-1;0<=r;r-=1)(this.completeLayers||this.elements[r])&&this.elements[r].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},CanvasRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var r=this.createItem(this.layers[t],this,this.globalData);(e[t]=r).initExpressions()}},CanvasRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(t.layers.length),this.updateContainerSize()},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.renderFrame=function(t){var e,r=this.element.finalTransform.mat,i=this.masksProperties.length;for(e=0;e<i;e++)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&(this.viewData[e].invRect.setAttribute("x",-r.props[12]),this.viewData[e].invRect.setAttribute("y",-r.props[13])),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,r){var i,s,a=" M"+e.v[0][0]+","+e.v[0][1];for(s=e._length,i=1;i<s;i+=1)a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&1<s&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var r,i=this.dynamicProperties.length;for(r=0;r<i;r+=1)(e||this._isParent&&"transform"===this.dynamicProperties[r].propType)&&(this.dynamicProperties[r].getValue(),this.dynamicProperties[r]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,r=0,i=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;r<i;){if(this.hierarchy[r].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}r+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<i;r+=1)t=this.hierarchy[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var r=!0,i=this.comp;r;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):r=!1;var s,a,n=e.length;for(s=0;s<n;s+=1)a=e[s].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},mHelper:new Matrix},RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}},extendPrototype([RenderableElement,createProxyFunction({initElement:function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],RenderableDOMElement),SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},ShapeTransformManager.prototype={addTransformSequence:function(t){var e,r=t.length,i="_";for(e=0;e<r;e+=1)i+=t[e].transform.key+"_";var s=this.sequences[i];return s||(s={transforms:[].concat(t),finalTransform:new Matrix,_mdf:!1},this.sequences[i]=s,this.sequenceList.push(s)),s},processSequence:function(t,e){for(var r,i=0,s=t.transforms.length,a=e;i<s&&!e;){if(t.transforms[i].transform.mProps._mdf){a=!0;break}i+=1}if(a)for(t.finalTransform.reset(),i=s-1;0<=i;i-=1)r=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15]);t._mdf=a},processSequences:function(t){var e,r=this.sequenceList.length;for(e=0;e<r;e+=1)this.processSequence(this.sequenceList[e],t)},getNewKey:function(){return"_"+this.transform_key_count++}},CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=getBlendMode(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,r){this.globalData=e,this.comp=r,this.data=t,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},NullElement.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,r,i=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var s=createNS("mask");s.setAttribute("id",this.layerId),s.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),s.appendChild(this.layerElement),i=s,this.globalData.defs.appendChild(s),featureSupport.maskType||1!=this.data.td||(s.setAttribute("mask-type","luminance"),t=createElementID(),e=filtersFactory.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),(r=createNS("g")).appendChild(this.layerElement),i=r,s.appendChild(r),r.setAttribute("filter","url("+locationHref+"#"+t+")"))}else if(2==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=createNS("g");a.appendChild(n),t=createElementID(),e=filtersFactory.createFilter(t);var o=createNS("feComponentTransfer");o.setAttribute("in","SourceGraphic"),e.appendChild(o);var h=createNS("feFuncA");h.setAttribute("type","table"),h.setAttribute("tableValues","1.0 0.0"),o.appendChild(h),this.globalData.defs.appendChild(e);var p=createNS("rect");p.setAttribute("width",this.comp.data.w),p.setAttribute("height",this.comp.data.h),p.setAttribute("x","0"),p.setAttribute("y","0"),p.setAttribute("fill","#ffffff"),p.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+t+")"),n.appendChild(p),n.appendChild(this.layerElement),i=n,featureSupport.maskType||(a.setAttribute("mask-type","luminance"),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),r=createNS("g"),n.appendChild(p),r.appendChild(this.layerElement),i=r,n.appendChild(r)),this.globalData.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),i=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),m=createNS("path");m.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f=createElementID();if(l.setAttribute("id",f),l.appendChild(m),this.globalData.defs.appendChild(l),this.checkMasks()){var c=createNS("g");c.setAttribute("clip-path","url("+locationHref+"#"+f+")"),c.appendChild(this.layerElement),this.transformedElement=c,i?i.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+f+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")}},IShapeElement.prototype={addShapeToModifiers:function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;0<=t;t-=1)this.shapeModifiers[t].processShapes(this._isFirstFrame)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"bevel"},searchProcessedElement:function(t){for(var e=this.processedElements,r=0,i=e.length;r<i;){if(e[r].elem===t)return e[r].pos;r+=1}return 0},addProcessedElement:function(t,e){for(var r=this.processedElements,i=r.length;i;)if(r[i-=1].elem===t)return void(r[i].pos=e);r.push(new ProcessedElement(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}},ITextElement.prototype.initElement=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textProperty=new TextProperty(this,t.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(t.t,this.renderType,this),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(t,e){var r,i,s=e.length,a="";for(r=0;r<s;r+=1)i=e[r].ks.k,a+=buildShapeString(i,i.i.length,!0,t);return a},ITextElement.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},ITextElement.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},ITextElement.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},ITextElement.prototype.applyTextPropertiesToMatrix=function(t,e,r,i,s){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(i,s,0)},ITextElement.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=i-1;0<=r;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var t,e,r,i,s=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(r=0;r<a;r+=1){for(i=this.stylesList[r],o=!1,t=n.length=0;t<s;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(i)&&(n.push(e),o=e._isAnimated||o);1<n.length&&o&&this.setShapesAsAnimated(n)}},SVGShapeElement.prototype.setShapesAsAnimated=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(t,e){var r,i=new SVGStyleData(t,e),s=i.pElem;if("st"===t.ty)r=new SVGStrokeStyleData(this,t,i);else if("fl"===t.ty)r=new SVGFillStyleData(this,t,i);else if("gf"===t.ty||"gs"===t.ty){r=new("gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData)(this,t,i),this.globalData.defs.appendChild(r.gf),r.maskId&&(this.globalData.defs.appendChild(r.ms),this.globalData.defs.appendChild(r.of),s.setAttribute("mask","url("+locationHref+"#"+r.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(s.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),s.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),s.setAttribute("fill-opacity","0"),1===t.lj&&s.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&s.setAttribute("fill-rule","evenodd"),t.ln&&s.setAttribute("id",t.ln),t.cl&&s.setAttribute("class",t.cl),t.bm&&(s.style["mix-blend-mode"]=getBlendMode(t.bm)),this.stylesList.push(i),this.addToAnimatedContents(t,r),r},SVGShapeElement.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=getBlendMode(t.bm)),e},SVGShapeElement.prototype.createTransformElement=function(t,e){var r=TransformPropertyFactory.getTransformProperty(this,t,this),i=new SVGTransformData(r,r.o,e);return this.addToAnimatedContents(t,i),i},SVGShapeElement.prototype.createShapeElement=function(t,e,r){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var s=new SVGShapeData(e,r,ShapePropertyFactory.getShapeProp(this,t,i,this));return this.shapes.push(s),this.addShapeToModifiers(s),this.addToAnimatedContents(t,s),s},SVGShapeElement.prototype.addToAnimatedContents=function(t,e){for(var r=0,i=this.animatedContents.length;r<i;){if(this.animatedContents[r].element===e)return;r+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(t),element:e,data:t})},SVGShapeElement.prototype.setElementStyles=function(t){var e,r=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(t,e,r,i,s,a,n){var o,h,p,l,m,f,c=[].concat(a),d=t.length-1,u=[],y=[];for(o=d;0<=o;o-=1){if((f=this.searchProcessedElement(t[o]))?e[o]=r[f-1]:t[o]._render=n,"fl"==t[o].ty||"st"==t[o].ty||"gf"==t[o].ty||"gs"==t[o].ty)f?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],s),t[o]._render&&i.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"==t[o].ty){if(f)for(p=e[o].it.length,h=0;h<p;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,s+1,c,n),t[o]._render&&i.appendChild(e[o].gr)}else"tr"==t[o].ty?(f||(e[o]=this.createTransformElement(t[o],i)),l=e[o].transform,c.push(l)):"sh"==t[o].ty||"rc"==t[o].ty||"el"==t[o].ty||"sr"==t[o].ty?(f||(e[o]=this.createShapeElement(t[o],c,s)),this.setElementStyles(e[o])):"tm"==t[o].ty||"rd"==t[o].ty||"ms"==t[o].ty?(f?(m=e[o]).closed=!1:((m=ShapeModifiers.getModifier(t[o].ty)).init(this,t[o]),e[o]=m,this.shapeModifiers.push(m)),y.push(m)):"rp"==t[o].ty&&(f?(m=e[o]).closed=!0:(m=ShapeModifiers.getModifier(t[o].ty),(e[o]=m).init(this,t,o,e),this.shapeModifiers.push(m),n=!1),y.push(m));this.addProcessedElement(t[o],o+1)}for(d=u.length,o=0;o<d;o+=1)u[o].closed=!0;for(d=y.length,o=0;o<d;o+=1)y[o].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var t,e,r=this.animatedContents.length;for(t=0;t<r;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},CVContextData.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=createTypedArray("float32",t),this.savedOp.set(e);var r=0;for(r=this._length;r<t;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=t},CVContextData.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},CVBaseElement.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new CVEffects(this)},createContent:function(){},setBlendMode:function(){var t=this.globalData;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=getBlendMode(this.data.bm);t.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this)},hideElement:function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){this.hidden||this.data.hd||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,extendPrototype([CanvasRenderer,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},CVMaskElement.prototype.renderFrame=function(){if(this.hasMasks){var t,e,r,i,s=this.element.finalTransform.mat,a=this.element.canvasContext,n=this.masksProperties.length;for(a.beginPath(),t=0;t<n;t++)if("n"!==this.masksProperties[t].mode){this.masksProperties[t].inv&&(a.moveTo(0,0),a.lineTo(this.element.globalData.compSize.w,0),a.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),a.lineTo(0,this.element.globalData.compSize.h),a.lineTo(0,0)),i=this.viewData[t].v,e=s.applyToPointArray(i.v[0][0],i.v[0][1],0),a.moveTo(e[0],e[1]);var o,h=i._length;for(o=1;o<h;o++)r=s.applyToTriplePoints(i.o[o-1],i.i[o],i.v[o]),a.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5]);r=s.applyToTriplePoints(i.o[o-1],i.i[0],i.v[0]),a.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5])}this.element.globalData.renderer.save(!0),a.clip()}},CVMaskElement.prototype.getMaskProperty=MaskElement.prototype.getMaskProperty,CVMaskElement.prototype.destroy=function(){this.element=null},extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(t,e){var r={data:t,type:t.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:!0===t.hd},i={};if("fl"==t.ty||"st"==t.ty?(i.c=PropertyFactory.getProp(this,t.c,1,255,this),i.c.k||(r.co="rgb("+bm_floor(i.c.v[0])+","+bm_floor(i.c.v[1])+","+bm_floor(i.c.v[2])+")")):"gf"!==t.ty&&"gs"!==t.ty||(i.s=PropertyFactory.getProp(this,t.s,1,null,this),i.e=PropertyFactory.getProp(this,t.e,1,null,this),i.h=PropertyFactory.getProp(this,t.h||{k:0},0,.01,this),i.a=PropertyFactory.getProp(this,t.a||{k:0},0,degToRads,this),i.g=new GradientProperty(this,t.g,this)),i.o=PropertyFactory.getProp(this,t.o,0,.01,this),"st"==t.ty||"gs"==t.ty){if(r.lc=this.lcEnum[t.lc]||"round",r.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(r.ml=t.ml),i.w=PropertyFactory.getProp(this,t.w,0,null,this),i.w.k||(r.wi=i.w.v),t.d){var s=new DashProperty(this,t.d,"canvas",this);i.d=s,i.d.k||(r.da=i.d.dashArray,r.do=i.d.dashoffset[0])}}else r.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(r),i.style=r,i},CVShapeElement.prototype.createGroupElement=function(t){return{it:[],prevViewData:[]}},CVShapeElement.prototype.createTransformElement=function(t){return{transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,t.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,t,this)}}},CVShapeElement.prototype.createShapeElement=function(t){var e=new CVShapeData(this,t,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},CVShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},CVShapeElement.prototype.addTransformToStyleList=function(t){var e,r=this.stylesList.length;for(e=0;e<r;e+=1)this.stylesList[e].closed||this.stylesList[e].transforms.push(t)},CVShapeElement.prototype.removeTransformFromStyleList=function(){var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.pop()},CVShapeElement.prototype.closeStyles=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e].closed=!0},CVShapeElement.prototype.searchShapes=function(t,e,r,i,s){var a,n,o,h,p,l,m=t.length-1,f=[],c=[],d=[].concat(s);for(a=m;0<=a;a-=1){if((h=this.searchProcessedElement(t[a]))?e[a]=r[h-1]:t[a]._shouldRender=i,"fl"==t[a].ty||"st"==t[a].ty||"gf"==t[a].ty||"gs"==t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],d),f.push(e[a].style);else if("gr"==t[a].ty){if(h)for(o=e[a].it.length,n=0;n<o;n+=1)e[a].prevViewData[n]=e[a].it[n];else e[a]=this.createGroupElement(t[a]);this.searchShapes(t[a].it,e[a].it,e[a].prevViewData,i,d)}else"tr"==t[a].ty?(h||(l=this.createTransformElement(t[a]),e[a]=l),d.push(e[a]),this.addTransformToStyleList(e[a])):"sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty?h||(e[a]=this.createShapeElement(t[a])):"tm"==t[a].ty||"rd"==t[a].ty?(h?(p=e[a]).closed=!1:((p=ShapeModifiers.getModifier(t[a].ty)).init(this,t[a]),e[a]=p,this.shapeModifiers.push(p)),c.push(p)):"rp"==t[a].ty&&(h?(p=e[a]).closed=!0:(p=ShapeModifiers.getModifier(t[a].ty),(e[a]=p).init(this,t,a,e),this.shapeModifiers.push(p),i=!1),c.push(p));this.addProcessedElement(t[a],a+1)}for(this.removeTransformFromStyleList(),this.closeStyles(f),m=c.length,a=0;a<m;a+=1)c[a].closed=!0},CVShapeElement.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},CVShapeElement.prototype.renderShapeTransform=function(t,e){(t._opMdf||e.op._mdf||this._isFirstFrame)&&(e.opacity=t.opacity,e.opacity*=e.op.v,e._opMdf=!0)},CVShapeElement.prototype.drawLayer=function(){var t,e,r,i,s,a,n,o,h,p=this.stylesList.length,l=this.globalData.renderer,m=this.globalData.canvasContext;for(t=0;t<p;t+=1)if(("st"!==(o=(h=this.stylesList[t]).type)&&"gs"!==o||0!==h.wi)&&h.data._shouldRender&&0!==h.coOp&&0!==this.globalData.currentGlobalAlpha){for(l.save(),a=h.elements,"st"===o||"gs"===o?(m.strokeStyle="st"===o?h.co:h.grd,m.lineWidth=h.wi,m.lineCap=h.lc,m.lineJoin=h.lj,m.miterLimit=h.ml||0):m.fillStyle="fl"===o?h.co:h.grd,l.ctxOpacity(h.coOp),"st"!==o&&"gs"!==o&&m.beginPath(),l.ctxTransform(h.preTransforms.finalTransform.props),r=a.length,e=0;e<r;e+=1){for("st"!==o&&"gs"!==o||(m.beginPath(),h.da&&(m.setLineDash(h.da),m.lineDashOffset=h.do)),s=(n=a[e].trNodes).length,i=0;i<s;i+=1)"m"==n[i].t?m.moveTo(n[i].p[0],n[i].p[1]):"c"==n[i].t?m.bezierCurveTo(n[i].pts[0],n[i].pts[1],n[i].pts[2],n[i].pts[3],n[i].pts[4],n[i].pts[5]):m.closePath();"st"!==o&&"gs"!==o||(m.stroke(),h.da&&m.setLineDash(this.dashResetter))}"st"!==o&&"gs"!==o&&m.fill(h.r),l.restore()}},CVShapeElement.prototype.renderShape=function(t,e,r,i){var s,a;for(a=t,s=e.length-1;0<=s;s-=1)"tr"==e[s].ty?(a=r[s].transform,this.renderShapeTransform(t,a)):"sh"==e[s].ty||"el"==e[s].ty||"rc"==e[s].ty||"sr"==e[s].ty?this.renderPath(e[s],r[s]):"fl"==e[s].ty?this.renderFill(e[s],r[s],a):"st"==e[s].ty?this.renderStroke(e[s],r[s],a):"gf"==e[s].ty||"gs"==e[s].ty?this.renderGradientFill(e[s],r[s],a):"gr"==e[s].ty?this.renderShape(a,e[s].it,r[s].it):e[s].ty;i&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var r,i,s,a=t.trNodes,n=e.paths,o=n._length;a.length=0;var h=t.transforms.finalTransform;for(s=0;s<o;s+=1){var p=n.shapes[s];if(p&&p.v){for(i=p._length,r=1;r<i;r+=1)1===r&&a.push({t:"m",p:h.applyToPointArray(p.v[0][0],p.v[0][1],0)}),a.push({t:"c",pts:h.applyToTriplePoints(p.o[r-1],p.i[r],p.v[r])});1===i&&a.push({t:"m",p:h.applyToPointArray(p.v[0][0],p.v[0][1],0)}),p.c&&i&&(a.push({t:"c",pts:h.applyToTriplePoints(p.o[r-1],p.i[0],p.v[0])}),a.push({t:"z"}))}}t.trNodes=a}},CVShapeElement.prototype.renderPath=function(t,e){if(!0!==t.hd&&t._shouldRender){var r,i=e.styledShapes.length;for(r=0;r<i;r+=1)this.renderStyledShape(e.styledShapes[r],e.sh)}},CVShapeElement.prototype.renderFill=function(t,e,r){var i=e.style;(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*r.opacity)},CVShapeElement.prototype.renderGradientFill=function(t,e,r){var i=e.style;if(!i.grd||e.g._mdf||e.s._mdf||e.e._mdf||1!==t.t&&(e.h._mdf||e.a._mdf)){var s=this.globalData.canvasContext,a=e.s.v,n=e.e.v;if(1===t.t)f=s.createLinearGradient(a[0],a[1],n[0],n[1]);else var o=Math.sqrt(Math.pow(a[0]-n[0],2)+Math.pow(a[1]-n[1],2)),h=Math.atan2(n[1]-a[1],n[0]-a[0]),p=o*(1<=e.h.v?.99:e.h.v<=-1?-.99:e.h.v),l=Math.cos(h+e.a.v)*p+a[0],m=Math.sin(h+e.a.v)*p+a[1],f=s.createRadialGradient(l,m,0,a[0],a[1],o);var c,d=t.g.p,u=e.g.c,y=1;for(c=0;c<d;c+=1)e.g._hasOpacity&&e.g._collapsable&&(y=e.g.o[2*c+1]),f.addColorStop(u[4*c]/100,"rgba("+u[4*c+1]+","+u[4*c+2]+","+u[4*c+3]+","+y+")");i.grd=f}i.coOp=e.o.v*r.opacity},CVShapeElement.prototype.renderStroke=function(t,e,r){var i=e.style,s=e.d;s&&(s._mdf||this._isFirstFrame)&&(i.da=s.dashArray,i.do=s.dashoffset[0]),(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*r.opacity),(e.w._mdf||this._isFirstFrame)&&(i.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVSolidElement),CVSolidElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVSolidElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVSolidElement.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},CVEffects.prototype.renderFrame=function(){};var animationManager=(tJ={},uJ=[],vJ=0,wJ=0,xJ=0,yJ=!0,zJ=!1,tJ.registerAnimation=BJ,tJ.loadAnimation=function(t){var e=new AnimationItem;return FJ(e,null),e.setParams(t),e},tJ.setSpeed=function(t,e){var r;for(r=0;r<wJ;r+=1)uJ[r].animation.setSpeed(t,e)},tJ.setDirection=function(t,e){var r;for(r=0;r<wJ;r+=1)uJ[r].animation.setDirection(t,e)},tJ.play=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.play(t)},tJ.pause=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.pause(t)},tJ.stop=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.stop(t)},tJ.togglePause=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.togglePause(t)},tJ.searchAnimations=function(t,e,r){var i,s=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),a=s.length;for(i=0;i<a;i+=1)r&&s[i].setAttribute("data-bm-type",r),BJ(s[i],t);if(e&&0===a){r||(r="svg");var n=document.getElementsByTagName("body")[0];n.innerHTML="";var o=createTag("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",r),n.appendChild(o),BJ(o,t)}},tJ.resize=function(){var t;for(t=0;t<wJ;t+=1)uJ[t].animation.resize()},tJ.goToAndStop=function(t,e,r){var i;for(i=0;i<wJ;i+=1)uJ[i].animation.goToAndStop(t,e,r)},tJ.destroy=function(t){var e;for(e=wJ-1;0<=e;e-=1)uJ[e].animation.destroy(t)},tJ.freeze=function(){zJ=!0},tJ.unfreeze=function(){zJ=!1,TJ()},tJ.getRegisteredAnimations=function(){var t,e=uJ.length,r=[];for(t=0;t<e;t+=1)r.push(uJ[t].animation);return r},tJ),tJ,uJ,vJ,wJ,xJ,yJ,zJ,PK,QK,RK,SK,TK,UK,VK;function AJ(t){for(var e=0,r=t.target;e<wJ;)uJ[e].animation===r&&(uJ.splice(e,1),e-=1,wJ-=1,r.isPaused||EJ()),e+=1}function BJ(t,e){if(!t)return null;for(var r=0;r<wJ;){if(uJ[r].elem==t&&null!==uJ[r].elem)return uJ[r].animation;r+=1}var i=new AnimationItem;return FJ(i,t),i.setData(t,e),i}function DJ(){xJ+=1,TJ()}function EJ(){xJ-=1}function FJ(t,e){t.addEventListener("destroy",AJ),t.addEventListener("_active",DJ),t.addEventListener("_idle",EJ),uJ.push({elem:e,animation:t}),wJ+=1}function KJ(t){var e,r=t-vJ;for(e=0;e<wJ;e+=1)uJ[e].animation.advanceTime(r);vJ=t,xJ&&!zJ?window.requestAnimationFrame(KJ):yJ=!0}function LJ(t){vJ=t,window.requestAnimationFrame(KJ)}function TJ(){!zJ&&xJ&&yJ&&(window.requestAnimationFrame(LJ),yJ=!1)}function WK(t){for(var e=0,r=t.target;e<SK;)QK[e].animation===r&&(QK.splice(e,1),e-=1,SK-=1,r.isPaused||$K()),e+=1}function ZK(){TK+=1,nL()}function $K(){TK-=1}function _K(t,e){t.addEventListener("destroy",WK),t.addEventListener("_active",ZK),t.addEventListener("_idle",$K),QK.push({elem:e,animation:t}),SK+=1}function eL(t){var e,r=t-RK;for(e=0;e<SK;e+=1)QK[e].animation.advanceTime(r);RK=t,TK&&!VK?requestAnimationFrame(eL):UK=!0}function fL(t){RK=t,requestAnimationFrame(eL)}function nL(){!VK&&TK&&UK&&(requestAnimationFrame(fL),UK=!1)}PK={},QK=[],RK=0,SK=0,TK=0,UK=!0,VK=!1,PK.registerAnimation=function(t,e){if(!t)return null;for(var r=0;r<SK;){if(QK[r].elem==t&&null!==QK[r].elem)return QK[r].animation;r+=1}var i=new AnimationItem;return _K(i,t),i.setData(t,e),i},PK.loadAnimation=function(t){var e=new AnimationItem;return _K(e,null),e.setParams(t),e},PK.setSpeed=function(t,e){var r;for(r=0;r<SK;r+=1)QK[r].animation.setSpeed(t,e)},PK.setDirection=function(t,e){var r;for(r=0;r<SK;r+=1)QK[r].animation.setDirection(t,e)},PK.play=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.play(t)},PK.pause=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.pause(t)},PK.stop=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.stop(t)},PK.togglePause=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.togglePause(t)},PK.searchAnimations=function(t,e,r){throw new Error("Cannot access DOM from worker thread")},PK.resize=function(){var t;for(t=0;t<SK;t+=1)QK[t].animation.resize()},PK.goToAndStop=function(t,e,r){var i;for(i=0;i<SK;i+=1)QK[i].animation.goToAndStop(t,e,r)},PK.destroy=function(t){var e;for(e=SK-1;0<=e;e-=1)QK[e].animation.destroy(t)},PK.freeze=function(){VK=!0},PK.unfreeze=function(){VK=!1,nL()},PK.getRegisteredAnimations=function(){var t,e=QK.length,r=[];for(t=0;t<e;t+=1)r.push(QK[t].animation);return r},animationManager=PK;var AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=createElementID(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=ProjectInterface(),this.imagePreloader=new ImagePreloader};extendPrototype([BaseEvent],AnimationItem),AnimationItem.prototype.setParams=function(t){t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;default:this.renderer=new HybridRenderer(this,t.rendererSettings)}this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,t.animationData?this.configAnimation(t.animationData):t.path&&("json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json"),-1!=t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),assetLoader.load(t.path,this.configAnimation.bind(this),function(){this.trigger("data_failed")}.bind(this)))},AnimationItem.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;r.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",r.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var s=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===s||(r.loop="false"!==s&&("true"===s||parseInt(s)));var a=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:!i.getNamedItem("bm-autoplay")||i.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,r.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"","false"===(i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"")&&(r.prerender=!1),this.setParams(r)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<s;){if(i[e].id==a[r].id){i[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(s=t.assets.length,e=0;e<s;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var r=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,assetLoader.load(r,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},AnimationItem.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},AnimationItem.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},AnimationItem.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},AnimationItem.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.loaded()?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},AnimationItem.prototype.checkLoaded=function(){this.isLoaded||!this.renderer.globalData.fontManager.loaded()||!this.imagePreloader.loaded()&&"canvas"===this.renderer.rendererType||(this.isLoaded=!0,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=!!t},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){!1!==this.isLoaded&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||!0===this.isPaused&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(!0===this.isPaused?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},AnimationItem.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},AnimationItem.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},AnimationItem.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,r=!1;e>=this.totalFrames-1&&0<this.frameModifier?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(r=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(r=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),r&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},AnimationItem.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(0<this.frameModifier&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.timeCompleted=this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.timeCompleted=this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?r=t:this.currentRawFrame+this.firstFrame>e&&(r=e-t)),this.firstFrame=t,this.timeCompleted=this.totalFrames=e-t,-1!==r&&this.goToAndStop(r,!0)},AnimationItem.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"==typeof t[0]){var r,i=t.length;for(r=0;r<i;r+=1)this.segments.push(t[r])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},AnimationItem.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var r=t.p;-1!==r.indexOf("images/")&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},AnimationItem.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.setParams=function(t){t.context&&(this.context=t.context);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;default:throw new Error("Only canvas renderer is supported when using worker.")}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=null,t.animationData)this.configAnimation(t.animationData);else if(t.path)throw new Error("Canvas worker renderer cannot load animation from url")},AnimationItem.prototype.setData=function(t,e){throw new Error("Cannot set data on wrapper for canvas worker renderer")},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<s;){if(i[e].id==a[r].id){i[e]=a[r];break}e+=1}this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(t&&0!==t.length&&this.autoloadSegments)throw new Error("Cannot load multiple segments in worker.");this.timeCompleted=this.totalFrames},AnimationItem.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},AnimationItem.prototype.imagesLoaded=null,AnimationItem.prototype.preloadImages=null,AnimationItem.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.loadSegments(),this.updaFrameModifier(),this.checkLoaded())},AnimationItem.prototype.waitForFontsLoaded=null,AnimationItem.prototype.checkLoaded=function(){this.isLoaded||(this.isLoaded=!0,dataManager.completeData(this.animationData,null),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),this.gotoFrame())},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},AnimationItem.prototype.getPath=null;var Expressions=(xN={},xN.initExpressions=function(t){var e=0,r=[];t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer),t.renderer.globalData.pushExpression=function(){e+=1},t.renderer.globalData.popExpression=function(){0==(e-=1)&&function(){var t,e=r.length;for(t=0;t<e;t+=1)r[t].release();r.length=0}()},t.renderer.globalData.registerExpressionProperty=function(t){-1===r.indexOf(t)&&r.push(t)}},xN),xN;expressionsPlugin=Expressions;var ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null;function $bm_isInstanceOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function isNumerable(t,e){return"number"===t||"boolean"===t||"string"===t||e instanceof Number}function $bm_neg(t){var e=typeof t;if("number"==e||"boolean"==e||t instanceof Number)return-t;if($bm_isInstanceOfArray(t)){var r,i=t.length,s=[];for(r=0;r<i;r+=1)s[r]=-t[r];return s}return t.propType?t.v:void 0}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(t,e){var r=typeof t,i=typeof e;if("string"==r||"string"==i)return t+e;if(isNumerable(r,t)&&isNumerable(i,e))return t+e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]+e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t+e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]+e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}var add=sum;function sub(t,e){var r=typeof t,i=typeof e;if(isNumerable(r,t)&&isNumerable(i,e))return"string"==r&&(t=parseInt(t)),"string"==i&&(e=parseInt(e)),t-e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]-e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t-e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]-e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}function mul(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t*e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]*e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t*e[i];return r}return 0}function div(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t/e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]/e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t/e[i];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(t,e,r){if(r<e){var i=r;r=e,e=i}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(t){return t*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,i=Math.min(t.length,e.length),s=0;for(r=0;r<i;r+=1)s+=Math.pow(e[r]-t[r],2);return Math.sqrt(s)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,i=t[0],s=t[1],a=t[2],n=Math.max(i,s,a),o=Math.min(i,s,a),h=(n+o)/2;if(n==o)e=r=0;else{var p=n-o;switch(r=.5<h?p/(2-n-o):p/(n+o),n){case i:e=(s-a)/p+(s<a?6:0);break;case s:e=(a-i)/p+2;break;case a:e=(i-s)/p+4}e/=6}return[e,r,h,t[3]]}function hue2rgb(t,e,r){return r<0&&(r+=1),1<r&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}function hslToRgb(t){var e,r,i,s=t[0],a=t[1],n=t[2];if(0===a)e=r=i=n;else{var o=n<.5?n*(1+a):n+a-n*a,h=2*n-o;e=hue2rgb(h,o,s+1/3),r=hue2rgb(h,o,s),i=hue2rgb(h,o,s-1/3)}return[e,r,i,t[3]]}function linear(t,e,r,i,s){if(void 0!==i&&void 0!==s||(i=e,s=r,e=0,r=1),r<e){var a=r;r=e,e=a}if(t<=e)return i;if(r<=t)return s;var n=r===e?0:(t-e)/(r-e);if(!i.length)return i+(s-i)*n;var o,h=i.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=i[o]+(s[o]-i[o])*n;return p}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,i=e.length;t||(t=createTypedArray("float32",i));var s=createTypedArray("float32",i),a=BMMath.random();for(r=0;r<i;r+=1)s[r]=t[r]+a*(e[r]-t[r]);return s}return void 0===t&&(t=0),t+BMMath.random()*(e-t)}function createPath(t,e,r,i){var s,a=t.length,n=shape_pool.newElement();n.setPathData(!!i,a);var o,h,p=[0,0];for(s=0;s<a;s+=1)o=e&&e[s]?e[s]:p,h=r&&r[s]?r[s]:p,n.setTripleAt(t[s][0],t[s][1],h[0]+t[s][0],h[1]+t[s][1],o[0]+t[s][0],o[1]+t[s][1],s,!0);return n}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=-1!==val.indexOf("random"),elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,__expression_functions=[],scoped_bm_rt;if(data.xf){var i,len=data.xf.length;for(i=0;i<len;i+=1)__expression_functions[i]=eval("(function(){ return "+data.xf[i]+"}())")}var expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||!0!==this.data.hd,wiggle=function(t,e){var r,i,s=this.pv.length?this.pv.length:1,a=createTypedArray("float32",s);var n=Math.floor(5*time);for(i=r=0;r<n;){for(i=0;i<s;i+=1)a[i]+=-e+2*e*BMMath.random();r+=1}var o=5*time,h=o-Math.floor(o),p=createTypedArray("float32",s);if(1<s){for(i=0;i<s;i+=1)p[i]=this.pv[i]+a[i]+(-e+2*e*BMMath.random())*h;return p}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);function loopInDuration(t,e){return loopIn(t,e,!0)}function loopOutDuration(t,e){return loopOut(t,e,!0)}thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty)),this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,text,textIndex,textTotal,selectorValue;function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],i=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads;return[-Math.atan2(r[1],r[2])/degToRads,i,0]}function easeOut(t,e,r,i,s){return applyEase(easeOutBez,t,e,r,i,s)}function easeIn(t,e,r,i,s){return applyEase(easeInBez,t,e,r,i,s)}function ease(t,e,r,i,s){return applyEase(easeInOutBez,t,e,r,i,s)}function applyEase(t,e,r,i,s,a){void 0===s?(s=r,a=i):e=(e-r)/(i-r);var n=t(e=1<e?1:e<0?0:e);if($bm_isInstanceOfArray(s)){var o,h=s.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=(a[o]-s[o])*n+s[o];return p}return(a-s)*n+s}function nearestKey(t){var e,r,i,s=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,(t*=elem.comp.globalData.frameRate)<data.k[0].t)r=1,i=data.k[0].t;else{for(e=0;e<s-1;e+=1){if(t===data.k[e].t){r=e+1,i=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){i=t-data.k[e].t>data.k[e+1].t-t?(r=e+2,data.k[e+1].t):(r=e+1,data.k[e].t);break}}-1===r&&(r=e+1,i=data.k[e].t)}else i=r=0;var a={};return a.index=r,a.time=i/elem.comp.globalData.frameRate,a}function key(t){var e,r,i,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);for(t-=1,e={time:data.k[t].t/elem.comp.globalData.frameRate,value:[]},i=(s=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t].s||0===data.k[t].s?data.k[t-1].s:data.k[t].e).length,r=0;r<i;r+=1)e[r]=s[r],e.value[r]=s[r];return e}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(t,e){return"string"==typeof value?void 0===e?value.substring(t):value.substring(t,e):""}function substr(t,e){return"string"==typeof value?void 0===e?value.substr(t):value.substr(t,e):""}var index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random()),globalData=elem.globalData;function executeExpression(t){return value=t,_needsRandom&&seedRandom(randSeed),this.frameExpressionId===elem.globalData.frameId&&"textSelector"!==this.propType?value:("textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),($bm_transform=transform)&&(anchorPoint=transform.anchorPoint)),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),(hasParent=!(!elem.hierarchy||!elem.hierarchy.length))&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,"shape"===scoped_bm_rt.propType&&(scoped_bm_rt=scoped_bm_rt.v),scoped_bm_rt)}return executeExpression}return ob.initiateExpression=initiateExpression,ob}(),expressionHelpers={searchExpressions:function(t,e,r){e.x&&(r.k=!0,r.x=!0,r.initiateExpression=ExpressionManager.initiateExpression,r.effectsSequence.push(r.initiateExpression(t,e,r).bind(r)))},getSpeedAtTime:function(t){var e=this.getValueAtTime(t),r=this.getValueAtTime(t+-.01),i=0;if(e.length){var s;for(s=0;s<e.length;s+=1)i+=Math.pow(r[s]-e[s],2);i=100*Math.sqrt(i)}else i=0;return i},getVelocityAtTime:function(t){if(void 0!==this.vel)return this.vel;var e,r,i=this.getValueAtTime(t),s=this.getValueAtTime(t+-.001);if(i.length)for(e=createTypedArray("float32",i.length),r=0;r<i.length;r+=1)e[r]=(s[r]-i[r])/-.001;else e=(s-i)/-.001;return e},getValueAtTime:function(t){return t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value},getStaticValueAtTime:function(){return this.pv},setGroupProperty:function(t){this.propertyGroup=t}};!function(){function o(t,e,r){if(!this.k||!this.keyframes)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[p.length-1].t;if(h<=l)return this.pv;if(r?s=l-(i=e?Math.abs(l-elem.comp.globalData.frameRate*e):Math.max(0,l-this.elem.data.ip)):((!e||e>p.length-1)&&(e=p.length-1),i=l-(s=p[p.length-1-e].t)),"pingpong"===t){if(Math.floor((h-s)/i)%2!=0)return this.getValueAtTime((i-(h-s)%i+s)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var m=this.getValueAtTime(s/this.comp.globalData.frameRate,0),f=this.getValueAtTime(l/this.comp.globalData.frameRate,0),c=this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0),d=Math.floor((h-s)/i);if(this.pv.length){for(n=(o=new Array(m.length)).length,a=0;a<n;a+=1)o[a]=(f[a]-m[a])*d+c[a];return o}return(f-m)*d+c}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l-.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*((h-l)/this.comp.globalData.frameRate)/5e-4;return o}return u+(h-l)/.001*(u-y)}}return this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0)}function h(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[0].t;if(l<=h)return this.pv;if(r?s=l+(i=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-l)):((!e||e>p.length-1)&&(e=p.length-1),i=(s=p[e].t)-l),"pingpong"===t){if(Math.floor((l-h)/i)%2==0)return this.getValueAtTime(((l-h)%i+l)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var m=this.getValueAtTime(l/this.comp.globalData.frameRate,0),f=this.getValueAtTime(s/this.comp.globalData.frameRate,0),c=this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0),d=Math.floor((l-h)/i)+1;if(this.pv.length){for(n=(o=new Array(m.length)).length,a=0;a<n;a+=1)o[a]=c[a]-(f[a]-m[a])*d;return o}return c-(f-m)*d}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l+.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*(l-h)/.001;return o}return u+(u-y)*(l-h)/.001}}return this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0)}function p(t,e){if(!this.k)return this.pv;if(t=.5*(t||.4),(e=Math.floor(e||5))<=1)return this.pv;var r,i,s=this.comp.renderedFrame/this.comp.globalData.frameRate,a=s-t,n=1<e?(s+t-a)/(e-1):1,o=0,h=0;for(r=this.pv.length?createTypedArray("float32",this.pv.length):0;o<e;){if(i=this.getValueAtTime(a+o*n),this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]+=i[h];else r+=i;o+=1}if(this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]/=e;else r/=e;return r}var s=TransformPropertyFactory.getTransformProperty;TransformPropertyFactory.getTransformProperty=function(t,e,r){var i=s(t,e,r);return i.dynamicProperties.length?i.getValueAtTime=function(t){console.warn("Transform at time not supported")}.bind(i):i.getValueAtTime=function(t){}.bind(i),i.setGroupProperty=expressionHelpers.setGroupProperty,i};var l=PropertyFactory.getProp;PropertyFactory.getProp=function(t,e,r,i,s){var a=l(t,e,r,i,s);a.kf?a.getValueAtTime=expressionHelpers.getValueAtTime.bind(a):a.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(a),a.setGroupProperty=expressionHelpers.setGroupProperty,a.loopOut=o,a.loopIn=h,a.smooth=p,a.getVelocityAtTime=expressionHelpers.getVelocityAtTime.bind(a),a.getSpeedAtTime=expressionHelpers.getSpeedAtTime.bind(a),a.numKeys=1===e.a?e.k.length:0,a.propertyIndex=e.ix;var n=0;return 0!==r&&(n=createTypedArray("float32",1===e.a?e.k[0].s.length:e.k.length)),a._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:n},expressionHelpers.searchExpressions(t,e,a),a.k&&s.addDynamicProperty(a),a};var t=ShapePropertyFactory.getConstructorFunction(),e=ShapePropertyFactory.getKeyframedConstructorFunction();function r(){}r.prototype={vertices:function(t,e){this.k&&this.getValue();var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0));var i,s=r._length,a=r[t],n=r.v,o=createSizedArray(s);for(i=0;i<s;i+=1)o[i]="i"===t||"o"===t?[a[i][0]-n[i][0],a[i][1]-n[i][1]]:[a[i][0],a[i][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var i,s=this._segmentsLength,a=s.lengths,n=s.totalLength*t,o=0,h=a.length,p=0;o<h;){if(p+a[o].addedLength>n){var l=o,m=r.c&&o===h-1?0:o+1,f=(n-p)/a[o].addedLength;i=bez.getPointInSegment(r.v[l],r.v[m],r.o[l],r.i[m],f,a[o]);break}p+=a[o].addedLength,o+=1}return i||(i=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),i},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var i=this.pointOnPath(t,e),s=this.pointOnPath(t+.001,e),a=s[0]-i[0],n=s[1]-i[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2));return"tangent"===r?[a/o,n/o]:[-n/o,a/o]},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},setGroupProperty:expressionHelpers.setGroupProperty,getValueAtTime:expressionHelpers.getStaticValueAtTime},extendPrototype([r],t),extendPrototype([r],e),e.prototype.getValueAtTime=function(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastTime<t?this._caching.lastIndex:0,this._cachingAtTime.lastTime=t,this.interpolateShape(t,this._cachingAtTime.shapeValue,this._cachingAtTime)),this._cachingAtTime.shapeValue},e.prototype.initiateExpression=ExpressionManager.initiateExpression;var n=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(t,e,r,i,s){var a=n(t,e,r,i,s);return a.propertyIndex=e.ix,a.lock=!1,3===r?expressionHelpers.searchExpressions(t,e.pt,a):4===r&&expressionHelpers.searchExpressions(t,e.ks,a),a.k&&t.addDynamicProperty(a),a}}(),TextProperty.prototype.getExpressionValue=function(t,e){var r=this.calculateExpression(e);if(t.t===r)return t;var i={};return this.copyData(i,t),i.t=r.toString(),i.__complete=!1,i},TextProperty.prototype.searchProperty=function(){var t=this.searchKeyframes(),e=this.searchExpressions();return this.kf=t||e,this.kf},TextProperty.prototype.searchExpressions=function(){if(this.data.d.x)return this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.addEffect(this.getExpressionValue.bind(this)),!0};var ShapeExpressionInterface=function(t,e,r){var i;function s(t){if("number"==typeof t)return i[t-1];for(var e=0,r=i.length;e<r;){if(i[e]._name===t)return i[e];e+=1}}return s.propertyGroup=r,i=DT(t,e,s),s.numProperties=i.length,s};function DT(t,e,r){var i,s=[],a=t?t.length:0;for(i=0;i<a;i+=1)"gr"==t[i].ty?s.push(FT(t[i],e[i],r)):"fl"==t[i].ty?s.push(GT(t[i],e[i],r)):"st"==t[i].ty?s.push(HT(t[i],e[i],r)):"tm"==t[i].ty?s.push(IT(t[i],e[i],r)):"tr"==t[i].ty||("el"==t[i].ty?s.push(KT(t[i],e[i],r)):"sr"==t[i].ty?s.push(LT(t[i],e[i],r)):"sh"==t[i].ty?s.push(PT(t[i],e[i],r)):"rc"==t[i].ty?s.push(MT(t[i],e[i],r)):"rd"==t[i].ty?s.push(NT(t[i],e[i],r)):"rp"==t[i].ty&&s.push(OT(t[i],e[i],r)));return s}function FT(t,e,r){var i=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return i.content;default:return i.transform}};i.propertyGroup=function(t){return 1===t?i:r(t-1)};var s=function(t,e,r){function i(t){for(var e=0,r=s.length;e<r;){if(s[e]._name===t||s[e].mn===t||s[e].propertyIndex===t||s[e].ix===t||s[e].ind===t)return s[e];e+=1}if("number"==typeof t)return s[t-1]}var s;return i.propertyGroup=function(t){return 1===t?i:r(t-1)},s=DT(t.it,e.it,i.propertyGroup),i.numProperties=s.length,i.propertyIndex=t.cix,i._name=t.nm,i}(t,e,i.propertyGroup),a=function(e,t,r){function i(t){return 1==t?s:r(--t)}t.transform.mProps.o.setGroupProperty(i),t.transform.mProps.p.setGroupProperty(i),t.transform.mProps.a.setGroupProperty(i),t.transform.mProps.s.setGroupProperty(i),t.transform.mProps.r.setGroupProperty(i),t.transform.mProps.sk&&(t.transform.mProps.sk.setGroupProperty(i),t.transform.mProps.sa.setGroupProperty(i));function s(t){return e.a.ix===t||"Anchor Point"===t?s.anchorPoint:e.o.ix===t||"Opacity"===t?s.opacity:e.p.ix===t||"Position"===t?s.position:e.r.ix===t||"Rotation"===t||"ADBE Vector Rotation"===t?s.rotation:e.s.ix===t||"Scale"===t?s.scale:e.sk&&e.sk.ix===t||"Skew"===t?s.skew:e.sa&&e.sa.ix===t||"Skew Axis"===t?s.skewAxis:void 0}return t.transform.op.setGroupProperty(i),Object.defineProperties(s,{opacity:{get:ExpressionPropertyInterface(t.transform.mProps.o)},position:{get:ExpressionPropertyInterface(t.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(t.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(t.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(t.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(t.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(t.transform.mProps.sa)},_name:{value:e.nm}}),s.ty="tr",s.mn=e.mn,s.propertyGroup=r,s}(t.it[t.it.length-1],e.it[e.it.length-1],i.propertyGroup);return i.content=s,i.transform=a,Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.numProperties=t.np,i.propertyIndex=t.ix,i.nm=t.nm,i.mn=t.mn,i}function GT(t,e,r){function i(t){return"Color"===t||"color"===t?i.color:"Opacity"===t||"opacity"===t?i.opacity:void 0}return Object.defineProperties(i,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(r),e.o.setGroupProperty(r),i}function HT(t,e,r){function i(t){return 1===t?ob:r(t-1)}function s(t){return 1===t?h:i(t-1)}var a,n,o=t.d?t.d.length:0,h={};for(a=0;a<o;a+=1)n=a,Object.defineProperty(h,t.d[n].nm,{get:ExpressionPropertyInterface(e.d.dataProps[n].p)}),e.d.dataProps[a].p.setGroupProperty(s);function p(t){return"Color"===t||"color"===t?p.color:"Opacity"===t||"opacity"===t?p.opacity:"Stroke Width"===t||"stroke width"===t?p.strokeWidth:void 0}return Object.defineProperties(p,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},strokeWidth:{get:ExpressionPropertyInterface(e.w)},dash:{get:function(){return h}},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(i),e.o.setGroupProperty(i),e.w.setGroupProperty(i),p}function IT(e,t,r){function i(t){return 1==t?s:r(--t)}function s(t){return t===e.e.ix||"End"===t||"end"===t?s.end:t===e.s.ix?s.start:t===e.o.ix?s.offset:void 0}return s.propertyIndex=e.ix,t.s.setGroupProperty(i),t.e.setGroupProperty(i),t.o.setGroupProperty(i),s.propertyIndex=e.ix,s.propertyGroup=r,Object.defineProperties(s,{start:{get:ExpressionPropertyInterface(t.s)},end:{get:ExpressionPropertyInterface(t.e)},offset:{get:ExpressionPropertyInterface(t.o)},_name:{value:e.nm}}),s.mn=e.mn,s}function KT(e,t,r){function i(t){return 1==t?a:r(--t)}a.propertyIndex=e.ix;var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.s.ix===t?a.size:void 0}return s.s.setGroupProperty(i),s.p.setGroupProperty(i),Object.defineProperties(a,{size:{get:ExpressionPropertyInterface(s.s)},position:{get:ExpressionPropertyInterface(s.p)},_name:{value:e.nm}}),a.mn=e.mn,a}function LT(e,t,r){function i(t){return 1==t?a:r(--t)}var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.r.ix===t?a.rotation:e.pt.ix===t?a.points:e.or.ix===t||"ADBE Vector Star Outer Radius"===t?a.outerRadius:e.os.ix===t?a.outerRoundness:!e.ir||e.ir.ix!==t&&"ADBE Vector Star Inner Radius"!==t?e.is&&e.is.ix===t?a.innerRoundness:void 0:a.innerRadius}return a.propertyIndex=e.ix,s.or.setGroupProperty(i),s.os.setGroupProperty(i),s.pt.setGroupProperty(i),s.p.setGroupProperty(i),s.r.setGroupProperty(i),e.ir&&(s.ir.setGroupProperty(i),s.is.setGroupProperty(i)),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},rotation:{get:ExpressionPropertyInterface(s.r)},points:{get:ExpressionPropertyInterface(s.pt)},outerRadius:{get:ExpressionPropertyInterface(s.or)},outerRoundness:{get:ExpressionPropertyInterface(s.os)},innerRadius:{get:ExpressionPropertyInterface(s.ir)},innerRoundness:{get:ExpressionPropertyInterface(s.is)},_name:{value:e.nm}}),a.mn=e.mn,a}function MT(e,t,r){function i(t){return 1==t?a:r(--t)}var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.r.ix===t?a.roundness:e.s.ix===t||"Size"===t||"ADBE Vector Rect Size"===t?a.size:void 0}return a.propertyIndex=e.ix,s.p.setGroupProperty(i),s.s.setGroupProperty(i),s.r.setGroupProperty(i),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},roundness:{get:ExpressionPropertyInterface(s.r)},size:{get:ExpressionPropertyInterface(s.s)},_name:{value:e.nm}}),a.mn=e.mn,a}function NT(e,t,r){var i=t;function s(t){if(e.r.ix===t||"Round Corners 1"===t)return s.radius}return s.propertyIndex=e.ix,i.rd.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{radius:{get:ExpressionPropertyInterface(i.rd)},_name:{value:e.nm}}),s.mn=e.mn,s}function OT(e,t,r){function i(t){return 1==t?a:r(--t)}var s=t;function a(t){return e.c.ix===t||"Copies"===t?a.copies:e.o.ix===t||"Offset"===t?a.offset:void 0}return a.propertyIndex=e.ix,s.c.setGroupProperty(i),s.o.setGroupProperty(i),Object.defineProperties(a,{copies:{get:ExpressionPropertyInterface(s.c)},offset:{get:ExpressionPropertyInterface(s.o)},_name:{value:e.nm}}),a.mn=e.mn,a}function PT(t,e,r){var i=e.sh;function s(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return s.path}return i.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{path:{get:function(){return i.k&&i.getValue(),i}},shape:{get:function(){return i.k&&i.getValue(),i}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),s}var TextExpressionInterface=function(e){var r;function t(){}return Object.defineProperty(t,"sourceText",{get:function(){e.textProperty.getValue();var t=e.textProperty.currentData.t;return void 0!==t&&(e.textProperty.currentData.t=void 0,(r=new String(t)).value=t||new String(t)),r}}),t},LayerExpressionInterface=function(e){var r;function i(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return i.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return r;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return i.effect}}i.toWorld=_V,i.fromWorld=aW,i.toComp=_V,i.fromComp=bW,i.sampleImage=cW,i.sourceRectAtTime=e.sourceRectAtTime.bind(e);var t=getDescriptor(r=TransformExpressionInterface((i._elem=e).finalTransform.mProp),"anchorPoint");return Object.defineProperties(i,{hasParent:{get:function(){return e.hierarchy.length}},parent:{get:function(){return e.hierarchy[0].layerInterface}},rotation:getDescriptor(r,"rotation"),scale:getDescriptor(r,"scale"),position:getDescriptor(r,"position"),opacity:getDescriptor(r,"opacity"),anchorPoint:t,anchor_point:t,transform:{get:function(){return r}},active:{get:function(){return e.isInRange}}}),i.startTime=e.data.st,i.index=e.data.ind,i.source=e.data.refId,i.height=0===e.data.ty?e.data.h:100,i.width=0===e.data.ty?e.data.w:100,i.inPoint=e.data.ip/e.comp.globalData.frameRate,i.outPoint=e.data.op/e.comp.globalData.frameRate,i._name=e.data.nm,i.registerMaskInterface=function(t){i.mask=new MaskManagerInterface(t,e)},i.registerEffectsInterface=function(t){i.effect=t},i};function _V(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.applyToPointArray(t[0],t[1],t[2]||0)}return r.applyToPointArray(t[0],t[1],t[2]||0)}function aW(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function bW(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var r,i=this._elem.hierarchy.length;for(r=0;r<i;r+=1)this._elem.hierarchy[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}function cW(){return[1,1,1,1]}var CompExpressionInterface=function(i){function t(t){for(var e=0,r=i.layers.length;e<r;){if(i.layers[e].nm===t||i.layers[e].ind===t)return i.elements[e].layerInterface;e+=1}return null}return Object.defineProperty(t,"_name",{value:i.data.nm}),(t.layer=t).pixelAspect=1,t.height=i.data.h||i.globalData.compSize.h,t.width=i.data.w||i.globalData.compSize.w,t.pixelAspect=1,t.frameDuration=1/i.globalData.frameRate,t.displayStartTime=0,t.numLayers=i.layers.length,t},TransformExpressionInterface=function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}if(Object.defineProperty(e,"rotation",{get:ExpressionPropertyInterface(t.r||t.rz)}),Object.defineProperty(e,"zRotation",{get:ExpressionPropertyInterface(t.rz||t.r)}),Object.defineProperty(e,"xRotation",{get:ExpressionPropertyInterface(t.rx)}),Object.defineProperty(e,"yRotation",{get:ExpressionPropertyInterface(t.ry)}),Object.defineProperty(e,"scale",{get:ExpressionPropertyInterface(t.s)}),t.p)var r=ExpressionPropertyInterface(t.p);return Object.defineProperty(e,"position",{get:function(){return t.p?r():[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:ExpressionPropertyInterface(t.px)}),Object.defineProperty(e,"yPosition",{get:ExpressionPropertyInterface(t.py)}),Object.defineProperty(e,"zPosition",{get:ExpressionPropertyInterface(t.pz)}),Object.defineProperty(e,"anchorPoint",{get:ExpressionPropertyInterface(t.a)}),Object.defineProperty(e,"opacity",{get:ExpressionPropertyInterface(t.o)}),Object.defineProperty(e,"skew",{get:ExpressionPropertyInterface(t.sk)}),Object.defineProperty(e,"skewAxis",{get:ExpressionPropertyInterface(t.sa)}),Object.defineProperty(e,"orientation",{get:ExpressionPropertyInterface(t.or)}),e},ProjectInterface=function(){function t(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return t.compositions=[],t.currentFrame=0,t.registerComposition=LW,t};function LW(t){this.compositions.push(t)}var EffectsExpressionInterface={createEffectsInterface:function(s,t){if(s.effectsManager){var e,a=[],r=s.data.ef,i=s.effectsManager.effectElements.length;for(e=0;e<i;e+=1)a.push(TW(r[e],s.effectsManager.effectElements[e],t,s));return function(t){for(var e=s.data.ef||[],r=0,i=e.length;r<i;){if(t===e[r].nm||t===e[r].mn||t===e[r].ix)return a[r];r+=1}}}}};function TW(s,t,e,r){var i,a=[],n=s.ef.length;for(i=0;i<n;i+=1)5===s.ef[i].ty?a.push(TW(s.ef[i],t.effectElements[i],t.effectElements[i].propertyGroup,r)):a.push(UW(t.effectElements[i],s.ef[i].ty,r,o));function o(t){return 1===t?h:e(t-1)}var h=function(t){for(var e=s.ef,r=0,i=e.length;r<i;){if(t===e[r].nm||t===e[r].mn||t===e[r].ix)return 5===e[r].ty?a[r]:a[r]();r+=1}return a[0]()};return h.propertyGroup=o,"ADBE Color Control"===s.mn&&Object.defineProperty(h,"color",{get:function(){return a[0]()}}),Object.defineProperty(h,"numProperties",{get:function(){return s.np}}),h.active=h.enabled=0!==s.en,h}function UW(t,e,r,i){var s=ExpressionPropertyInterface(t.p);return t.p.setGroupProperty&&t.p.setGroupProperty(i),function(){return 10===e?r.comp.compInterface(t.p.v):s()}}var MaskManagerInterface=function(){function a(t,e){this._mask=t,this._data=e}Object.defineProperty(a.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});return function(e,t){var r,i=createSizedArray(e.viewData.length),s=e.viewData.length;for(r=0;r<s;r+=1)i[r]=new a(e.viewData[r],e.masksProperties[r]);return function(t){for(r=0;r<s;){if(e.masksProperties[r].nm===t)return i[r];r+=1}}}}(),ExpressionPropertyInterface=(KX={pv:0,v:0,mult:1},LX={pv:[0,0,0],v:[0,0,0],mult:1},function(t){return t?"unidimensional"===t.propType?function(t){t&&"pv"in t||(t=KX);var e=1/t.mult,r=t.pv*e,i=new Number(r);return i.value=r,MX(i,t,"unidimensional"),function(){return t.k&&t.getValue(),r=t.v*e,i.value!==r&&((i=new Number(r)).value=r,MX(i,t,"unidimensional")),i}}(t):function(e){e&&"pv"in e||(e=LX);var r=1/e.mult,i=e.pv.length,s=createTypedArray("float32",i),a=createTypedArray("float32",i);return s.value=a,MX(s,e,"multidimensional"),function(){e.k&&e.getValue();for(var t=0;t<i;t+=1)s[t]=a[t]=e.v[t]*r;return s}}(t):PX}),KX,LX,fY,gY;function MX(i,s,a){Object.defineProperty(i,"velocity",{get:function(){return s.getVelocityAtTime(s.comp.currentFrame)}}),i.numKeys=s.keyframes?s.keyframes.length:0,i.key=function(t){if(i.numKeys){var e="";e="s"in s.keyframes[t-1]?s.keyframes[t-1].s:"e"in s.keyframes[t-2]?s.keyframes[t-2].e:s.keyframes[t-2].s;var r="unidimensional"===a?new Number(e):Object.assign({},e);return r.time=s.keyframes[t-1].t/s.elem.comp.globalData.frameRate,r}return 0},i.valueAtTime=s.getValueAtTime,i.speedAtTime=s.getSpeedAtTime,i.velocityAtTime=s.getVelocityAtTime,i.propertyGroup=s.propertyGroup}function PX(){return KX}function hY(t,e){return this.textIndex=t+1,this.textTotal=e,this.v=this.getValue()*this.mult,this.v}function SliderEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(t,e){var r=t.ef||[];this.effectElements=[];var i,s,a=r.length;for(i=0;i<a;i++)s=new GroupEffect(r[i],e),this.effectElements.push(s)}function GroupEffect(t,e){this.init(t,e)}fY=function(t,e){this.pv=1,this.comp=t.comp,this.elem=t,this.mult=.01,this.propType="textSelector",this.textTotal=e.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],this.k=!0,this.x=!0,this.getValue=ExpressionManager.initiateExpression.bind(this)(t,e,this),this.getMult=hY,this.getVelocityAtTime=expressionHelpers.getVelocityAtTime,this.kf?this.getValueAtTime=expressionHelpers.getValueAtTime.bind(this):this.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(this),this.setGroupProperty=expressionHelpers.setGroupProperty},gY=TextSelectorProp.getTextSelectorProp,TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new fY(t,e,r):gY(t,e,r)},extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(t,e){this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var r,i,s=this.data.ef.length,a=this.data.ef;for(r=0;r<s;r+=1){switch(i=null,a[r].ty){case 0:i=new SliderEffect(a[r],e,this);break;case 1:i=new AngleEffect(a[r],e,this);break;case 2:i=new ColorEffect(a[r],e,this);break;case 3:i=new PointEffect(a[r],e,this);break;case 4:case 7:i=new CheckboxEffect(a[r],e,this);break;case 10:i=new LayerIndexEffect(a[r],e,this);break;case 11:i=new MaskIndexEffect(a[r],e,this);break;case 5:i=new EffectsManager(a[r],e,this);break;default:i=new NoValueEffect(a[r],e,this)}i&&this.effectElements.push(i)}};var lottiejs={},_isFrozen=!1;function loadAnimation(t){return animationManager.loadAnimation(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&1<t&&(defaultCurveSegments=t);roundValues(!(50<=defaultCurveSegments))}lottiejs.play=animationManager.play,lottiejs.pause=animationManager.pause,lottiejs.togglePause=animationManager.togglePause,lottiejs.setSpeed=animationManager.setSpeed,lottiejs.setDirection=animationManager.setDirection,lottiejs.stop=animationManager.stop,lottiejs.registerAnimation=animationManager.registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.resize=animationManager.resize,lottiejs.goToAndStop=animationManager.goToAndStop,lottiejs.destroy=animationManager.destroy,lottiejs.setQuality=setQuality,lottiejs.freeze=animationManager.freeze,lottiejs.unfreeze=animationManager.unfreeze,lottiejs.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottiejs.version="5.5.2";var renderer="";return lottiejs}({}),animations=[];onmessage=function(t){if(t&&t.data&&t.data.params&&t.data.canvas){var e=t.data.canvas,r=t.data.params,i=e.getContext("2d"),s=lottiejs.loadAnimation({renderer:"canvas",loop:r.loop,autoplay:r.autoplay,animationData:t.data.animationData,rendererSettings:{context:i,scaleMode:"noScale",clearCanvas:!0}});animations.push(s),s.play()}};
+var lottiejs=function(window){"use strict";var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};function ProjectInterface(){return{}}!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){if("object"==typeof t&&t.length){var e,r=createSizedArray(t.length),i=t.length;for(e=0;e<i;e+=1)r[e]=Math.abs(t[e]);return r}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function BMEnterFrameEvent(t,e,r,i){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=i<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,i){this.type=t,this.currentLoop=r,this.totalLoops=e,this.direction=i<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this.firstFrame=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}roundValues(!1);var createElementID=(B=0,function(){return"__lottie_element_"+ ++B}),B;function HSVtoRGB(t,e,r){var i,s,a,n,o,h,p,l;switch(h=r*(1-e),p=r*(1-(o=6*t-(n=Math.floor(6*t)))*e),l=r*(1-(1-o)*e),n%6){case 0:i=r,s=l,a=h;break;case 1:i=p,s=r,a=h;break;case 2:i=h,s=r,a=l;break;case 3:i=h,s=p,a=r;break;case 4:i=l,s=h,a=r;break;case 5:i=r,s=h,a=p}return[i,s,a]}function RGBtoHSV(t,e,r){var i,s=Math.max(t,e,r),a=Math.min(t,e,r),n=s-a,o=0===s?0:n/s,h=s/255;switch(s){case a:i=0;break;case t:i=e-r+n*(e<r?6:0),i/=6*n;break;case e:i=r-t+2*n,i/=6*n;break;case r:i=t-e+4*n,i/=6*n}return[i,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,1<r[1]?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,1<r[2]?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,1<r[0]?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}var rgbToHex=function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1==e.length?"0"+e:e;return function(t,e,r){return t<0&&(t=0),e<0&&(e=0),r<0&&(r=0),"#"+i[t]+i[e]+i[r]}}();function BaseEvent(){}BaseEvent.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,i=0;i<r;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var r=0,i=this._cbs[t].length;r<i;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,i-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var createTypedArray="function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}:function(t,e){var r,i=0,s=[];switch(t){case"int16":case"uint8c":r=1;break;default:r=1.1}for(i=0;i<e;i+=1)s.push(r);return s};function createSizedArray(t){return Array.apply(null,{length:t})}function createTag(t){return document.createElement(t)}function DynamicPropertyContainer(){}DynamicPropertyContainer.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){this._mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var getBlendMode=(Ja={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return Ja[t]||""}),Ja,Matrix=(La=Math.cos,Ma=Math.sin,Na=Math.tan,Oa=Math.round,function(){this.reset=Pa,this.rotate=Qa,this.rotateX=Ra,this.rotateY=Sa,this.rotateZ=Ta,this.skew=Va,this.skewFromAxis=Wa,this.shear=Ua,this.scale=Xa,this.setTransform=Ya,this.translate=Za,this.transform=$a,this.applyToPoint=db,this.applyToX=eb,this.applyToY=fb,this.applyToZ=gb,this.applyToPointArray=kb,this.applyToTriplePoints=jb,this.applyToPointStringified=lb,this.toCSS=mb,this.to2dCSS=pb,this.clone=bb,this.cloneFromProps=cb,this.equals=ab,this.inversePoints=ib,this.inversePoint=hb,this._t=this.transform,this.isIdentity=_a,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}),La,Ma,Na,Oa;function Pa(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function Qa(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function Ra(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(1,0,0,0,0,e,-r,0,0,r,e,0,0,0,0,1)}function Sa(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,0,r,0,0,1,0,0,-r,0,e,0,0,0,0,1)}function Ta(t){if(0===t)return this;var e=La(t),r=Ma(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function Ua(t,e){return this._t(1,e,t,1,0,0)}function Va(t,e){return this.shear(Na(t),Na(e))}function Wa(t,e){var r=La(e),i=Ma(e);return this._t(r,i,0,0,-i,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Na(t),1,0,0,0,0,1,0,0,0,0,1)._t(r,-i,0,0,i,r,0,0,0,0,1,0,0,0,0,1)}function Xa(t,e,r){return r||0===r||(r=1),1===t&&1===e&&1===r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function Ya(t,e,r,i,s,a,n,o,h,p,l,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=i,this.props[4]=s,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=p,this.props[10]=l,this.props[11]=m,this.props[12]=f,this.props[13]=c,this.props[14]=d,this.props[15]=u,this}function Za(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function $a(t,e,r,i,s,a,n,o,h,p,l,m,f,c,d,u){var y=this.props;if(1===t&&0===e&&0===r&&0===i&&0===s&&1===a&&0===n&&0===o&&0===h&&0===p&&1===l&&0===m)return y[12]=y[12]*t+y[15]*f,y[13]=y[13]*a+y[15]*c,y[14]=y[14]*l+y[15]*d,y[15]=y[15]*u,this._identityCalculated=!1,this;var g=y[0],v=y[1],P=y[2],b=y[3],x=y[4],_=y[5],S=y[6],T=y[7],A=y[8],C=y[9],E=y[10],k=y[11],D=y[12],M=y[13],I=y[14],w=y[15];return y[0]=g*t+v*s+P*h+b*f,y[1]=g*e+v*a+P*p+b*c,y[2]=g*r+v*n+P*l+b*d,y[3]=g*i+v*o+P*m+b*u,y[4]=x*t+_*s+S*h+T*f,y[5]=x*e+_*a+S*p+T*c,y[6]=x*r+_*n+S*l+T*d,y[7]=x*i+_*o+S*m+T*u,y[8]=A*t+C*s+E*h+k*f,y[9]=A*e+C*a+E*p+k*c,y[10]=A*r+C*n+E*l+k*d,y[11]=A*i+C*o+E*m+k*u,y[12]=D*t+M*s+I*h+w*f,y[13]=D*e+M*a+I*p+w*c,y[14]=D*r+M*n+I*l+w*d,y[15]=D*i+M*o+I*m+w*u,this._identityCalculated=!1,this}function _a(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function ab(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function bb(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function cb(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function db(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function eb(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function fb(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function gb(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function hb(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,i=-this.props[1]/e,s=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*s+n,t[0]*i+t[1]*a+o,0]}function ib(t){var e,r=t.length,i=[];for(e=0;e<r;e+=1)i[e]=hb(t[e]);return i}function jb(t,e,r){var i=createTypedArray("float32",6);if(this.isIdentity())i[0]=t[0],i[1]=t[1],i[2]=e[0],i[3]=e[1],i[4]=r[0],i[5]=r[1];else{var s=this.props[0],a=this.props[1],n=this.props[4],o=this.props[5],h=this.props[12],p=this.props[13];i[0]=t[0]*s+t[1]*n+h,i[1]=t[0]*a+t[1]*o+p,i[2]=e[0]*s+e[1]*n+h,i[3]=e[0]*a+e[1]*o+p,i[4]=r[0]*s+r[1]*n+h,i[5]=r[0]*a+r[1]*o+p}return i}function kb(t,e,r){return this.isIdentity()?[t,e,r]:[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function lb(t,e){if(this.isIdentity())return t+","+e;var r=this.props;return Math.round(100*(t*r[0]+e*r[4]+r[12]))/100+","+Math.round(100*(t*r[1]+e*r[5]+r[13]))/100}function mb(){for(var t=0,e=this.props,r="matrix3d(";t<16;)r+=Oa(1e4*e[t])/1e4,r+=15===t?")":",",t+=1;return r}function nb(t){return t<1e-6&&0<t||-1e-6<t&&t<0?Oa(1e4*t)/1e4:t}function pb(){var t=this.props;return"matrix("+nb(t[0])+","+nb(t[1])+","+nb(t[4])+","+nb(t[5])+","+nb(t[12])+","+nb(t[13])+")"}!function(o,h){var p,l=this,m=256,f=6,c="random",d=h.pow(m,f),u=h.pow(2,52),y=2*u,g=m-1;function v(t){var e,r=t.length,n=this,i=0,s=n.i=n.j=0,a=n.S=[];for(r||(t=[r++]);i<m;)a[i]=i++;for(i=0;i<m;i++)a[i]=a[s=g&s+t[i%r]+(e=a[i])],a[s]=e;n.g=function(t){for(var e,r=0,i=n.i,s=n.j,a=n.S;t--;)e=a[i=g&i+1],r=r*m+a[g&(a[i]=a[s=g&s+e])+(a[s]=e)];return n.i=i,n.j=s,r}}function P(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function b(t,e){for(var r,i=t+"",s=0;s<i.length;)e[g&s]=g&(r^=19*e[g&s])+i.charCodeAt(s++);return x(e)}function x(t){return String.fromCharCode.apply(0,t)}h["seed"+c]=function(t,e,r){function i(){for(var t=n.g(f),e=d,r=0;t<u;)t=(t+r)*m,e*=m,r=n.g(1);for(;y<=t;)t/=2,e/=2,r>>>=1;return(t+r)/e}var s=[],a=b(function t(e,r){var i,s=[],a=typeof e;if(r&&"object"==a)for(i in e)try{s.push(t(e[i],r-1))}catch(t){}return s.length?s:"string"==a?e:e+"\0"}((e=!0===e?{entropy:!0}:e||{}).entropy?[t,x(o)]:null===t?function(){try{if(p)return x(p.randomBytes(m));var t=new Uint8Array(m);return(l.crypto||l.msCrypto).getRandomValues(t),x(t)}catch(t){var e=l.navigator,r=e&&e.plugins;return[+new Date,l,r,l.screen,x(o)]}}():t,3),s),n=new v(s);return i.int32=function(){return 0|n.g(4)},i.quick=function(){return n.g(4)/4294967296},i.double=i,b(x(n.S),o),(e.pass||r||function(t,e,r,i){return i&&(i.S&&P(i,n),t.state=function(){return P(n,{})}),r?(h[c]=t,e):t})(i,a,"global"in e?e.global:this==h,e.state)},b(h.random(),o)}([],BMMath);var BezierFactory=(_e={getBezierEasing:function(t,e,r,i,s){var a=s||("bez_"+t+"_"+e+"_"+r+"_"+i).replace(/\./g,"p");if(af[a])return af[a];var n=new rf([t,e,r,i]);return af[a]=n}},af={},gf=11,hf=1/(gf-1),jf="function"==typeof Float32Array,rf.prototype={get:function(t){var e=this._p[0],r=this._p[1],i=this._p[2],s=this._p[3];return this._precomputed||this._precompute(),e===r&&i===s?t:0===t?0:1===t?1:nf(this._getTForX(t),r,s)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],i=this._p[3];this._precomputed=!0,t===e&&r===i||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<gf;++r)this._mSampleValues[r]=nf(r*hf,t,e)},_getTForX:function(t){for(var e=this._p[0],r=this._p[2],i=this._mSampleValues,s=0,a=1,n=gf-1;a!==n&&i[a]<=t;++a)s+=hf;var o=s+(t-i[--a])/(i[a+1]-i[a])*hf,h=of(o,e,r);return.001<=h?function(t,e,r,i){for(var s=0;s<4;++s){var a=of(e,r,i);if(0===a)return e;e-=(nf(e,r,i)-t)/a}return e}(t,o,e,r):0===h?o:function(t,e,r,i,s){for(var a,n,o=0;0<(a=nf(n=e+(r-e)/2,i,s)-t)?r=n:e=n,1e-7<Math.abs(a)&&++o<10;);return n}(t,s,s+hf,e,r)}},_e),_e,af,gf,hf,jf;function kf(t,e){return 1-3*e+3*t}function lf(t,e){return 3*e-6*t}function mf(t){return 3*t}function nf(t,e,r){return((kf(e,r)*t+lf(e,r))*t+mf(e))*t}function of(t,e,r){return 3*kf(e,r)*t*t+2*lf(e,r)*t+mf(e)}function rf(t){this._p=t,this._mSampleValues=jf?new Float32Array(gf):new Array(gf),this._precomputed=!1,this.get=this.get.bind(this)}function extendPrototype(t,e){var r,i,s=t.length;for(r=0;r<s;r+=1)for(var a in i=t[r].prototype)i.hasOwnProperty(a)&&(e.prototype[a]=i[a])}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function createProxyFunction(t){function e(){}return e.prototype=t,e}function bezFunction(){Math;function y(t,e,r,i,s,a){var n=t*i+e*s+r*a-s*i-a*t-r*e;return-.001<n&&n<.001}var l=function(t,e,r,i){var s,a,n,o,h,p,l=defaultCurveSegments,m=0,f=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,s=0;s<l;s+=1){for(h=s/(l-1),a=p=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*i[a]+bm_pow(h,3)*e[a],f[a]=o,null!==c[a]&&(p+=bm_pow(f[a]-c[a],2)),c[a]=f[a];p&&(m+=p=bm_sqrt(p)),d.percents[s]=h,d.lengths[s]=m}return d.addedLength=m,d};function g(t){this.segmentLength=0,this.points=new Array(t)}function v(t,e){this.partialLength=t,this.point=e}var P,t=(P={},function(t,e,r,i){var s=(t[0]+"_"+t[1]+"_"+e[0]+"_"+e[1]+"_"+r[0]+"_"+r[1]+"_"+i[0]+"_"+i[1]).replace(/\./g,"p");if(!P[s]){var a,n,o,h,p,l,m,f=defaultCurveSegments,c=0,d=null;2===t.length&&(t[0]!=e[0]||t[1]!=e[1])&&y(t[0],t[1],e[0],e[1],t[0]+r[0],t[1]+r[1])&&y(t[0],t[1],e[0],e[1],e[0]+i[0],e[1]+i[1])&&(f=2);var u=new g(f);for(o=r.length,a=0;a<f;a+=1){for(m=createSizedArray(o),p=a/(f-1),n=l=0;n<o;n+=1)h=bm_pow(1-p,3)*t[n]+3*bm_pow(1-p,2)*p*(t[n]+r[n])+3*(1-p)*bm_pow(p,2)*(e[n]+i[n])+bm_pow(p,3)*e[n],m[n]=h,null!==d&&(l+=bm_pow(m[n]-d[n],2));c+=l=bm_sqrt(l),u.points[a]=new v(l,m),d=m}u.segmentLength=c,P[s]=u}return P[s]});function D(t,e){var r=e.percents,i=e.lengths,s=r.length,a=bm_floor((s-1)*t),n=t*e.addedLength,o=0;if(a===s-1||0===a||n===i[a])return r[a];for(var h=i[a]>n?-1:1,p=!0;p;)if(i[a]<=n&&i[a+1]>n?(o=(n-i[a])/(i[a+1]-i[a]),p=!1):a+=h,a<0||s-1<=a){if(a===s-1)return r[a];p=!1}return r[a]+(r[a+1]-r[a])*o}var M=createTypedArray("float32",8);return{getSegmentsLength:function(t){var e,r=segments_length_pool.newElement(),i=t.c,s=t.v,a=t.o,n=t.i,o=t._length,h=r.lengths,p=0;for(e=0;e<o-1;e+=1)h[e]=l(s[e],s[e+1],a[e],n[e+1]),p+=h[e].addedLength;return i&&o&&(h[e]=l(s[e],s[0],a[e],n[0]),p+=h[e].addedLength),r.totalLength=p,r},getNewSegment:function(t,e,r,i,s,a,n){var o,h=D(s=s<0?0:1<s?1:s,n),p=D(a=1<a?1:a,n),l=t.length,m=1-h,f=1-p,c=m*m*m,d=h*m*m*3,u=h*h*m*3,y=h*h*h,g=m*m*f,v=h*m*f+m*h*f+m*m*p,P=h*h*f+m*h*p+h*m*p,b=h*h*p,x=m*f*f,_=h*f*f+m*p*f+m*f*p,S=h*p*f+m*p*p+h*f*p,T=h*p*p,A=f*f*f,C=p*f*f+f*p*f+f*f*p,E=p*p*f+f*p*p+p*f*p,k=p*p*p;for(o=0;o<l;o+=1)M[4*o]=Math.round(1e3*(c*t[o]+d*r[o]+u*i[o]+y*e[o]))/1e3,M[4*o+1]=Math.round(1e3*(g*t[o]+v*r[o]+P*i[o]+b*e[o]))/1e3,M[4*o+2]=Math.round(1e3*(x*t[o]+_*r[o]+S*i[o]+T*e[o]))/1e3,M[4*o+3]=Math.round(1e3*(A*t[o]+C*r[o]+E*i[o]+k*e[o]))/1e3;return M},getPointInSegment:function(t,e,r,i,s,a){var n=D(s,a),o=1-n;return[Math.round(1e3*(o*o*o*t[0]+(n*o*o+o*n*o+o*o*n)*r[0]+(n*n*o+o*n*n+n*o*n)*i[0]+n*n*n*e[0]))/1e3,Math.round(1e3*(o*o*o*t[1]+(n*o*o+o*n*o+o*o*n)*r[1]+(n*n*o+o*n*n+n*o*n)*i[1]+n*n*n*e[1]))/1e3]},buildBezierData:t,pointOnLine2D:y,pointOnLine3D:function(t,e,r,i,s,a,n,o,h){if(0===r&&0===a&&0===h)return y(t,e,i,s,n,o);var p,l=Math.sqrt(Math.pow(i-t,2)+Math.pow(s-e,2)+Math.pow(a-r,2)),m=Math.sqrt(Math.pow(n-t,2)+Math.pow(o-e,2)+Math.pow(h-r,2)),f=Math.sqrt(Math.pow(n-i,2)+Math.pow(o-s,2)+Math.pow(h-a,2));return-1e-4<(p=m<l?f<l?l-m-f:f-m-l:m<f?f-m-l:m-l-f)&&p<1e-4}}}!function(){for(var a=0,t=["ms","moz","webkit","o"],e=0;e<t.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[t[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[e]+"CancelAnimationFrame"]||window[t[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t,e){var r=(new Date).getTime(),i=Math.max(0,16-(r-a)),s=setTimeout(function(){t(r+i)},i);return a=r+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction();function dataFunctionManager(){function m(t,e,r){var i,s,a,n,o,h,p=t.length;for(s=0;s<p;s+=1)if("ks"in(i=t[s])&&!i.completed){if(i.completed=!0,i.tt&&(t[s-1].td=i.tt),[],-1,i.hasMask){var l=i.masksProperties;for(n=l.length,a=0;a<n;a+=1)if(l[a].pt.k.i)d(l[a].pt.k);else for(h=l[a].pt.k.length,o=0;o<h;o+=1)l[a].pt.k[o].s&&d(l[a].pt.k[o].s[0]),l[a].pt.k[o].e&&d(l[a].pt.k[o].e[0])}0===i.ty?(i.layers=f(i.refId,e),m(i.layers,e,r)):4===i.ty?c(i.shapes):5==i.ty&&b(i,r)}}function f(t,e){for(var r=0,i=e.length;r<i;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function c(t){var e,r,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)d(t[e].ks.k);else for(i=t[e].ks.k.length,r=0;r<i;r+=1)t[e].ks.k[r].s&&d(t[e].ks.k[r].s[0]),t[e].ks.k[r].e&&d(t[e].ks.k[r].e[0]);!0}else"gr"==t[e].ty&&c(t[e].it)}function d(t){var e,r=t.i.length;for(e=0;e<r;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function o(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}var i,r=(i=[4,4,14],function(t){if(o(i,t.v)&&(s(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&s(t.assets[e].layers)}});function s(t){var e,r,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(r=t[e],void 0,i=r.t.d,r.t.d={k:[{s:i,t:0}]})}var h,a,n=(h=[4,7,99],function(t){if(t.chars&&!o(h,t.v)){var e,r,i,s,a,n=t.chars.length;for(e=0;e<n;e+=1)if(t.chars[e].data&&t.chars[e].data.shapes)for(i=(a=t.chars[e].data.shapes[0].it).length,r=0;r<i;r+=1)(s=a[r].ks.k).__converted||(d(a[r].ks.k),s.__converted=!0)}}),p=(a=[4,1,9],function(t){if(o(a,t.v)&&(u(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&u(t.assets[e].layers)}});function l(t){var e,r,i,s=t.length;for(e=0;e<s;e+=1)if("gr"===t[e].ty)l(t[e].it);else if("fl"===t[e].ty||"st"===t[e].ty)if(t[e].c.k&&t[e].c.k[0].i)for(i=t[e].c.k.length,r=0;r<i;r+=1)t[e].c.k[r].s&&(t[e].c.k[r].s[0]/=255,t[e].c.k[r].s[1]/=255,t[e].c.k[r].s[2]/=255,t[e].c.k[r].s[3]/=255),t[e].c.k[r].e&&(t[e].c.k[r].e[0]/=255,t[e].c.k[r].e[1]/=255,t[e].c.k[r].e[2]/=255,t[e].c.k[r].e[3]/=255);else t[e].c.k[0]/=255,t[e].c.k[1]/=255,t[e].c.k[2]/=255,t[e].c.k[3]/=255}function u(t){var e,r=t.length;for(e=0;e<r;e+=1)4===t[e].ty&&l(t[e].shapes)}var y,g=(y=[4,4,18],function(t){if(o(y,t.v)&&(P(t.layers),t.assets)){var e,r=t.assets.length;for(e=0;e<r;e+=1)t.assets[e].layers&&P(t.assets[e].layers)}});function v(t){var e,r,i;for(e=t.length-1;0<=e;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)t[e].ks.k.c=t[e].closed;else for(i=t[e].ks.k.length,r=0;r<i;r+=1)t[e].ks.k[r].s&&(t[e].ks.k[r].s[0].c=t[e].closed),t[e].ks.k[r].e&&(t[e].ks.k[r].e[0].c=t[e].closed);!0}else"gr"==t[e].ty&&v(t[e].it)}function P(t){var e,r,i,s,a,n,o=t.length;for(r=0;r<o;r+=1){if((e=t[r]).hasMask){var h=e.masksProperties;for(s=h.length,i=0;i<s;i+=1)if(h[i].pt.k.i)h[i].pt.k.c=h[i].cl;else for(n=h[i].pt.k.length,a=0;a<n;a+=1)h[i].pt.k[a].s&&(h[i].pt.k[a].s[0].c=h[i].cl),h[i].pt.k[a].e&&(h[i].pt.k[a].e[0].c=h[i].cl)}4===e.ty&&v(e.shapes)}}function b(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var t={completeData:function(t,e){t.__complete||(p(t),r(t),n(t),g(t),m(t.layers,t.assets,e),t.__complete=!0)}};return t.checkColors=p,t.checkChars=n,t.checkShapes=g,t.completeLayers=m,t}var dataManager=dataFunctionManager();dataManager.completeData=function(t,e){t.__complete||(this.checkColors(t),this.checkChars(t),this.checkShapes(t),this.completeLayers(t.layers,t.assets,e),t.__complete=!0)};var FontManager=function(){var a={w:0,size:0,shapes:[]},t=[];function u(t,e){var r=createTag("span");r.style.fontFamily=e;var i=createTag("span");i.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(i),document.body.appendChild(r);var s=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:s,parent:r}}t=t.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);function e(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()}return e.getCombinedCharacterCodes=function(){return t},e.prototype.addChars=function(t){if(t){this.chars||(this.chars=[]);var e,r,i,s=t.length,a=this.chars.length;for(e=0;e<s;e+=1){for(r=0,i=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(i=!0),r+=1;i||(this.chars.push(t[e]),a+=1)}}},e.prototype.addFonts=function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);var r,i,s,a,n=t.list,o=n.length,h=o;for(r=0;r<o;r+=1){var p,l,m=!0;if(n[r].loaded=!1,n[r].monoCase=u(n[r].fFamily,"monospace"),n[r].sansCase=u(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){if(0<(p=document.querySelectorAll('style[f-forigin="p"][f-family="'+n[r].fFamily+'"], style[f-origin="3"][f-family="'+n[r].fFamily+'"]')).length&&(m=!1),m){var f=createTag("style");f.setAttribute("f-forigin",n[r].fOrigin),f.setAttribute("f-origin",n[r].origin),f.setAttribute("f-family",n[r].fFamily),f.type="text/css",f.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",e.appendChild(f)}}else if("g"===n[r].fOrigin||1===n[r].origin){for(p=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),l=0;l<p.length;l++)-1!==p[l].href.indexOf(n[r].fPath)&&(m=!1);if(m){var c=createTag("link");c.setAttribute("f-forigin",n[r].fOrigin),c.setAttribute("f-origin",n[r].origin),c.type="text/css",c.rel="stylesheet",c.href=n[r].fPath,document.body.appendChild(c)}}else if("t"===n[r].fOrigin||2===n[r].origin){for(p=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),l=0;l<p.length;l++)n[r].fPath===p[l].src&&(m=!1);if(m){var d=createTag("link");d.setAttribute("f-forigin",n[r].fOrigin),d.setAttribute("f-origin",n[r].origin),d.setAttribute("rel","stylesheet"),d.setAttribute("href",n[r].fPath),e.appendChild(d)}}}else n[r].loaded=!0,h-=1;n[r].helper=(i=e,s=n[r],a=void 0,(a=createNS("text")).style.fontSize="100px",a.setAttribute("font-family",s.fFamily),a.setAttribute("font-style",s.fStyle),a.setAttribute("font-weight",s.fWeight),a.textContent="1",s.fClass?(a.style.fontFamily="inherit",a.setAttribute("class",s.fClass)):a.style.fontFamily=s.fFamily,i.appendChild(a),createTag("canvas").getContext("2d").font=s.fWeight+" "+s.fStyle+" 100px "+s.fFamily,a),n[r].cache={},this.fonts.push(n[r])}0===h?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},e.prototype.getCharData=function(t,e,r){for(var i=0,s=this.chars.length;i<s;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===r)return this.chars[i];i+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,r),a},e.prototype.getFontByName=function(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},e.prototype.measureText=function(t,e,r){var i=this.getFontByName(e),s=t.charCodeAt(0);if(!i.cache[s+1]){var a=i.helper;if(" "===t){a.textContent="|"+t+"|";var n=a.getComputedTextLength();a.textContent="||";var o=a.getComputedTextLength();i.cache[s+1]=(n-o)/100}else a.textContent=t,i.cache[s+1]=a.getComputedTextLength()/100}return i.cache[s+1]*r},e.prototype.checkLoadedFonts=function(){var t,e,r,i=this.fonts.length,s=i;for(t=0;t<i;t+=1)this.fonts[t].loaded?s-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,r=this.fonts[t].monoCase.w,e.offsetWidth!==r?(s-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,r=this.fonts[t].sansCase.w,e.offsetWidth!==r&&(s-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==s&&Date.now()-this.initTime<5e3?setTimeout(this.checkLoadedFonts.bind(this),20):setTimeout(function(){this.isLoaded=!0}.bind(this),0)},e.prototype.loaded=function(){return this.isLoaded},e}();FontManager=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()};var PropertyFactory=(km=initialDefaultFrame,lm=Math.abs,{getProp:function(t,e,r,i,s){var a;if(e.k.length)if("number"==typeof e.k[0])a=new vm(t,e,i,s);else switch(r){case 0:a=new wm(t,e,i,s);break;case 1:a=new xm(t,e,i,s)}else a=new um(t,e,i,s);return a.effectsSequence.length&&s.addDynamicProperty(a),a}}),km,lm;function mm(t,e){var r,i=this.offsetTime;"multidimensional"===this.propType&&(r=createTypedArray("float32",this.pv.length));for(var s,a,n,o,h,p,l,m,f=e.lastIndex,c=f,d=this.keyframes.length-1,u=!0;u;){if(s=this.keyframes[c],a=this.keyframes[c+1],c===d-1&&t>=a.t-i){s.h&&(s=a),f=0;break}if(a.t-i>t){f=c;break}c<d-1?c+=1:(f=0,u=!1)}var y,g=a.t-i,v=s.t-i;if(s.to){s.bezierData||(s.bezierData=bez.buildBezierData(s.s,a.s||s.e,s.to,s.ti));var P=s.bezierData;if(g<=t||t<v){var b=g<=t?P.points.length-1:0;for(o=P.points[b].point.length,n=0;n<o;n+=1)r[n]=P.points[b].point[n]}else{s.__fnct?m=s.__fnct:(m=BezierFactory.getBezierEasing(s.o.x,s.o.y,s.i.x,s.i.y,s.n).get,s.__fnct=m),h=m((t-v)/(g-v));var x,_=P.segmentLength*h,S=e.lastFrame<t&&e._lastKeyframeIndex===c?e._lastAddedLength:0;for(l=e.lastFrame<t&&e._lastKeyframeIndex===c?e._lastPoint:0,u=!0,p=P.points.length;u;){if(S+=P.points[l].partialLength,0==_||0===h||l===P.points.length-1){for(o=P.points[l].point.length,n=0;n<o;n+=1)r[n]=P.points[l].point[n];break}if(S<=_&&_<S+P.points[l+1].partialLength){for(x=(_-S)/P.points[l+1].partialLength,o=P.points[l].point.length,n=0;n<o;n+=1)r[n]=P.points[l].point[n]+(P.points[l+1].point[n]-P.points[l].point[n])*x;break}l<p-1?l+=1:u=!1}e._lastPoint=l,e._lastAddedLength=S-P.points[l].partialLength,e._lastKeyframeIndex=c}}else{var T,A,C,E,k;if(d=s.s.length,y=a.s||s.e,this.sh&&1!==s.h)if(g<=t)r[0]=y[0],r[1]=y[1],r[2]=y[2];else if(t<=v)r[0]=s.s[0],r[1]=s.s[1],r[2]=s.s[2];else{!function(t,e){var r=e[0],i=e[1],s=e[2],a=e[3],n=Math.atan2(2*i*a-2*r*s,1-2*i*i-2*s*s),o=Math.asin(2*r*i+2*s*a),h=Math.atan2(2*r*a-2*i*s,1-2*r*r-2*s*s);t[0]=n/degToRads,t[1]=o/degToRads,t[2]=h/degToRads}(r,function(t,e,r){var i,s,a,n,o,h=[],p=t[0],l=t[1],m=t[2],f=t[3],c=e[0],d=e[1],u=e[2],y=e[3];(s=p*c+l*d+m*u+f*y)<0&&(s=-s,c=-c,d=-d,u=-u,y=-y);o=1e-6<1-s?(i=Math.acos(s),a=Math.sin(i),n=Math.sin((1-r)*i)/a,Math.sin(r*i)/a):(n=1-r,r);return h[0]=n*p+o*c,h[1]=n*l+o*d,h[2]=n*m+o*u,h[3]=n*f+o*y,h}(pm(s.s),pm(y),(t-v)/(g-v)))}else for(c=0;c<d;c+=1)1!==s.h&&(h=g<=t?1:t<v?0:(s.o.x.constructor===Array?(s.__fnct||(s.__fnct=[]),s.__fnct[c]?m=s.__fnct[c]:(T=void 0===s.o.x[c]?s.o.x[0]:s.o.x[c],A=void 0===s.o.y[c]?s.o.y[0]:s.o.y[c],C=void 0===s.i.x[c]?s.i.x[0]:s.i.x[c],E=void 0===s.i.y[c]?s.i.y[0]:s.i.y[c],m=BezierFactory.getBezierEasing(T,A,C,E).get,s.__fnct[c]=m)):s.__fnct?m=s.__fnct:(T=s.o.x,A=s.o.y,C=s.i.x,E=s.i.y,m=BezierFactory.getBezierEasing(T,A,C,E).get,s.__fnct=m),m((t-v)/(g-v)))),y=a.s||s.e,k=1===s.h?s.s[c]:s.s[c]+(y[c]-s.s[c])*h,1===d?r=k:r[c]=k}return e.lastIndex=f,r}function pm(t){var e=t[0]*degToRads,r=t[1]*degToRads,i=t[2]*degToRads,s=Math.cos(e/2),a=Math.cos(r/2),n=Math.cos(i/2),o=Math.sin(e/2),h=Math.sin(r/2),p=Math.sin(i/2);return[o*h*n+s*a*p,o*a*n+s*h*p,s*h*n-o*a*p,s*a*n-o*h*p]}function qm(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==km&&(this._caching.lastFrame>=r&&r<=t||this._caching.lastFrame<e&&t<e))){this._caching.lastFrame>=t&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var i=this.interpolateValue(t,this._caching);this.pv=i}return this._caching.lastFrame=t,this.pv}function rm(t){var e;if("unidimensional"===this.propType)e=t*this.mult,1e-5<lm(this.v-e)&&(this.v=e,this._mdf=!0);else for(var r=0,i=this.v.length;r<i;)e=t[r]*this.mult,1e-5<lm(this.v[r]-e)&&(this.v[r]=e,this._mdf=!0),r+=1}function sm(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=this._isFirstFrame;var t,e=this.effectsSequence.length,r=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)r=this.effectsSequence[t](r);this.setVValue(r),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function tm(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function um(t,e,r,i){this.propType="unidimensional",this.mult=r||1,this.data=e,this.v=r?e.k*r:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=sm,this.setVValue=rm,this.addEffect=tm}function vm(t,e,r,i){this.propType="multidimensional",this.mult=r||1,this.data=e,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var s,a=e.k.length;this.v=createTypedArray("float32",a),this.pv=createTypedArray("float32",a);createTypedArray("float32",a);for(this.vel=createTypedArray("float32",a),s=0;s<a;s+=1)this.v[s]=e.k[s]*this.mult,this.pv[s]=e.k[s];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=sm,this.setVValue=rm,this.addEffect=tm}function wm(t,e,r,i){this.propType="unidimensional",this.keyframes=e.k,this.offsetTime=t.data.st,this.frameId=-1,this._caching={lastFrame:km,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=e,this.mult=r||1,this.elem=t,this.container=i,this.comp=t.comp,this.v=km,this.pv=km,this._isFirstFrame=!0,this.getValue=sm,this.setVValue=rm,this.interpolateValue=mm,this.effectsSequence=[qm.bind(this)],this.addEffect=tm}function xm(t,e,r,i){this.propType="multidimensional";var s,a,n,o,h,p=e.k.length;for(s=0;s<p-1;s+=1)e.k[s].to&&e.k[s].s&&e.k[s].e&&(a=e.k[s].s,n=e.k[s].e,o=e.k[s].to,h=e.k[s].ti,(2===a.length&&(a[0]!==n[0]||a[1]!==n[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])||3===a.length&&(a[0]!==n[0]||a[1]!==n[1]||a[2]!==n[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],a[0]+o[0],a[1]+o[1],a[2]+o[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],n[0]+h[0],n[1]+h[1],n[2]+h[2]))&&(e.k[s].to=null,e.k[s].ti=null),a[0]===n[0]&&a[1]===n[1]&&0===o[0]&&0===o[1]&&0===h[0]&&0===h[1]&&(2===a.length||a[2]===n[2]&&0===o[2]&&0===h[2])&&(e.k[s].to=null,e.k[s].ti=null));this.effectsSequence=[qm.bind(this)],this.keyframes=e.k,this.offsetTime=t.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=r||1,this.elem=t,this.container=i,this.comp=t.comp,this.getValue=sm,this.setVValue=rm,this.interpolateValue=mm,this.frameId=-1;var l=e.k[0].s.length;for(this.v=createTypedArray("float32",l),this.pv=createTypedArray("float32",l),s=0;s<l;s+=1)this.v[s]=km,this.pv[s]=km;this._caching={lastFrame:km,lastIndex:0,value:createTypedArray("float32",l)},this.addEffect=tm}var TransformPropertyFactory=(Qo.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(t){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||t){if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var e,r,i=this.elem.globalData.frameRate;if(this.p&&this.p.keyframes&&this.p.getValueAtTime)r=this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(e=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(e=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/i,0)):(e=this.p.pv,this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){e=[],r=[];var s=this.px,a=this.py;s._caching.lastFrame+s.offsetTime<=s.keyframes[0].t?(e[0]=s.getValueAtTime((s.keyframes[0].t+.01)/i,0),e[1]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),r[0]=s.getValueAtTime(s.keyframes[0].t/i,0),r[1]=a.getValueAtTime(a.keyframes[0].t/i,0)):s._caching.lastFrame+s.offsetTime>=s.keyframes[s.keyframes.length-1].t?(e[0]=s.getValueAtTime(s.keyframes[s.keyframes.length-1].t/i,0),e[1]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),r[0]=s.getValueAtTime((s.keyframes[s.keyframes.length-1].t-.01)/i,0),r[1]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0)):(e=[s.pv,a.pv],r[0]=s.getValueAtTime((s._caching.lastFrame+s.offsetTime-.01)/i,s.offsetTime),r[1]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime))}this.v.rotate(-Math.atan2(e[1]-r[1],e[0]-r[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}if(this.r){if(this.r.effectsSequence.length)return;this.pre.rotate(-this.r.v),this.appliedTransformations=4}else this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},extendPrototype([DynamicPropertyContainer],Qo),Qo.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},Qo.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty,{getTransformProperty:function(t,e,r){return new Qo(t,e,r)}});function Qo(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(r||t),e.p&&e.p.s?(this.px=PropertyFactory.getProp(t,e.p.x,0,0,this),this.py=PropertyFactory.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=PropertyFactory.getProp(t,e.p.z,0,0,this))):this.p=PropertyFactory.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=PropertyFactory.getProp(t,e.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(t,e.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(t,e.rz,0,degToRads,this),e.or.k[0].ti){var i,s=e.or.k.length;for(i=0;i<s;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=PropertyFactory.getProp(t,e.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(t,e.r||{k:0},0,degToRads,this);e.sk&&(this.sk=PropertyFactory.getProp(t,e.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(t,e.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=PropertyFactory.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}function ShapePath(){this.c=!1,this._length=0,this._maxLength=8,this.v=createSizedArray(this._maxLength),this.o=createSizedArray(this._maxLength),this.i=createSizedArray(this._maxLength)}ShapePath.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},ShapePath.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},ShapePath.prototype.doubleArrayLength=function(){this.v=this.v.concat(createSizedArray(this._maxLength)),this.i=this.i.concat(createSizedArray(this._maxLength)),this.o=this.o.concat(createSizedArray(this._maxLength)),this._maxLength*=2},ShapePath.prototype.setXYAt=function(t,e,r,i,s){var a;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}a[i]&&(!a[i]||s)||(a[i]=point_pool.newElement()),a[i][0]=t,a[i][1]=e},ShapePath.prototype.setTripleAt=function(t,e,r,i,s,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(r,i,"o",n,o),this.setXYAt(s,a,"i",n,o)},ShapePath.prototype.reverse=function(){var t=new ShapePath;t.setPathData(this.c,this._length);var e=this.v,r=this.o,i=this.i,s=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],r[0][0],r[0][1],0,!1),s=1);var a,n=this._length-1,o=this._length;for(a=s;a<o;a+=1)t.setTripleAt(e[n][0],e[n][1],i[n][0],i[n][1],r[n][0],r[n][1],a,!1),n-=1;return t};var ShapePropertyFactory=function(){var s=-999999;function t(t,e,r){var i,s,a,n,o,h,p,l,m,f=r.lastIndex,c=this.keyframes;if(t<c[0].t-this.offsetTime)i=c[0].s[0],a=!0,f=0;else if(t>=c[c.length-1].t-this.offsetTime)i=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var d,u,y=f,g=c.length-1,v=!0;v&&(d=c[y],!((u=c[y+1]).t-this.offsetTime>t));)y<g-1?y+=1:v=!1;if(f=y,!(a=1===d.h)){if(t>=u.t-this.offsetTime)l=1;else if(t<d.t-this.offsetTime)l=0;else{var P;d.__fnct?P=d.__fnct:(P=BezierFactory.getBezierEasing(d.o.x,d.o.y,d.i.x,d.i.y).get,d.__fnct=P),l=P((t-(d.t-this.offsetTime))/(u.t-this.offsetTime-(d.t-this.offsetTime)))}s=u.s?u.s[0]:d.e[0]}i=d.s[0]}for(h=e._length,p=i.i[0].length,r.lastIndex=f,n=0;n<h;n+=1)for(o=0;o<p;o+=1)m=a?i.i[n][o]:i.i[n][o]+(s.i[n][o]-i.i[n][o])*l,e.i[n][o]=m,m=a?i.o[n][o]:i.o[n][o]+(s.o[n][o]-i.o[n][o])*l,e.o[n][o]=m,m=a?i.v[n][o]:i.v[n][o]+(s.v[n][o]-i.v[n][o])*l,e.v[n][o]=m}function a(){this.paths=this.localShapeCollection}function e(t){!function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,i=t._length;for(r=0;r<i;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0}(this.v,t)&&(this.v=shape_pool.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function r(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=!1;var t,e=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k,r=this.effectsSequence.length;for(t=0;t<r;t+=1)e=this.effectsSequence[t](e);this.setVValue(e),this.lock=!1,this.frameId=this.elem.globalData.frameId}}function n(t,e,r){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var i=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(i),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=a,this.effectsSequence=[]}function i(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function o(t,e,r){this.propType="shape",this.comp=t.comp,this.elem=t,this.container=t,this.offsetTime=t.data.st,this.keyframes=3===r?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=s,this.reset=a,this._caching={lastFrame:s,lastIndex:0},this.effectsSequence=[function(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime,i=this._caching.lastFrame;return i!==s&&(i<e&&t<e||r<i&&r<t)||(this._caching.lastIndex=i<t?this._caching.lastIndex:0,this.interpolateShape(t,this.pv,this._caching)),this._caching.lastFrame=t,this.pv}.bind(this)]}n.prototype.interpolateShape=t,n.prototype.getValue=r,n.prototype.setVValue=e,n.prototype.addEffect=i,o.prototype.getValue=r,o.prototype.interpolateShape=t,o.prototype.setVValue=e,o.prototype.addEffect=i;var h,p=(h=roundCorner,l.prototype={reset:a,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,i=this.s.v[1]/2,s=3!==this.d,a=this.v;a.v[0][0]=t,a.v[0][1]=e-i,a.v[1][0]=s?t+r:t-r,a.v[1][1]=e,a.v[2][0]=t,a.v[2][1]=e+i,a.v[3][0]=s?t-r:t+r,a.v[3][1]=e,a.i[0][0]=s?t-r*h:t+r*h,a.i[0][1]=e-i,a.i[1][0]=s?t+r:t-r,a.i[1][1]=e-i*h,a.i[2][0]=s?t+r*h:t-r*h,a.i[2][1]=e+i,a.i[3][0]=s?t-r:t+r,a.i[3][1]=e+i*h,a.o[0][0]=s?t+r*h:t-r*h,a.o[0][1]=e-i,a.o[1][0]=s?t+r:t-r,a.o[1][1]=e+i*h,a.o[2][0]=s?t-r*h:t+r*h,a.o[2][1]=e+i,a.o[3][0]=s?t-r:t+r,a.o[3][1]=e-i*h}},extendPrototype([DynamicPropertyContainer],l),l);function l(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}var m=(f.prototype={reset:a,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,r,i,s=2*Math.floor(this.pt.v),a=2*Math.PI/s,n=!0,o=this.or.v,h=this.ir.v,p=this.os.v,l=this.is.v,m=2*Math.PI*o/(2*s),f=2*Math.PI*h/(2*s),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(t=this.v._length=0;t<s;t+=1){r=n?p:l,i=n?m:f;var u=(e=n?o:h)*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.setTripleAt(u,y,u-g*i*r*d,y-v*i*r*d,u+g*i*r*d,y+v*i*r*d,t,!0),n=!n,c+=a*d}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,i=this.or.v,s=this.os.v,a=2*Math.PI*i/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,t=this.v._length=0;t<e;t+=1){var h=i*Math.cos(n),p=i*Math.sin(n),l=0===h&&0===p?0:p/Math.sqrt(h*h+p*p),m=0===h&&0===p?0:-h/Math.sqrt(h*h+p*p);h+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(h,p,h-l*a*s*o,p-m*a*s*o,h+l*a*s*o,p+m*a*s*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}},extendPrototype([DynamicPropertyContainer],f),f);function f(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=PropertyFactory.getProp(t,e.ir,0,0,this),this.is=PropertyFactory.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=PropertyFactory.getProp(t,e.pt,0,0,this),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,degToRads,this),this.or=PropertyFactory.getProp(t,e.or,0,0,this),this.os=PropertyFactory.getProp(t,e.os,0,.01,this),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}var c=(d.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,i=this.s.v[1]/2,s=bm_min(r,i,this.r.v),a=s*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+s,t+r,e-i+a,0,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-a,t+r,e+i-s,1,!0),0!==s?(this.v.setTripleAt(t+r-s,e+i,t+r-s,e+i,t+r-a,e+i,2,!0),this.v.setTripleAt(t-r+s,e+i,t-r+a,e+i,t-r+s,e+i,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-s,t-r,e+i-a,4,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+a,t-r,e-i+s,5,!0),this.v.setTripleAt(t-r+s,e-i,t-r+s,e-i,t-r+a,e-i,6,!0),this.v.setTripleAt(t+r-s,e-i,t+r-a,e-i,t+r-s,e-i,7,!0)):(this.v.setTripleAt(t-r,e+i,t-r+a,e+i,t-r,e+i,2),this.v.setTripleAt(t-r,e-i,t-r,e-i+a,t-r,e-i,3))):(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+a,t+r,e-i+s,0,!0),0!==s?(this.v.setTripleAt(t+r-s,e-i,t+r-s,e-i,t+r-a,e-i,1,!0),this.v.setTripleAt(t-r+s,e-i,t-r+a,e-i,t-r+s,e-i,2,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+s,t-r,e-i+a,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-a,t-r,e+i-s,4,!0),this.v.setTripleAt(t-r+s,e+i,t-r+s,e+i,t-r+a,e+i,5,!0),this.v.setTripleAt(t+r-s,e+i,t+r-a,e+i,t+r-s,e+i,6,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-s,t+r,e+i-a,7,!0)):(this.v.setTripleAt(t-r,e-i,t-r+a,e-i,t-r,e-i,1,!0),this.v.setTripleAt(t-r,e+i,t-r,e+i-a,t-r,e+i,2,!0),this.v.setTripleAt(t+r,e+i,t+r-a,e+i,t+r,e+i,3,!0)))},getValue:function(t){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:a},extendPrototype([DynamicPropertyContainer],d),d);function d(t,e){this.v=shape_pool.newElement(),this.v.c=!0,this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}var u={getShapeProp:function(t,e,r){var i;return 3===r||4===r?i=(3===r?e.pt:e.ks).k.length?new o(t,e,r):new n(t,e,r):5===r?i=new c(t,e):6===r?i=new p(t,e):7===r&&(i=new m(t,e)),i.k&&t.addDynamicProperty(i),i},getConstructorFunction:function(){return n},getKeyframedConstructorFunction:function(){return o}};return u}(),ShapeModifiers=(Tr={},Ur={},Tr.registerModifier=function(t,e){Ur[t]||(Ur[t]=e)},Tr.getModifier=function(t,e,r){return new Ur[t](e,r)},Tr),Tr,Ur;function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function RepeaterModifier(){}function ShapeCollection(){this._length=0,this._maxLength=4,this.shapes=createSizedArray(this._maxLength)}function DashProperty(t,e,r,i){this.elem=t,this.frameId=-1,this.dataProps=createSizedArray(e.length),this.renderer=r,this.k=!1,this.dashStr="",this.dashArray=createTypedArray("float32",e.length?e.length-1:0),this.dashoffset=createTypedArray("float32",1),this.initDynamicPropertyContainer(i);var s,a,n=e.length||0;for(s=0;s<n;s+=1)a=PropertyFactory.getProp(t,e[s].v,0,0,this),this.k=a.k||this.k,this.dataProps[s]={n:e[s].n,p:a};this.k||this.getValue(!0),this._isAnimated=this.k}function GradientProperty(t,e,r){this.data=e,this.c=createTypedArray("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=createTypedArray("float32",i),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.initDynamicPropertyContainer(r),this.prop=PropertyFactory.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,localShapeCollection:shapeCollection_pool.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},ShapeModifier.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(t,e){this.s=PropertyFactory.getProp(t,e.s,0,.01,this),this.e=PropertyFactory.getProp(t,e.e,0,.01,this),this.o=PropertyFactory.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(t){t.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(t,e,r,i,s){var a=[];e<=1?a.push({s:t,e:e}):1<=t?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],p=a.length;for(n=0;n<p;n+=1){var l,m;if((o=a[n]).e*s<i||o.s*s>i+r);else l=o.s*s<=i?0:(o.s*s-i)/r,m=o.e*s>=i+r?1:(o.e*s-i)/r,h.push([l,m])}return h.length||h.push([0,0]),h},TrimModifier.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},TrimModifier.prototype.processShapes=function(t){var e,r,i;if(this._mdf||t){var s=this.o.v%360/360;if(s<0&&(s+=1),e=(1<this.s.v?1:this.s.v<0?0:this.s.v)+s,(r=(1<this.e.v?1:this.e.v<0?0:this.e.v)+s)<e){var a=e;e=r,r=a}e=1e-4*Math.round(1e4*e),r=1e-4*Math.round(1e4*r),this.sValue=e,this.eValue=r}else e=this.sValue,r=this.eValue;var n,o,h,p,l,m,f=this.shapes.length,c=0;if(r===e)for(n=0;n<f;n+=1)this.shapes[n].localShapeCollection.releaseShapes(),this.shapes[n].shape._mdf=!0,this.shapes[n].shape.paths=this.shapes[n].localShapeCollection;else if(1===r&&0===e||0===r&&1===e){if(this._mdf)for(n=0;n<f;n+=1)this.shapes[n].pathsData.length=0,this.shapes[n].shape._mdf=!0}else{var d,u,y=[];for(n=0;n<f;n+=1)if((d=this.shapes[n]).shape._mdf||this._mdf||t||2===this.m){if(h=(i=d.shape.paths)._length,m=0,!d.shape._mdf&&d.pathsData.length)m=d.totalShapeLength;else{for(p=this.releasePathsData(d.pathsData),o=0;o<h;o+=1)l=bez.getSegmentsLength(i.shapes[o]),p.push(l),m+=l.totalLength;d.totalShapeLength=m,d.pathsData=p}c+=m,d.shape._mdf=!0}else d.shape.paths=d.localShapeCollection;var g,v=e,P=r,b=0;for(n=f-1;0<=n;n-=1)if((d=this.shapes[n]).shape._mdf){for((u=d.localShapeCollection).releaseShapes(),2===this.m&&1<f?(g=this.calculateShapeEdges(e,r,d.totalShapeLength,b,c),b+=d.totalShapeLength):g=[[v,P]],h=g.length,o=0;o<h;o+=1){v=g[o][0],P=g[o][1],y.length=0,P<=1?y.push({s:d.totalShapeLength*v,e:d.totalShapeLength*P}):1<=v?y.push({s:d.totalShapeLength*(v-1),e:d.totalShapeLength*(P-1)}):(y.push({s:d.totalShapeLength*v,e:d.totalShapeLength}),y.push({s:0,e:d.totalShapeLength*(P-1)}));var x=this.addShapes(d,y[0]);if(y[0].s!==y[0].e){if(1<y.length)if(d.shape.paths.shapes[d.shape.paths._length-1].c){var _=x.pop();this.addPaths(x,u),x=this.addShapes(d,y[1],_)}else this.addPaths(x,u),x=this.addShapes(d,y[1]);this.addPaths(x,u)}}d.shape.paths=u}}},TrimModifier.prototype.addPaths=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)e.addShape(t[r])},TrimModifier.prototype.addSegment=function(t,e,r,i,s,a,n){s.setXYAt(e[0],e[1],"o",a),s.setXYAt(r[0],r[1],"i",a+1),n&&s.setXYAt(t[0],t[1],"v",a),s.setXYAt(i[0],i[1],"v",a+1)},TrimModifier.prototype.addSegmentFromArray=function(t,e,r,i){e.setXYAt(t[1],t[5],"o",r),e.setXYAt(t[2],t[6],"i",r+1),i&&e.setXYAt(t[0],t[4],"v",r),e.setXYAt(t[3],t[7],"v",r+1)},TrimModifier.prototype.addShapes=function(t,e,r){var i,s,a,n,o,h,p,l,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(l=r?(o=r._length,r._length):(r=shape_pool.newElement(),o=0),u.push(r),i=0;i<c;i+=1){for(h=m[i].lengths,r.c=f[i].c,a=f[i].c?h.length:h.length+1,s=1;s<a;s+=1)if(d+(n=h[s-1]).addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[i].v[s-1],f[i].o[s-1],f[i].i[s],f[i].v[s],r,o,y),y=!1):(p=bez.getNewSegment(f[i].v[s-1],f[i].v[s],f[i].o[s-1],f[i].i[s],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(f[i].c&&h.length){if(n=h[s-1],d<=e.e){var g=h[s-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[i].v[s-1],f[i].o[s-1],f[i].i[0],f[i].v[0],r,o,y),y=!1):(p=bez.getNewSegment(f[i].v[s-1],f[i].v[0],f[i].o[s-1],f[i].i[0],(e.s-d)/g,(e.e-d)/g,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r.setXYAt(r.v[l][0],r.v[l][1],"i",l),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;i<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var i,s,a,n,o,h,p,l,m,f,c,d,u,y=t._length,g=0;for(i=0;i<y;i+=1)s=t.v[i],n=t.o[i],a=t.i[i],s[0]===n[0]&&s[1]===n[1]&&s[0]===a[0]&&s[1]===a[1]?0!==i&&i!==y-1||t.c?(o=0===i?t.v[y-1]:t.v[i-1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=d=s[0]+(o[0]-s[0])*p,m=u=s[1]-(s[1]-o[1])*p,f=l-(l-s[0])*roundCorner,c=m-(m-s[1])*roundCorner,r.setTripleAt(l,m,f,c,d,u,g),g+=1,o=i===y-1?t.v[0]:t.v[i+1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=f=s[0]+(o[0]-s[0])*p,m=c=s[1]+(o[1]-s[1])*p,d=l-(l-s[0])*roundCorner,u=m-(m-s[1])*roundCorner,r.setTripleAt(l,m,f,c,d,u,g)):r.setTripleAt(s[0],s[1],n[0],n[1],a[0],a[1],g):r.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],g),g+=1;return r},RoundCornersModifier.prototype.processShapes=function(t){var e,r,i,s,a,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(r=0;r<o;r+=1){if((a=this.shapes[r]).shape.paths,n=a.localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,s=a.shape.paths._length,i=0;i<s;i+=1)n.addShape(this.processPath(e[i],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier),extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(t,e.c,0,null,this),this.o=PropertyFactory.getProp(t,e.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(t,e.tr,this),this.so=PropertyFactory.getProp(t,e.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(t,e,r,i,s,a){var n=a?-1:1,o=i.s.v[0]+(1-i.s.v[0])*(1-s),h=i.s.v[1]+(1-i.s.v[1])*(1-s);t.translate(i.p.v[0]*n*s,i.p.v[1]*n*s,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*s),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),r.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(i.a.v[0],i.a.v[1],i.a.v[2])},RepeaterModifier.prototype.init=function(t,e,r,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=i,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[r]);for(;0<r;)r-=1,this._elements.unshift(e[r]),1;this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},RepeaterModifier.prototype.cloneElements=function(t){t.length;var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},RepeaterModifier.prototype.changeGroupRender=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},RepeaterModifier.prototype.processShapes=function(t){var e,r,i,s,a;if(this._mdf||t){var n,o=Math.ceil(this.c.v);if(this._groups.length<o){for(;this._groups.length<o;){var h={it:this.cloneElements(this._elements),ty:"gr"};h.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,h),this._groups.splice(0,0,h),this._currentCopies+=1}this.elem.reloadShapes()}for(i=a=0;i<=this._groups.length-1;i+=1)n=a<o,this._groups[i]._render=n,this.changeGroupRender(this._groups[i].it,n),a+=1;this._currentCopies=o;var p=this.o.v,l=p%1,m=0<p?Math.floor(p):Math.ceil(p),f=(this.tr.v.props,this.pMatrix.props),c=this.rMatrix.props,d=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var u,y,g=0;if(0<p){for(;g<m;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),g+=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,l,!1),g+=l)}else if(p<0){for(;m<g;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),g-=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-l,!0),g-=l)}for(i=1===this.data.m?0:this._currentCopies-1,s=1===this.data.m?1:-1,a=this._currentCopies;a;){if(y=(r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==g){for((0!==i&&1===s||i!==this._currentCopies-1&&-1===s)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),this.matrix.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15]),u=0;u<y;u+=1)r[u]=this.matrix.props[u];this.matrix.reset()}else for(this.matrix.reset(),u=0;u<y;u+=1)r[u]=this.matrix.props[u];g+=1,a-=1,i+=s}}else for(a=this._currentCopies,i=0,s=1;a;)r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,a-=1,i+=s},RepeaterModifier.prototype.addShape=function(){},ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeCollection.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(createSizedArray(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ShapeCollection.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,r=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),GradientProperty.prototype.comparePoints=function(t,e){for(var r=0,i=this.o.length/2;r<i;){if(.01<Math.abs(t[4*r]-t[4*e+2*r]))return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,r,i,s=4*this.data.p;for(e=0;e<s;e+=1)r=e%4==0?100:255,i=Math.round(this.prop.v[e]*r),this.c[e]!==i&&(this.c[e]=i,this._cmdf=!t);if(this.o.length)for(s=this.prop.v.length,e=4*this.data.p;e<s;e+=1)r=e%2==0?100:1,i=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this._omdf=!t);this._mdf=!t}},extendPrototype([DynamicPropertyContainer],GradientProperty);var buildShapeString=function(t,e,r,i){if(0===e)return"";var s,a=t.o,n=t.i,o=t.v,h=" M"+i.applyToPointStringified(o[0][0],o[0][1]);for(s=1;s<e;s+=1)h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[s][0],n[s][1])+" "+i.applyToPointStringified(o[s][0],o[s][1]);return r&&e&&(h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[0][0],n[0][1])+" "+i.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},ImagePreloader=function(){},featureSupport=(Iv={maskType:!0},(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(Iv.maskType=!1),Iv),Iv,filtersFactory=(Jv={},Jv.createFilter=function(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e},Jv.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},Jv),Jv,assetLoader={load:function(t,e,r){var i,s=new XMLHttpRequest;s.open("GET",t,!0);try{s.responseType="json"}catch(t){}s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i=Pv(s),e(i);else try{i=Pv(s),e(i)}catch(t){r&&r(t)}}}};function Pv(t){return t.response&&"object"==typeof t.response?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):void 0}var assetLoader=null;function TextAnimatorProperty(t,e,r){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=createSizedArray(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(r)}function TextAnimatorDataProperty(t,e,r){var i={propType:!1},s=PropertyFactory.getProp,a=e.a;this.a={r:a.r?s(t,a.r,0,degToRads,r):i,rx:a.rx?s(t,a.rx,0,degToRads,r):i,ry:a.ry?s(t,a.ry,0,degToRads,r):i,sk:a.sk?s(t,a.sk,0,degToRads,r):i,sa:a.sa?s(t,a.sa,0,degToRads,r):i,s:a.s?s(t,a.s,1,.01,r):i,a:a.a?s(t,a.a,1,0,r):i,o:a.o?s(t,a.o,0,.01,r):i,p:a.p?s(t,a.p,1,0,r):i,sw:a.sw?s(t,a.sw,0,0,r):i,sc:a.sc?s(t,a.sc,1,0,r):i,fc:a.fc?s(t,a.fc,1,0,r):i,fh:a.fh?s(t,a.fh,0,0,r):i,fs:a.fs?s(t,a.fs,0,.01,r):i,fb:a.fb?s(t,a.fb,0,.01,r):i,t:a.t?s(t,a.t,0,0,r):i},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,i,s,a){this.o=t,this.sw=e,this.sc=r,this.fc=i,this.m=s,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!r,fc:!!i,m:!0,p:!0}}function TextProperty(t,e){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}TextAnimatorProperty.prototype.searchProperties=function(){var t,e,r=this._textData.a.length,i=PropertyFactory.getProp;for(t=0;t<r;t+=1)e=this._textData.a[t],this._animatorsData[t]=new TextAnimatorDataProperty(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this),l:i(this._elem,this._textData.p.l,0,0,this),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var r,i,s,a,n,o,h,p,l,m,f,c,d,u,y,g,v,P,b,x=this._moreOptions.alignment.v,_=this._animatorsData,S=this._textData,T=this.mHelper,A=this._renderType,C=this.renderedLetters.length,E=(this.data,t.l);if(this._hasMaskedPath){if(b=this._pathData.m,!this._pathData.n||this._pathData._mdf){var k,D=b.v;for(this._pathData.r&&(D=D.reverse()),n={tLength:0,segments:[]},a=D._length-1,s=g=0;s<a;s+=1)k=bez.buildBezierData(D.v[s],D.v[s+1],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[s+1][0]-D.v[s+1][0],D.i[s+1][1]-D.v[s+1][1]]),n.tLength+=k.segmentLength,n.segments.push(k),g+=k.segmentLength;s=a,b.v.c&&(k=bez.buildBezierData(D.v[s],D.v[0],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[0][0]-D.v[0][0],D.i[0][1]-D.v[0][1]]),n.tLength+=k.segmentLength,n.segments.push(k),g+=k.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,m=1,l=!(p=f=0),u=n.segments,o<0&&b.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),m=(d=u[f=u.length-1].points).length-1;o<0;)o+=d[m].partialLength,(m-=1)<0&&(m=(d=u[f-=1].points).length-1);c=(d=u[f].points)[m-1],y=(h=d[m]).partialLength}a=E.length,i=r=0;var M,I,w,F,V=1.2*t.finalSize*.714,R=!0;w=_.length;var L,z,O,B,N,G,j,J,K,q,H,W,X,Y=-1,Q=o,$=f,U=m,Z=-1,tt="",et=this.defaultPropsArray;if(2===t.j||1===t.j){var rt=0,it=0,st=2===t.j?-.5:-1,at=0,nt=!0;for(s=0;s<a;s+=1)if(E[s].n){for(rt&&(rt+=it);at<s;)E[at].animatorJustifyOffset=rt,at+=1;nt=!(rt=0)}else{for(I=0;I<w;I+=1)(M=_[I].a).t.propType&&(nt&&2===t.j&&(it+=M.t.v*st),(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?rt+=M.t.v*L[0]*st:rt+=M.t.v*L*st);nt=!1}for(rt&&(rt+=it);at<s;)E[at].animatorJustifyOffset=rt,at+=1}for(s=0;s<a;s+=1){if(T.reset(),N=1,E[s].n)r=0,i+=t.yOffset,i+=R?1:0,o=Q,R=!1,0,this._hasMaskedPath&&(m=U,c=(d=u[f=$].points)[m-1],y=(h=d[m]).partialLength,p=0),X=q=W=tt="",et=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Z!==E[s].line){switch(t.j){case 1:o+=g-t.lineWidths[E[s].line];break;case 2:o+=(g-t.lineWidths[E[s].line])/2}Z=E[s].line}Y!==E[s].ind&&(E[Y]&&(o+=E[Y].extra),o+=E[s].an/2,Y=E[s].ind),o+=x[0]*E[s].an/200;var ot=0;for(I=0;I<w;I+=1)(M=_[I].a).p.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?ot+=M.p.v[0]*L[0]:ot+=M.p.v[0]*L),M.a.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?ot+=M.a.v[0]*L[0]:ot+=M.a.v[0]*L);for(l=!0;l;)o+ot<=p+y||!d?(v=(o+ot-p)/h.partialLength,O=c.point[0]+(h.point[0]-c.point[0])*v,B=c.point[1]+(h.point[1]-c.point[1])*v,T.translate(-x[0]*E[s].an/200,-x[1]*V/100),l=!1):d&&(p+=h.partialLength,(m+=1)>=d.length&&(m=0,d=u[f+=1]?u[f].points:b.v.c?u[f=m=0].points:(p-=h.partialLength,null)),d&&(c=h,y=(h=d[m]).partialLength));z=E[s].an/2-E[s].add,T.translate(-z,0,0)}else z=E[s].an/2-E[s].add,T.translate(-z,0,0),T.translate(-x[0]*E[s].an/200,-x[1]*V/100,0);for(E[s].l/2,I=0;I<w;I+=1)(M=_[I].a).t.propType&&(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),0===r&&0===t.j||(this._hasMaskedPath?L.length?o+=M.t.v*L[0]:o+=M.t.v*L:L.length?r+=M.t.v*L[0]:r+=M.t.v*L));for(E[s].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(G=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(J=[t.fc[0],t.fc[1],t.fc[2]]),I=0;I<w;I+=1)(M=_[I].a).a.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?T.translate(-M.a.v[0]*L[0],-M.a.v[1]*L[1],M.a.v[2]*L[2]):T.translate(-M.a.v[0]*L,-M.a.v[1]*L,M.a.v[2]*L));for(I=0;I<w;I+=1)(M=_[I].a).s.propType&&((L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars)).length?T.scale(1+(M.s.v[0]-1)*L[0],1+(M.s.v[1]-1)*L[1],1):T.scale(1+(M.s.v[0]-1)*L,1+(M.s.v[1]-1)*L,1));for(I=0;I<w;I+=1){if(M=_[I].a,L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),M.sk.propType&&(L.length?T.skewFromAxis(-M.sk.v*L[0],M.sa.v*L[1]):T.skewFromAxis(-M.sk.v*L,M.sa.v*L)),M.r.propType&&(L.length?T.rotateZ(-M.r.v*L[2]):T.rotateZ(-M.r.v*L)),M.ry.propType&&(L.length?T.rotateY(M.ry.v*L[1]):T.rotateY(M.ry.v*L)),M.rx.propType&&(L.length?T.rotateX(M.rx.v*L[0]):T.rotateX(M.rx.v*L)),M.o.propType&&(L.length?N+=(M.o.v*L[0]-N)*L[0]:N+=(M.o.v*L-N)*L),t.strokeWidthAnim&&M.sw.propType&&(L.length?j+=M.sw.v*L[0]:j+=M.sw.v*L),t.strokeColorAnim&&M.sc.propType)for(K=0;K<3;K+=1)L.length?G[K]=G[K]+(M.sc.v[K]-G[K])*L[0]:G[K]=G[K]+(M.sc.v[K]-G[K])*L;if(t.fillColorAnim&&t.fc){if(M.fc.propType)for(K=0;K<3;K+=1)L.length?J[K]=J[K]+(M.fc.v[K]-J[K])*L[0]:J[K]=J[K]+(M.fc.v[K]-J[K])*L;M.fh.propType&&(J=L.length?addHueToRGB(J,M.fh.v*L[0]):addHueToRGB(J,M.fh.v*L)),M.fs.propType&&(J=L.length?addSaturationToRGB(J,M.fs.v*L[0]):addSaturationToRGB(J,M.fs.v*L)),M.fb.propType&&(J=L.length?addBrightnessToRGB(J,M.fb.v*L[0]):addBrightnessToRGB(J,M.fb.v*L))}}for(I=0;I<w;I+=1)(M=_[I].a).p.propType&&(L=_[I].s.getMult(E[s].anIndexes[I],S.a[I].s.totalChars),this._hasMaskedPath?L.length?T.translate(0,M.p.v[1]*L[0],-M.p.v[2]*L[1]):T.translate(0,M.p.v[1]*L,-M.p.v[2]*L):L.length?T.translate(M.p.v[0]*L[0],M.p.v[1]*L[1],-M.p.v[2]*L[2]):T.translate(M.p.v[0]*L,M.p.v[1]*L,-M.p.v[2]*L));if(t.strokeWidthAnim&&(q=j<0?0:j),t.strokeColorAnim&&(H="rgb("+Math.round(255*G[0])+","+Math.round(255*G[1])+","+Math.round(255*G[2])+")"),t.fillColorAnim&&t.fc&&(W="rgb("+Math.round(255*J[0])+","+Math.round(255*J[1])+","+Math.round(255*J[2])+")"),this._hasMaskedPath){if(T.translate(0,-t.ls),T.translate(0,x[1]*V/100+i,0),S.p.p){P=(h.point[1]-c.point[1])/(h.point[0]-c.point[0]);var ht=180*Math.atan(P)/Math.PI;h.point[0]<c.point[0]&&(ht+=180),T.rotate(-ht*Math.PI/180)}T.translate(O,B,0),o-=x[0]*E[s].an/200,E[s+1]&&Y!==E[s+1].ind&&(o+=E[s].an/2,o+=t.tr/1e3*t.finalSize)}else{switch(T.translate(r,i,0),t.ps&&T.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:T.translate(E[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[E[s].line]),0,0);break;case 2:T.translate(E[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[E[s].line])/2,0,0)}T.translate(0,-t.ls),T.translate(z,0,0),T.translate(x[0]*E[s].an/200,x[1]*V/100,0),r+=E[s].l+t.tr/1e3*t.finalSize}"html"===A?tt=T.toCSS():"svg"===A?tt=T.to2dCSS():et=[T.props[0],T.props[1],T.props[2],T.props[3],T.props[4],T.props[5],T.props[6],T.props[7],T.props[8],T.props[9],T.props[10],T.props[11],T.props[12],T.props[13],T.props[14],T.props[15]],X=N}C<=s?(F=new LetterProps(X,q,H,W,tt,et),this.renderedLetters.push(F),C+=1,this.lettersChangedFlag=!0):(F=this.renderedLetters[s],this.lettersChangedFlag=F.update(X,q,H,W,tt,et)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),LetterProps.prototype.update=function(t,e,r,i,s,a){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1;var n=this._mdf.p=!1;return this.o!==t&&(this.o=t,n=this._mdf.o=!0),this.sw!==e&&(this.sw=e,n=this._mdf.sw=!0),this.sc!==r&&(this.sc=r,n=this._mdf.sc=!0),this.fc!==i&&(this.fc=i,n=this._mdf.fc=!0),this.m!==s&&(this.m=s,n=this._mdf.m=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,n=this._mdf.p=!0),n},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},TextProperty.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=1<this.data.d.k.length,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,r=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{this.lock=!0,this._mdf=!1;var i,s=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(i=0;i<s;i+=1)a=r!==this.keysIndex?this.effectsSequence[i](a,a.t):this.effectsSequence[i](this.currentData,a.t);e!==a&&this.setCurrentData(a),this.pv=this.v=this.currentData,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},TextProperty.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,r=0,i=t.length;r<=i-1&&(t[r].s,!(r===i-1||t[r+1].t>e));)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(t){for(var e=FontManager.getCombinedCharacterCodes(),r=[],i=0,s=t.length;i<s;)-1!==e.indexOf(t.charCodeAt(i))?r[r.length-1]+=t.charAt(i):r.push(t.charAt(i)),i+=1;return r},TextProperty.prototype.completeTextData=function(t){t.__complete=!0;var e,r,i,s,a,n,o,h=this.elem.globalData.fontManager,p=this.data,l=[],m=0,f=p.m.g,c=0,d=0,u=0,y=[],g=0,v=0,P=h.getFontByName(t.f),b=0,x=P.fStyle?P.fStyle.split(" "):[],_="normal",S="normal";for(r=x.length,e=0;e<r;e+=1)switch(x[e].toLowerCase()){case"italic":S="italic";break;case"bold":_="700";break;case"black":_="900";break;case"medium":_="500";break;case"regular":case"normal":_="400";break;case"light":case"thin":_="200"}t.fWeight=P.fWeight||_,t.fStyle=S,r=t.t.length,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),t.finalLineHeight=t.lh;var T,A=t.tr/1e3*t.finalSize;if(t.sz)for(var C,E,k=!0,D=t.sz[0],M=t.sz[1];k;){g=C=0,r=(E=this.buildFinalText(t.t)).length,A=t.tr/1e3*t.finalSize;var I=-1;for(e=0;e<r;e+=1)T=E[e].charCodeAt(0),i=!1," "===E[e]?I=e:13!==T&&3!==T||(i=!(g=0),C+=t.finalLineHeight||1.2*t.finalSize),D<g+(b=h.chars?(o=h.getCharData(E[e],P.fStyle,P.fFamily),i?0:o.w*t.finalSize/100):h.measureText(E[e],t.f,t.finalSize))&&" "!==E[e]?(-1===I?r+=1:e=I,C+=t.finalLineHeight||1.2*t.finalSize,E.splice(e,I===e?1:0,"\r"),I=-1,g=0):(g+=b,g+=A);C+=P.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&M<C?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=E,r=t.finalText.length,k=!1)}g=-A;var w,F=b=0;for(e=0;e<r;e+=1)if(i=!1,T=(w=t.finalText[e]).charCodeAt(0)," "===w?s="\xa0":13===T||3===T?(F=0,y.push(g),v=v<g?g:v,g=-2*A,i=!(s=""),u+=1):s=t.finalText[e],b=h.chars?(o=h.getCharData(w,P.fStyle,h.getFontByName(t.f).fFamily),i?0:o.w*t.finalSize/100):h.measureText(s,t.f,t.finalSize)," "===w?F+=b+A:(g+=b+A+F,F=0),l.push({l:b,an:b,add:c,n:i,anIndexes:[],val:s,line:u,animatorJustifyOffset:0}),2==f){if(c+=b,""===s||"\xa0"===s||e===r-1){for(""!==s&&"\xa0"!==s||(c-=b);d<=e;)l[d].an=c,l[d].ind=m,l[d].extra=b,d+=1;m+=1,c=0}}else if(3==f){if(c+=b,""===s||e===r-1){for(""===s&&(c-=b);d<=e;)l[d].an=c,l[d].ind=m,l[d].extra=b,d+=1;c=0,m+=1}}else l[m].ind=m,l[m].extra=0,m+=1;if(t.l=l,v=v<g?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var V,R,L=p.a;n=L.length;var z,O,B=[];for(a=0;a<n;a+=1){for((V=L[a]).a.sc&&(t.strokeColorAnim=!0),V.a.sw&&(t.strokeWidthAnim=!0),(V.a.fc||V.a.fh||V.a.fs||V.a.fb)&&(t.fillColorAnim=!0),O=0,z=V.s.b,e=0;e<r;e+=1)(R=l[e]).anIndexes[a]=O,(1==z&&""!==R.val||2==z&&""!==R.val&&"\xa0"!==R.val||3==z&&(R.n||"\xa0"==R.val||e==r-1)||4==z&&(R.n||e==r-1))&&(1===V.s.rn&&B.push(O),O+=1);p.a[a].s.totalChars=O;var N,G=-1;if(1===V.s.rn)for(e=0;e<r;e+=1)G!=(R=l[e]).anIndexes[a]&&(G=R.anIndexes[a],N=B.splice(Math.floor(Math.random()*B.length),1)[0]),R.anIndexes[a]=N}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=P.ascent*t.finalSize/100},TextProperty.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.copyData({},this.data.d.k[e].s);r=this.copyData(r,t),this.data.d.k[e].s=r,this.recalculate(e),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},TextProperty.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var TextSelectorProp=(cz=Math.max,dz=Math.min,ez=Math.floor,fz.prototype={getMult:function(t){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,i=this.finalS,s=this.finalE,a=this.data.sh;if(2==a)r=e(r=s===i?s<=t?1:0:cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)));else if(3==a)r=e(r=s===i?s<=t?0:1:1-cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)));else if(4==a)s===i?r=0:(r=cz(0,dz(.5/(s-i)+(t-i)/(s-i),1)))<.5?r*=2:r=1-2*(r-.5),r=e(r);else if(5==a){if(s===i)r=0;else{var n=s-i,o=-n/2+(t=dz(cz(0,t+.5-i),s-i)),h=n/2;r=Math.sqrt(1-o*o/(h*h))}r=e(r)}else r=6==a?e(r=s===i?0:(t=dz(cz(0,t+.5-i),s-i),(1+Math.cos(Math.PI+2*Math.PI*t/(s-i)))/2)):(t>=ez(i)&&(r=t-i<0?1-(i-t):cz(0,dz(s-t,1))),e(r));return r*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,r=this.o.v/e,i=this.s.v/e+r,s=this.e.v/e+r;if(s<i){var a=i;i=s,s=a}this.finalS=i,this.finalE=s}},extendPrototype([DynamicPropertyContainer],fz),{getTextSelectorProp:function(t,e,r){return new fz(t,e,r)}}),cz,dz,ez;function fz(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=PropertyFactory.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?PropertyFactory.getProp(t,e.e,0,0,this):{v:100},this.o=PropertyFactory.getProp(t,e.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(t,e.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(t,e.ne||{k:0},0,0,this),this.a=PropertyFactory.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}var pool_factory=function(t,e,r,i){var s=0,a=t,n=createSizedArray(a);function o(){return s?n[s-=1]:e()}return{newElement:o,release:function(t){s===a&&(n=pooling.double(n),a*=2),r&&r(t),n[s]=t,s+=1}}},pooling={double:function(t){return t.concat(createSizedArray(t.length))}},point_pool=pool_factory(8,function(){return createTypedArray("float32",2)}),shape_pool=(Vz=pool_factory(4,function(){return new ShapePath},function(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}),Vz.clone=function(t){var e,r=Vz.newElement(),i=void 0===t._length?t.v.length:t._length;for(r.setLength(i),r.c=t.c,e=0;e<i;e+=1)r.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return r},Vz),Vz,shapeCollection_pool=(cA={newShapeCollection:function(){var t;t=dA?fA[dA-=1]:new ShapeCollection;return t},release:function(t){var e,r=t._length;for(e=0;e<r;e+=1)shape_pool.release(t.shapes[e]);t._length=0,dA===eA&&(fA=pooling.double(fA),eA*=2);fA[dA]=t,dA+=1}},dA=0,eA=4,fA=createSizedArray(eA),cA),cA,dA,eA,fA,segments_length_pool=pool_factory(8,function(){return{lengths:[],totalLength:0}},function(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0}),bezier_length_pool=pool_factory(8,function(){return{addedLength:0,percents:createTypedArray("float32",defaultCurveSegments),lengths:createTypedArray("float32",defaultCurveSegments)}});function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=createNS("svg");var r="";if(e&&e.title){var i=createNS("title"),s=createElementID();i.setAttribute("id",s),i.textContent=e.title,this.svgElement.appendChild(i),r+=s}if(e&&e.description){var a=createNS("desc"),n=createElementID();a.setAttribute("id",n),a.textContent=e.description,this.svgElement.appendChild(a),r+=" "+n}r&&this.svgElement.setAttribute("aria-labelledby",r);var o=createNS("defs");this.svgElement.appendChild(o);var h=createNS("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||!1!==e.hideOnTransparent,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1,_mdf:!1,renderConfig:this.renderConfig,currentGlobalAlpha:-1},this.contextData=new CVContextData,this.elements=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1,this.rendererType="canvas"}function MaskElement(t,e,r){this.data=t,this.element=e,this.globalData=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var i,s=this.globalData.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=createSizedArray(a),this.solidPath="";var n,o,h,p,l,m,f,c=this.masksProperties,d=0,u=[],y=createElementID(),g="clipPath",v="clip-path";for(i=0;i<a;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(v=g="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!==d?p=null:((p=createNS("rect")).setAttribute("fill","#ffffff"),p.setAttribute("width",this.element.comp.data.w||0),p.setAttribute("height",this.element.comp.data.h||0),u.push(p)),n=createNS("path"),"n"!=c[i].mode){var P;if(d+=1,n.setAttribute("fill","s"===c[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[i].x.k?(v=g="mask",f=PropertyFactory.getProp(this.element,c[i].x,0,null,this.element),P=createElementID(),(l=createNS("filter")).setAttribute("id",P),(m=createNS("feMorphology")).setAttribute("operator","erode"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),l.appendChild(m),s.appendChild(l),n.setAttribute("stroke","s"===c[i].mode?"#000000":"#ffffff")):f=m=null,this.storedData[i]={elem:n,x:f,expan:m,lastPath:"",lastOperator:"",filterId:P,lastRadius:0},"i"==c[i].mode){h=u.length;var b=createNS("g");for(o=0;o<h;o+=1)b.appendChild(u[o]);var x=createNS("mask");x.setAttribute("mask-type","alpha"),x.setAttribute("id",y+"_"+d),x.appendChild(n),s.appendChild(x),b.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(b)}else u.push(n);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),invRect:p},this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),elem:n,lastPath:""},s.appendChild(n);for(this.maskElement=createNS(g),a=u.length,i=0;i<a;i+=1)this.maskElement.appendChild(u[i]);0<d&&(this.maskElement.setAttribute("id",y),this.element.maskedElement.setAttribute(v,"url("+locationHref+"#"+y+")"),s.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}function HierarchyElement(){}function FrameElement(){}function TransformElement(){}function RenderableElement(){}function RenderableDOMElement(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e,this._isAnimated=!!r.k;for(var i=0,s=t.length;i<s;){if(t[i].mProps.dynamicProperties.length){this._isAnimated=!0;break}i+=1}}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function ShapeTransformManager(){this.sequences={},this.sequenceList=[],this.transform_key_count=0}function CVShapeData(t,e,r,i){this.styledShapes=[],this.tr=[0,0,0,0,0,0];var s=4;"rc"==e.ty?s=5:"el"==e.ty?s=6:"sr"==e.ty&&(s=7),this.sh=ShapePropertyFactory.getShapeProp(t,e,s,t);var a,n,o=r.length;for(a=0;a<o;a+=1)r[a].closed||(n={transforms:i.addTransformSequence(r[a].transforms),trNodes:[]},this.styledShapes.push(n),r[a].elements.push(n))}function BaseElement(){}function NullElement(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function SVGBaseElement(){}function IShapeElement(){}function ITextElement(){}function ICompElement(){}function IImageElement(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function ISolidElement(t,e,r){this.initElement(t,e,r)}function SVGShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,r),this.prevViewData=[]}function CVContextData(){this.saved=[],this.cArrPos=0,this.cTr=new Matrix,this.cO=1;var t;for(this.savedOp=createTypedArray("float32",15),t=0;t<15;t+=1)this.saved[t]=createTypedArray("float32",16);this._length=15}function CVBaseElement(){}function CVCompElement(t,e,r){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this.elements=createSizedArray(this.layers.length),this.initElement(t,e,r),this.tm=t.tm?PropertyFactory.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function CVMaskElement(t,e){this.data=t,this.element=e,this.masksProperties=this.data.masksProperties||[],this.viewData=createSizedArray(this.masksProperties.length);var r,i=this.masksProperties.length,s=!1;for(r=0;r<i;r++)"n"!==this.masksProperties[r].mode&&(s=!0),this.viewData[r]=ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[r],3);(this.hasMasks=s)&&this.element.addRenderableComponent(this)}function CVShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.transformsManager=new ShapeTransformManager,this.initElement(t,e,r)}function CVSolidElement(t,e,r){this.initElement(t,e,r)}function CVEffects(){}BaseRenderer.prototype.checkLayers=function(t){var e,r,i=this.layers.length;for(this.completeLayers=!0,e=i-1;0<=e;e--)this.elements[e]||(r=this.layers[e]).ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t)}return this.createNull(t)},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,r,i=t.length,s=this.layers.length;for(e=0;e<i;e+=1)for(r=0;r<s;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e,r){for(var i=this.elements,s=this.layers,a=0,n=s.length;a<n;)s[a].ind==e&&(i[a]&&!0!==i[a]?(r.push(i[a]),i[a].setAsParent(),void 0!==s[a].parent?this.buildElementParenting(t,s[a].parent,r):t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},BaseRenderer.prototype.addPendingElement=function(t){this.pendingElements.push(t)},BaseRenderer.prototype.searchExtraCompositions=function(t){var e,r=t.length;for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e]);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},BaseRenderer.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},extendPrototype([BaseRenderer],SVGRenderer),SVGRenderer.prototype.createNull=function(t){return new NullElement(t,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new SVGShapeElement(t,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new SVGCompElement(t,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)"),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var r=createNS("clipPath"),i=createNS("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var s=createElementID();r.setAttribute("id",s),r.appendChild(i),this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+s+")"),e.appendChild(r),this.layers=t.layers,this.elements=createSizedArray(t.layers.length)},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},SVGRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this.elements.length;e<r;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=r-1;0<=e;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<r;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var r=t.getBaseElement();if(r){for(var i,s=0;s<e;)this.elements[s]&&!0!==this.elements[s]&&this.elements[s].getBaseElement()&&(i=this.elements[s].getBaseElement()),s+=1;i?this.layerElement.insertBefore(r,i):this.layerElement.appendChild(r)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},extendPrototype([BaseRenderer],CanvasRenderer),CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData,this)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData,this)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData,this)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData,this)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData,this)},CanvasRenderer.prototype.createNull=SVGRenderer.prototype.createNull,CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13])if(this.renderConfig.clearCanvas){this.transformMat.cloneFromProps(t);var e=this.contextData.cTr.props;this.transformMat.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}else this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13])},CanvasRenderer.prototype.ctxOpacity=function(t){if(!this.renderConfig.clearCanvas)return this.canvasContext.globalAlpha*=t<0?0:t,void(this.globalData.currentGlobalAlpha=this.contextData.cO);this.contextData.cO*=t<0?0:t,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},CanvasRenderer.prototype.reset=function(){this.renderConfig.clearCanvas?this.contextData.reset():this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(this.renderConfig.clearCanvas){t&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,i=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)i[r]=e[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1}else this.canvasContext.save()},CanvasRenderer.prototype.restore=function(t){if(this.renderConfig.clearCanvas){t&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var e,r=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;e<16;e+=1)i[e]=r[e];this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13]),r=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=r,this.globalData.currentGlobalAlpha!==r&&(this.canvasContext.globalAlpha=r,this.globalData.currentGlobalAlpha=r)}else this.canvasContext.restore()},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(t,document.body),this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(t.layers.length),this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e,r,i;if(this.reset(),this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr),-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var s=this.renderConfig.preserveAspectRatio.split(" "),a=s[1]||"meet",n=s[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);(r=t/e)<(i=this.transformCanvas.w/this.transformCanvas.h)&&"meet"===a||i<r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===o&&(i<r&&"meet"===a||r<i&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(i<r&&"meet"===a||r<i&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(r<i&&"meet"===a||i<r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(r<i&&"meet"===a||i<r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0;this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip(),this.renderFrame(this.renderedFrame,!0)},CanvasRenderer.prototype.destroy=function(){var t;for(this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML=""),t=(this.layers?this.layers.length:0)-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var r,i=this.layers.length;for(this.completeLayers||this.checkLayers(t),r=0;r<i;r++)(this.completeLayers||this.elements[r])&&this.elements[r].prepareFrame(t-this.layers[r].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),r=i-1;0<=r;r-=1)(this.completeLayers||this.elements[r])&&this.elements[r].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},CanvasRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var r=this.createItem(this.layers[t],this,this.globalData);(e[t]=r).initExpressions()}},CanvasRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=createSizedArray(t.layers.length),this.updateContainerSize()},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.renderFrame=function(t){var e,r=this.element.finalTransform.mat,i=this.masksProperties.length;for(e=0;e<i;e++)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&(this.viewData[e].invRect.setAttribute("x",-r.props[12]),this.viewData[e].invRect.setAttribute("y",-r.props[13])),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,r){var i,s,a=" M"+e.v[0][0]+","+e.v[0][1];for(s=e._length,i=1;i<s;i+=1)a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&1<s&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var r,i=this.dynamicProperties.length;for(r=0;r<i;r+=1)(e||this._isParent&&"transform"===this.dynamicProperties[r].propType)&&(this.dynamicProperties[r].getValue(),this.dynamicProperties[r]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,r=0,i=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;r<i;){if(this.hierarchy[r].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}r+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<i;r+=1)t=this.hierarchy[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var r=!0,i=this.comp;r;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):r=!1;var s,a,n=e.length;for(s=0;s<n;s+=1)a=e[s].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},mHelper:new Matrix},RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}},extendPrototype([RenderableElement,createProxyFunction({initElement:function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],RenderableDOMElement),SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},ShapeTransformManager.prototype={addTransformSequence:function(t){var e,r=t.length,i="_";for(e=0;e<r;e+=1)i+=t[e].transform.key+"_";var s=this.sequences[i];return s||(s={transforms:[].concat(t),finalTransform:new Matrix,_mdf:!1},this.sequences[i]=s,this.sequenceList.push(s)),s},processSequence:function(t,e){for(var r,i=0,s=t.transforms.length,a=e;i<s&&!e;){if(t.transforms[i].transform.mProps._mdf){a=!0;break}i+=1}if(a)for(t.finalTransform.reset(),i=s-1;0<=i;i-=1)r=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15]);t._mdf=a},processSequences:function(t){var e,r=this.sequenceList.length;for(e=0;e<r;e+=1)this.processSequence(this.sequenceList[e],t)},getNewKey:function(){return"_"+this.transform_key_count++}},CVShapeData.prototype.setAsAnimated=SVGShapeData.prototype.setAsAnimated,BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=getBlendMode(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,r){this.globalData=e,this.comp=r,this.data=t,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},NullElement.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,r,i=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var s=createNS("mask");s.setAttribute("id",this.layerId),s.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),s.appendChild(this.layerElement),i=s,this.globalData.defs.appendChild(s),featureSupport.maskType||1!=this.data.td||(s.setAttribute("mask-type","luminance"),t=createElementID(),e=filtersFactory.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),(r=createNS("g")).appendChild(this.layerElement),i=r,s.appendChild(r),r.setAttribute("filter","url("+locationHref+"#"+t+")"))}else if(2==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=createNS("g");a.appendChild(n),t=createElementID(),e=filtersFactory.createFilter(t);var o=createNS("feComponentTransfer");o.setAttribute("in","SourceGraphic"),e.appendChild(o);var h=createNS("feFuncA");h.setAttribute("type","table"),h.setAttribute("tableValues","1.0 0.0"),o.appendChild(h),this.globalData.defs.appendChild(e);var p=createNS("rect");p.setAttribute("width",this.comp.data.w),p.setAttribute("height",this.comp.data.h),p.setAttribute("x","0"),p.setAttribute("y","0"),p.setAttribute("fill","#ffffff"),p.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+t+")"),n.appendChild(p),n.appendChild(this.layerElement),i=n,featureSupport.maskType||(a.setAttribute("mask-type","luminance"),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),r=createNS("g"),n.appendChild(p),r.appendChild(this.layerElement),i=r,n.appendChild(r)),this.globalData.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),i=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),m=createNS("path");m.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f=createElementID();if(l.setAttribute("id",f),l.appendChild(m),this.globalData.defs.appendChild(l),this.checkMasks()){var c=createNS("g");c.setAttribute("clip-path","url("+locationHref+"#"+f+")"),c.appendChild(this.layerElement),this.transformedElement=c,i?i.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+f+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")}},IShapeElement.prototype={addShapeToModifiers:function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;0<=t;t-=1)this.shapeModifiers[t].processShapes(this._isFirstFrame)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"bevel"},searchProcessedElement:function(t){for(var e=this.processedElements,r=0,i=e.length;r<i;){if(e[r].elem===t)return e[r].pos;r+=1}return 0},addProcessedElement:function(t,e){for(var r=this.processedElements,i=r.length;i;)if(r[i-=1].elem===t)return void(r[i].pos=e);r.push(new ProcessedElement(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}},ITextElement.prototype.initElement=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textProperty=new TextProperty(this,t.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(t.t,this.renderType,this),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(t,e){var r,i,s=e.length,a="";for(r=0;r<s;r+=1)i=e[r].ks.k,a+=buildShapeString(i,i.i.length,!0,t);return a},ITextElement.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},ITextElement.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},ITextElement.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},ITextElement.prototype.applyTextPropertiesToMatrix=function(t,e,r,i,s){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(i,s,0)},ITextElement.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=i-1;0<=r;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var t,e,r,i,s=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(r=0;r<a;r+=1){for(i=this.stylesList[r],o=!1,t=n.length=0;t<s;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(i)&&(n.push(e),o=e._isAnimated||o);1<n.length&&o&&this.setShapesAsAnimated(n)}},SVGShapeElement.prototype.setShapesAsAnimated=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(t,e){var r,i=new SVGStyleData(t,e),s=i.pElem;if("st"===t.ty)r=new SVGStrokeStyleData(this,t,i);else if("fl"===t.ty)r=new SVGFillStyleData(this,t,i);else if("gf"===t.ty||"gs"===t.ty){r=new("gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData)(this,t,i),this.globalData.defs.appendChild(r.gf),r.maskId&&(this.globalData.defs.appendChild(r.ms),this.globalData.defs.appendChild(r.of),s.setAttribute("mask","url("+locationHref+"#"+r.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(s.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),s.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),s.setAttribute("fill-opacity","0"),1===t.lj&&s.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&s.setAttribute("fill-rule","evenodd"),t.ln&&s.setAttribute("id",t.ln),t.cl&&s.setAttribute("class",t.cl),t.bm&&(s.style["mix-blend-mode"]=getBlendMode(t.bm)),this.stylesList.push(i),this.addToAnimatedContents(t,r),r},SVGShapeElement.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=getBlendMode(t.bm)),e},SVGShapeElement.prototype.createTransformElement=function(t,e){var r=TransformPropertyFactory.getTransformProperty(this,t,this),i=new SVGTransformData(r,r.o,e);return this.addToAnimatedContents(t,i),i},SVGShapeElement.prototype.createShapeElement=function(t,e,r){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var s=new SVGShapeData(e,r,ShapePropertyFactory.getShapeProp(this,t,i,this));return this.shapes.push(s),this.addShapeToModifiers(s),this.addToAnimatedContents(t,s),s},SVGShapeElement.prototype.addToAnimatedContents=function(t,e){for(var r=0,i=this.animatedContents.length;r<i;){if(this.animatedContents[r].element===e)return;r+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(t),element:e,data:t})},SVGShapeElement.prototype.setElementStyles=function(t){var e,r=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(t,e,r,i,s,a,n){var o,h,p,l,m,f,c=[].concat(a),d=t.length-1,u=[],y=[];for(o=d;0<=o;o-=1){if((f=this.searchProcessedElement(t[o]))?e[o]=r[f-1]:t[o]._render=n,"fl"==t[o].ty||"st"==t[o].ty||"gf"==t[o].ty||"gs"==t[o].ty)f?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],s),t[o]._render&&i.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"==t[o].ty){if(f)for(p=e[o].it.length,h=0;h<p;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,s+1,c,n),t[o]._render&&i.appendChild(e[o].gr)}else"tr"==t[o].ty?(f||(e[o]=this.createTransformElement(t[o],i)),l=e[o].transform,c.push(l)):"sh"==t[o].ty||"rc"==t[o].ty||"el"==t[o].ty||"sr"==t[o].ty?(f||(e[o]=this.createShapeElement(t[o],c,s)),this.setElementStyles(e[o])):"tm"==t[o].ty||"rd"==t[o].ty||"ms"==t[o].ty?(f?(m=e[o]).closed=!1:((m=ShapeModifiers.getModifier(t[o].ty)).init(this,t[o]),e[o]=m,this.shapeModifiers.push(m)),y.push(m)):"rp"==t[o].ty&&(f?(m=e[o]).closed=!0:(m=ShapeModifiers.getModifier(t[o].ty),(e[o]=m).init(this,t,o,e),this.shapeModifiers.push(m),n=!1),y.push(m));this.addProcessedElement(t[o],o+1)}for(d=u.length,o=0;o<d;o+=1)u[o].closed=!0;for(d=y.length,o=0;o<d;o+=1)y[o].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var t,e,r=this.animatedContents.length;for(t=0;t<r;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},CVContextData.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=createTypedArray("float32",t),this.savedOp.set(e);var r=0;for(r=this._length;r<t;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=t},CVContextData.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},CVBaseElement.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new CVEffects(this)},createContent:function(){},setBlendMode:function(){var t=this.globalData;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=getBlendMode(this.data.bm);t.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new CVMaskElement(this.data,this)},hideElement:function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){this.hidden||this.data.hd||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1))},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new Matrix},CVBaseElement.prototype.hide=CVBaseElement.prototype.hideElement,CVBaseElement.prototype.show=CVBaseElement.prototype.showElement,extendPrototype([CanvasRenderer,ICompElement,CVBaseElement],CVCompElement),CVCompElement.prototype.renderInnerContent=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},CVCompElement.prototype.destroy=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},CVMaskElement.prototype.renderFrame=function(){if(this.hasMasks){var t,e,r,i,s=this.element.finalTransform.mat,a=this.element.canvasContext,n=this.masksProperties.length;for(a.beginPath(),t=0;t<n;t++)if("n"!==this.masksProperties[t].mode){this.masksProperties[t].inv&&(a.moveTo(0,0),a.lineTo(this.element.globalData.compSize.w,0),a.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),a.lineTo(0,this.element.globalData.compSize.h),a.lineTo(0,0)),i=this.viewData[t].v,e=s.applyToPointArray(i.v[0][0],i.v[0][1],0),a.moveTo(e[0],e[1]);var o,h=i._length;for(o=1;o<h;o++)r=s.applyToTriplePoints(i.o[o-1],i.i[o],i.v[o]),a.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5]);r=s.applyToTriplePoints(i.o[o-1],i.i[0],i.v[0]),a.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5])}this.element.globalData.renderer.save(!0),a.clip()}},CVMaskElement.prototype.getMaskProperty=MaskElement.prototype.getMaskProperty,CVMaskElement.prototype.destroy=function(){this.element=null},extendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement],CVShapeElement),CVShapeElement.prototype.initElement=RenderableDOMElement.prototype.initElement,CVShapeElement.prototype.transformHelper={opacity:1,_opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},CVShapeElement.prototype.createStyleElement=function(t,e){var r={data:t,type:t.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:!0===t.hd},i={};if("fl"==t.ty||"st"==t.ty?(i.c=PropertyFactory.getProp(this,t.c,1,255,this),i.c.k||(r.co="rgb("+bm_floor(i.c.v[0])+","+bm_floor(i.c.v[1])+","+bm_floor(i.c.v[2])+")")):"gf"!==t.ty&&"gs"!==t.ty||(i.s=PropertyFactory.getProp(this,t.s,1,null,this),i.e=PropertyFactory.getProp(this,t.e,1,null,this),i.h=PropertyFactory.getProp(this,t.h||{k:0},0,.01,this),i.a=PropertyFactory.getProp(this,t.a||{k:0},0,degToRads,this),i.g=new GradientProperty(this,t.g,this)),i.o=PropertyFactory.getProp(this,t.o,0,.01,this),"st"==t.ty||"gs"==t.ty){if(r.lc=this.lcEnum[t.lc]||"round",r.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(r.ml=t.ml),i.w=PropertyFactory.getProp(this,t.w,0,null,this),i.w.k||(r.wi=i.w.v),t.d){var s=new DashProperty(this,t.d,"canvas",this);i.d=s,i.d.k||(r.da=i.d.dashArray,r.do=i.d.dashoffset[0])}}else r.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(r),i.style=r,i},CVShapeElement.prototype.createGroupElement=function(t){return{it:[],prevViewData:[]}},CVShapeElement.prototype.createTransformElement=function(t){return{transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:PropertyFactory.getProp(this,t.o,0,.01,this),mProps:TransformPropertyFactory.getTransformProperty(this,t,this)}}},CVShapeElement.prototype.createShapeElement=function(t){var e=new CVShapeData(this,t,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},CVShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},CVShapeElement.prototype.addTransformToStyleList=function(t){var e,r=this.stylesList.length;for(e=0;e<r;e+=1)this.stylesList[e].closed||this.stylesList[e].transforms.push(t)},CVShapeElement.prototype.removeTransformFromStyleList=function(){var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.pop()},CVShapeElement.prototype.closeStyles=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e].closed=!0},CVShapeElement.prototype.searchShapes=function(t,e,r,i,s){var a,n,o,h,p,l,m=t.length-1,f=[],c=[],d=[].concat(s);for(a=m;0<=a;a-=1){if((h=this.searchProcessedElement(t[a]))?e[a]=r[h-1]:t[a]._shouldRender=i,"fl"==t[a].ty||"st"==t[a].ty||"gf"==t[a].ty||"gs"==t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],d),f.push(e[a].style);else if("gr"==t[a].ty){if(h)for(o=e[a].it.length,n=0;n<o;n+=1)e[a].prevViewData[n]=e[a].it[n];else e[a]=this.createGroupElement(t[a]);this.searchShapes(t[a].it,e[a].it,e[a].prevViewData,i,d)}else"tr"==t[a].ty?(h||(l=this.createTransformElement(t[a]),e[a]=l),d.push(e[a]),this.addTransformToStyleList(e[a])):"sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty?h||(e[a]=this.createShapeElement(t[a])):"tm"==t[a].ty||"rd"==t[a].ty?(h?(p=e[a]).closed=!1:((p=ShapeModifiers.getModifier(t[a].ty)).init(this,t[a]),e[a]=p,this.shapeModifiers.push(p)),c.push(p)):"rp"==t[a].ty&&(h?(p=e[a]).closed=!0:(p=ShapeModifiers.getModifier(t[a].ty),(e[a]=p).init(this,t,a,e),this.shapeModifiers.push(p),i=!1),c.push(p));this.addProcessedElement(t[a],a+1)}for(this.removeTransformFromStyleList(),this.closeStyles(f),m=c.length,a=0;a<m;a+=1)c[a].closed=!0},CVShapeElement.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},CVShapeElement.prototype.renderShapeTransform=function(t,e){(t._opMdf||e.op._mdf||this._isFirstFrame)&&(e.opacity=t.opacity,e.opacity*=e.op.v,e._opMdf=!0)},CVShapeElement.prototype.drawLayer=function(){var t,e,r,i,s,a,n,o,h,p=this.stylesList.length,l=this.globalData.renderer,m=this.globalData.canvasContext;for(t=0;t<p;t+=1)if(("st"!==(o=(h=this.stylesList[t]).type)&&"gs"!==o||0!==h.wi)&&h.data._shouldRender&&0!==h.coOp&&0!==this.globalData.currentGlobalAlpha){for(l.save(),a=h.elements,"st"===o||"gs"===o?(m.strokeStyle="st"===o?h.co:h.grd,m.lineWidth=h.wi,m.lineCap=h.lc,m.lineJoin=h.lj,m.miterLimit=h.ml||0):m.fillStyle="fl"===o?h.co:h.grd,l.ctxOpacity(h.coOp),"st"!==o&&"gs"!==o&&m.beginPath(),l.ctxTransform(h.preTransforms.finalTransform.props),r=a.length,e=0;e<r;e+=1){for("st"!==o&&"gs"!==o||(m.beginPath(),h.da&&(m.setLineDash(h.da),m.lineDashOffset=h.do)),s=(n=a[e].trNodes).length,i=0;i<s;i+=1)"m"==n[i].t?m.moveTo(n[i].p[0],n[i].p[1]):"c"==n[i].t?m.bezierCurveTo(n[i].pts[0],n[i].pts[1],n[i].pts[2],n[i].pts[3],n[i].pts[4],n[i].pts[5]):m.closePath();"st"!==o&&"gs"!==o||(m.stroke(),h.da&&m.setLineDash(this.dashResetter))}"st"!==o&&"gs"!==o&&m.fill(h.r),l.restore()}},CVShapeElement.prototype.renderShape=function(t,e,r,i){var s,a;for(a=t,s=e.length-1;0<=s;s-=1)"tr"==e[s].ty?(a=r[s].transform,this.renderShapeTransform(t,a)):"sh"==e[s].ty||"el"==e[s].ty||"rc"==e[s].ty||"sr"==e[s].ty?this.renderPath(e[s],r[s]):"fl"==e[s].ty?this.renderFill(e[s],r[s],a):"st"==e[s].ty?this.renderStroke(e[s],r[s],a):"gf"==e[s].ty||"gs"==e[s].ty?this.renderGradientFill(e[s],r[s],a):"gr"==e[s].ty?this.renderShape(a,e[s].it,r[s].it):e[s].ty;i&&this.drawLayer()},CVShapeElement.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var r,i,s,a=t.trNodes,n=e.paths,o=n._length;a.length=0;var h=t.transforms.finalTransform;for(s=0;s<o;s+=1){var p=n.shapes[s];if(p&&p.v){for(i=p._length,r=1;r<i;r+=1)1===r&&a.push({t:"m",p:h.applyToPointArray(p.v[0][0],p.v[0][1],0)}),a.push({t:"c",pts:h.applyToTriplePoints(p.o[r-1],p.i[r],p.v[r])});1===i&&a.push({t:"m",p:h.applyToPointArray(p.v[0][0],p.v[0][1],0)}),p.c&&i&&(a.push({t:"c",pts:h.applyToTriplePoints(p.o[r-1],p.i[0],p.v[0])}),a.push({t:"z"}))}}t.trNodes=a}},CVShapeElement.prototype.renderPath=function(t,e){if(!0!==t.hd&&t._shouldRender){var r,i=e.styledShapes.length;for(r=0;r<i;r+=1)this.renderStyledShape(e.styledShapes[r],e.sh)}},CVShapeElement.prototype.renderFill=function(t,e,r){var i=e.style;(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*r.opacity)},CVShapeElement.prototype.renderGradientFill=function(t,e,r){var i=e.style;if(!i.grd||e.g._mdf||e.s._mdf||e.e._mdf||1!==t.t&&(e.h._mdf||e.a._mdf)){var s=this.globalData.canvasContext,a=e.s.v,n=e.e.v;if(1===t.t)f=s.createLinearGradient(a[0],a[1],n[0],n[1]);else var o=Math.sqrt(Math.pow(a[0]-n[0],2)+Math.pow(a[1]-n[1],2)),h=Math.atan2(n[1]-a[1],n[0]-a[0]),p=o*(1<=e.h.v?.99:e.h.v<=-1?-.99:e.h.v),l=Math.cos(h+e.a.v)*p+a[0],m=Math.sin(h+e.a.v)*p+a[1],f=s.createRadialGradient(l,m,0,a[0],a[1],o);var c,d=t.g.p,u=e.g.c,y=1;for(c=0;c<d;c+=1)e.g._hasOpacity&&e.g._collapsable&&(y=e.g.o[2*c+1]),f.addColorStop(u[4*c]/100,"rgba("+u[4*c+1]+","+u[4*c+2]+","+u[4*c+3]+","+y+")");i.grd=f}i.coOp=e.o.v*r.opacity},CVShapeElement.prototype.renderStroke=function(t,e,r){var i=e.style,s=e.d;s&&(s._mdf||this._isFirstFrame)&&(i.da=s.dashArray,i.do=s.dashoffset[0]),(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*r.opacity),(e.w._mdf||this._isFirstFrame)&&(i.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement],CVSolidElement),CVSolidElement.prototype.initElement=SVGShapeElement.prototype.initElement,CVSolidElement.prototype.prepareFrame=IImageElement.prototype.prepareFrame,CVSolidElement.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},CVEffects.prototype.renderFrame=function(){};var animationManager=(tJ={},uJ=[],vJ=0,wJ=0,xJ=0,yJ=!0,zJ=!1,tJ.registerAnimation=BJ,tJ.loadAnimation=function(t){var e=new AnimationItem;return FJ(e,null),e.setParams(t),e},tJ.setSpeed=function(t,e){var r;for(r=0;r<wJ;r+=1)uJ[r].animation.setSpeed(t,e)},tJ.setDirection=function(t,e){var r;for(r=0;r<wJ;r+=1)uJ[r].animation.setDirection(t,e)},tJ.play=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.play(t)},tJ.pause=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.pause(t)},tJ.stop=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.stop(t)},tJ.togglePause=function(t){var e;for(e=0;e<wJ;e+=1)uJ[e].animation.togglePause(t)},tJ.searchAnimations=function(t,e,r){var i,s=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),a=s.length;for(i=0;i<a;i+=1)r&&s[i].setAttribute("data-bm-type",r),BJ(s[i],t);if(e&&0===a){r||(r="svg");var n=document.getElementsByTagName("body")[0];n.innerHTML="";var o=createTag("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",r),n.appendChild(o),BJ(o,t)}},tJ.resize=function(){var t;for(t=0;t<wJ;t+=1)uJ[t].animation.resize()},tJ.goToAndStop=function(t,e,r){var i;for(i=0;i<wJ;i+=1)uJ[i].animation.goToAndStop(t,e,r)},tJ.destroy=function(t){var e;for(e=wJ-1;0<=e;e-=1)uJ[e].animation.destroy(t)},tJ.freeze=function(){zJ=!0},tJ.unfreeze=function(){zJ=!1,TJ()},tJ.getRegisteredAnimations=function(){var t,e=uJ.length,r=[];for(t=0;t<e;t+=1)r.push(uJ[t].animation);return r},tJ),tJ,uJ,vJ,wJ,xJ,yJ,zJ,PK,QK,RK,SK,TK,UK,VK;function AJ(t){for(var e=0,r=t.target;e<wJ;)uJ[e].animation===r&&(uJ.splice(e,1),e-=1,wJ-=1,r.isPaused||EJ()),e+=1}function BJ(t,e){if(!t)return null;for(var r=0;r<wJ;){if(uJ[r].elem==t&&null!==uJ[r].elem)return uJ[r].animation;r+=1}var i=new AnimationItem;return FJ(i,t),i.setData(t,e),i}function DJ(){xJ+=1,TJ()}function EJ(){xJ-=1}function FJ(t,e){t.addEventListener("destroy",AJ),t.addEventListener("_active",DJ),t.addEventListener("_idle",EJ),uJ.push({elem:e,animation:t}),wJ+=1}function KJ(t){var e,r=t-vJ;for(e=0;e<wJ;e+=1)uJ[e].animation.advanceTime(r);vJ=t,xJ&&!zJ?window.requestAnimationFrame(KJ):yJ=!0}function LJ(t){vJ=t,window.requestAnimationFrame(KJ)}function TJ(){!zJ&&xJ&&yJ&&(window.requestAnimationFrame(LJ),yJ=!1)}function WK(t){for(var e=0,r=t.target;e<SK;)QK[e].animation===r&&(QK.splice(e,1),e-=1,SK-=1,r.isPaused||$K()),e+=1}function ZK(){TK+=1,nL()}function $K(){TK-=1}function _K(t,e){t.addEventListener("destroy",WK),t.addEventListener("_active",ZK),t.addEventListener("_idle",$K),QK.push({elem:e,animation:t}),SK+=1}function eL(t){var e,r=t-RK;for(e=0;e<SK;e+=1)QK[e].animation.advanceTime(r);RK=t,TK&&!VK?requestAnimationFrame(eL):UK=!0}function fL(t){RK=t,requestAnimationFrame(eL)}function nL(){!VK&&TK&&UK&&(requestAnimationFrame(fL),UK=!1)}PK={},QK=[],RK=0,SK=0,TK=0,UK=!0,VK=!1,PK.registerAnimation=function(t,e){if(!t)return null;for(var r=0;r<SK;){if(QK[r].elem==t&&null!==QK[r].elem)return QK[r].animation;r+=1}var i=new AnimationItem;return _K(i,t),i.setData(t,e),i},PK.loadAnimation=function(t){var e=new AnimationItem;return _K(e,null),e.setParams(t),e},PK.setSpeed=function(t,e){var r;for(r=0;r<SK;r+=1)QK[r].animation.setSpeed(t,e)},PK.setDirection=function(t,e){var r;for(r=0;r<SK;r+=1)QK[r].animation.setDirection(t,e)},PK.play=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.play(t)},PK.pause=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.pause(t)},PK.stop=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.stop(t)},PK.togglePause=function(t){var e;for(e=0;e<SK;e+=1)QK[e].animation.togglePause(t)},PK.searchAnimations=function(t,e,r){throw new Error("Cannot access DOM from worker thread")},PK.resize=function(){var t;for(t=0;t<SK;t+=1)QK[t].animation.resize()},PK.goToAndStop=function(t,e,r){var i;for(i=0;i<SK;i+=1)QK[i].animation.goToAndStop(t,e,r)},PK.destroy=function(t){var e;for(e=SK-1;0<=e;e-=1)QK[e].animation.destroy(t)},PK.freeze=function(){VK=!0},PK.unfreeze=function(){VK=!1,nL()},PK.getRegisteredAnimations=function(){var t,e=QK.length,r=[];for(t=0;t<e;t+=1)r.push(QK[t].animation);return r},animationManager=PK;var AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=createElementID(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=ProjectInterface(),this.imagePreloader=new ImagePreloader};extendPrototype([BaseEvent],AnimationItem),AnimationItem.prototype.setParams=function(t){t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;default:this.renderer=new HybridRenderer(this,t.rendererSettings)}this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,t.animationData?this.configAnimation(t.animationData):t.path&&("json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json"),-1!=t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),assetLoader.load(t.path,this.configAnimation.bind(this),function(){this.trigger("data_failed")}.bind(this)))},AnimationItem.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;r.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",r.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var s=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===s||(r.loop="false"!==s&&("true"===s||parseInt(s)));var a=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:!i.getNamedItem("bm-autoplay")||i.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,r.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"","false"===(i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"")&&(r.prerender=!1),this.setParams(r)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<s;){if(i[e].id==a[r].id){i[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(s=t.assets.length,e=0;e<s;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var r=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,assetLoader.load(r,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},AnimationItem.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},AnimationItem.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},AnimationItem.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},AnimationItem.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.loaded()?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},AnimationItem.prototype.checkLoaded=function(){this.isLoaded||!this.renderer.globalData.fontManager.loaded()||!this.imagePreloader.loaded()&&"canvas"===this.renderer.rendererType||(this.isLoaded=!0,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=!!t},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){!1!==this.isLoaded&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||!0===this.isPaused&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(!0===this.isPaused?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},AnimationItem.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},AnimationItem.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},AnimationItem.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,r=!1;e>=this.totalFrames-1&&0<this.frameModifier?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(r=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(r=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),r&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},AnimationItem.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(0<this.frameModifier&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.timeCompleted=this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.timeCompleted=this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?r=t:this.currentRawFrame+this.firstFrame>e&&(r=e-t)),this.firstFrame=t,this.timeCompleted=this.totalFrames=e-t,-1!==r&&this.goToAndStop(r,!0)},AnimationItem.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"==typeof t[0]){var r,i=t.length;for(r=0;r<i;r+=1)this.segments.push(t[r])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},AnimationItem.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var r=t.p;-1!==r.indexOf("images/")&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},AnimationItem.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.setParams=function(t){t.context&&(this.context=t.context);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;default:throw new Error("Only canvas renderer is supported when using worker.")}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=null,t.animationData)this.configAnimation(t.animationData);else if(t.path)throw new Error("Canvas worker renderer cannot load animation from url")},AnimationItem.prototype.setData=function(t,e){throw new Error("Cannot set data on wrapper for canvas worker renderer")},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<s;){if(i[e].id==a[r].id){i[e]=a[r];break}e+=1}this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(t&&0!==t.length&&this.autoloadSegments)throw new Error("Cannot load multiple segments in worker.");this.timeCompleted=this.totalFrames},AnimationItem.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},AnimationItem.prototype.imagesLoaded=null,AnimationItem.prototype.preloadImages=null,AnimationItem.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.loadSegments(),this.updaFrameModifier(),this.checkLoaded())},AnimationItem.prototype.waitForFontsLoaded=null,AnimationItem.prototype.checkLoaded=function(){this.isLoaded||(this.isLoaded=!0,dataManager.completeData(this.animationData,null),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),this.gotoFrame())},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},AnimationItem.prototype.getPath=null;var Expressions=(xN={},xN.initExpressions=function(t){var e=0,r=[];t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer),t.renderer.globalData.pushExpression=function(){e+=1},t.renderer.globalData.popExpression=function(){0==(e-=1)&&function(){var t,e=r.length;for(t=0;t<e;t+=1)r[t].release();r.length=0}()},t.renderer.globalData.registerExpressionProperty=function(t){-1===r.indexOf(t)&&r.push(t)}},xN),xN;expressionsPlugin=Expressions;var ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null;function $bm_isInstanceOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function isNumerable(t,e){return"number"===t||"boolean"===t||"string"===t||e instanceof Number}function $bm_neg(t){var e=typeof t;if("number"==e||"boolean"==e||t instanceof Number)return-t;if($bm_isInstanceOfArray(t)){var r,i=t.length,s=[];for(r=0;r<i;r+=1)s[r]=-t[r];return s}return t.propType?t.v:void 0}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(t,e){var r=typeof t,i=typeof e;if("string"==r||"string"==i)return t+e;if(isNumerable(r,t)&&isNumerable(i,e))return t+e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]+e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t+e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]+e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}var add=sum;function sub(t,e){var r=typeof t,i=typeof e;if(isNumerable(r,t)&&isNumerable(i,e))return"string"==r&&(t=parseInt(t)),"string"==i&&(e=parseInt(e)),t-e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]-e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t-e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]-e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}function mul(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t*e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]*e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t*e[i];return r}return 0}function div(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t/e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]/e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t/e[i];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(t,e,r){if(r<e){var i=r;r=e,e=i}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(t){return t*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,i=Math.min(t.length,e.length),s=0;for(r=0;r<i;r+=1)s+=Math.pow(e[r]-t[r],2);return Math.sqrt(s)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,i=t[0],s=t[1],a=t[2],n=Math.max(i,s,a),o=Math.min(i,s,a),h=(n+o)/2;if(n==o)e=r=0;else{var p=n-o;switch(r=.5<h?p/(2-n-o):p/(n+o),n){case i:e=(s-a)/p+(s<a?6:0);break;case s:e=(a-i)/p+2;break;case a:e=(i-s)/p+4}e/=6}return[e,r,h,t[3]]}function hue2rgb(t,e,r){return r<0&&(r+=1),1<r&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}function hslToRgb(t){var e,r,i,s=t[0],a=t[1],n=t[2];if(0===a)e=r=i=n;else{var o=n<.5?n*(1+a):n+a-n*a,h=2*n-o;e=hue2rgb(h,o,s+1/3),r=hue2rgb(h,o,s),i=hue2rgb(h,o,s-1/3)}return[e,r,i,t[3]]}function linear(t,e,r,i,s){if(void 0!==i&&void 0!==s||(i=e,s=r,e=0,r=1),r<e){var a=r;r=e,e=a}if(t<=e)return i;if(r<=t)return s;var n=r===e?0:(t-e)/(r-e);if(!i.length)return i+(s-i)*n;var o,h=i.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=i[o]+(s[o]-i[o])*n;return p}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,i=e.length;t||(t=createTypedArray("float32",i));var s=createTypedArray("float32",i),a=BMMath.random();for(r=0;r<i;r+=1)s[r]=t[r]+a*(e[r]-t[r]);return s}return void 0===t&&(t=0),t+BMMath.random()*(e-t)}function createPath(t,e,r,i){var s,a=t.length,n=shape_pool.newElement();n.setPathData(!!i,a);var o,h,p=[0,0];for(s=0;s<a;s+=1)o=e&&e[s]?e[s]:p,h=r&&r[s]?r[s]:p,n.setTripleAt(t[s][0],t[s][1],h[0]+t[s][0],h[1]+t[s][1],o[0]+t[s][0],o[1]+t[s][1],s,!0);return n}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=-1!==val.indexOf("random"),elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,__expression_functions=[],scoped_bm_rt;if(data.xf){var i,len=data.xf.length;for(i=0;i<len;i+=1)__expression_functions[i]=eval("(function(){ return "+data.xf[i]+"}())")}var expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||!0!==this.data.hd,wiggle=function(t,e){var r,i,s=this.pv.length?this.pv.length:1,a=createTypedArray("float32",s);var n=Math.floor(5*time);for(i=r=0;r<n;){for(i=0;i<s;i+=1)a[i]+=-e+2*e*BMMath.random();r+=1}var o=5*time,h=o-Math.floor(o),p=createTypedArray("float32",s);if(1<s){for(i=0;i<s;i+=1)p[i]=this.pv[i]+a[i]+(-e+2*e*BMMath.random())*h;return p}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);function loopInDuration(t,e){return loopIn(t,e,!0)}function loopOutDuration(t,e){return loopOut(t,e,!0)}thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty)),this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,text,textIndex,textTotal,selectorValue;function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],i=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads;return[-Math.atan2(r[1],r[2])/degToRads,i,0]}function easeOut(t,e,r,i,s){return applyEase(easeOutBez,t,e,r,i,s)}function easeIn(t,e,r,i,s){return applyEase(easeInBez,t,e,r,i,s)}function ease(t,e,r,i,s){return applyEase(easeInOutBez,t,e,r,i,s)}function applyEase(t,e,r,i,s,a){void 0===s?(s=r,a=i):e=(e-r)/(i-r);var n=t(e=1<e?1:e<0?0:e);if($bm_isInstanceOfArray(s)){var o,h=s.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=(a[o]-s[o])*n+s[o];return p}return(a-s)*n+s}function nearestKey(t){var e,r,i,s=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,(t*=elem.comp.globalData.frameRate)<data.k[0].t)r=1,i=data.k[0].t;else{for(e=0;e<s-1;e+=1){if(t===data.k[e].t){r=e+1,i=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){i=t-data.k[e].t>data.k[e+1].t-t?(r=e+2,data.k[e+1].t):(r=e+1,data.k[e].t);break}}-1===r&&(r=e+1,i=data.k[e].t)}else i=r=0;var a={};return a.index=r,a.time=i/elem.comp.globalData.frameRate,a}function key(t){var e,r,i,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);for(t-=1,e={time:data.k[t].t/elem.comp.globalData.frameRate,value:[]},i=(s=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t].s||0===data.k[t].s?data.k[t-1].s:data.k[t].e).length,r=0;r<i;r+=1)e[r]=s[r],e.value[r]=s[r];return e}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(t,e){return"string"==typeof value?void 0===e?value.substring(t):value.substring(t,e):""}function substr(t,e){return"string"==typeof value?void 0===e?value.substr(t):value.substr(t,e):""}var index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random()),globalData=elem.globalData;function executeExpression(t){return value=t,_needsRandom&&seedRandom(randSeed),this.frameExpressionId===elem.globalData.frameId&&"textSelector"!==this.propType?value:("textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),($bm_transform=transform)&&(anchorPoint=transform.anchorPoint)),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),(hasParent=!(!elem.hierarchy||!elem.hierarchy.length))&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,"shape"===scoped_bm_rt.propType&&(scoped_bm_rt=scoped_bm_rt.v),scoped_bm_rt)}return executeExpression}return ob.initiateExpression=initiateExpression,ob}(),expressionHelpers={searchExpressions:function(t,e,r){e.x&&(r.k=!0,r.x=!0,r.initiateExpression=ExpressionManager.initiateExpression,r.effectsSequence.push(r.initiateExpression(t,e,r).bind(r)))},getSpeedAtTime:function(t){var e=this.getValueAtTime(t),r=this.getValueAtTime(t+-.01),i=0;if(e.length){var s;for(s=0;s<e.length;s+=1)i+=Math.pow(r[s]-e[s],2);i=100*Math.sqrt(i)}else i=0;return i},getVelocityAtTime:function(t){if(void 0!==this.vel)return this.vel;var e,r,i=this.getValueAtTime(t),s=this.getValueAtTime(t+-.001);if(i.length)for(e=createTypedArray("float32",i.length),r=0;r<i.length;r+=1)e[r]=(s[r]-i[r])/-.001;else e=(s-i)/-.001;return e},getValueAtTime:function(t){return t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value},getStaticValueAtTime:function(){return this.pv},setGroupProperty:function(t){this.propertyGroup=t}};!function(){function o(t,e,r){if(!this.k||!this.keyframes)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[p.length-1].t;if(h<=l)return this.pv;if(r?s=l-(i=e?Math.abs(l-elem.comp.globalData.frameRate*e):Math.max(0,l-this.elem.data.ip)):((!e||e>p.length-1)&&(e=p.length-1),i=l-(s=p[p.length-1-e].t)),"pingpong"===t){if(Math.floor((h-s)/i)%2!=0)return this.getValueAtTime((i-(h-s)%i+s)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var m=this.getValueAtTime(s/this.comp.globalData.frameRate,0),f=this.getValueAtTime(l/this.comp.globalData.frameRate,0),c=this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0),d=Math.floor((h-s)/i);if(this.pv.length){for(n=(o=new Array(m.length)).length,a=0;a<n;a+=1)o[a]=(f[a]-m[a])*d+c[a];return o}return(f-m)*d+c}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l-.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*((h-l)/this.comp.globalData.frameRate)/5e-4;return o}return u+(h-l)/.001*(u-y)}}return this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0)}function h(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[0].t;if(l<=h)return this.pv;if(r?s=l+(i=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-l)):((!e||e>p.length-1)&&(e=p.length-1),i=(s=p[e].t)-l),"pingpong"===t){if(Math.floor((l-h)/i)%2==0)return this.getValueAtTime(((l-h)%i+l)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var m=this.getValueAtTime(l/this.comp.globalData.frameRate,0),f=this.getValueAtTime(s/this.comp.globalData.frameRate,0),c=this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0),d=Math.floor((l-h)/i)+1;if(this.pv.length){for(n=(o=new Array(m.length)).length,a=0;a<n;a+=1)o[a]=c[a]-(f[a]-m[a])*d;return o}return c-(f-m)*d}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l+.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*(l-h)/.001;return o}return u+(u-y)*(l-h)/.001}}return this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0)}function p(t,e){if(!this.k)return this.pv;if(t=.5*(t||.4),(e=Math.floor(e||5))<=1)return this.pv;var r,i,s=this.comp.renderedFrame/this.comp.globalData.frameRate,a=s-t,n=1<e?(s+t-a)/(e-1):1,o=0,h=0;for(r=this.pv.length?createTypedArray("float32",this.pv.length):0;o<e;){if(i=this.getValueAtTime(a+o*n),this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]+=i[h];else r+=i;o+=1}if(this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]/=e;else r/=e;return r}var s=TransformPropertyFactory.getTransformProperty;TransformPropertyFactory.getTransformProperty=function(t,e,r){var i=s(t,e,r);return i.dynamicProperties.length?i.getValueAtTime=function(t){console.warn("Transform at time not supported")}.bind(i):i.getValueAtTime=function(t){}.bind(i),i.setGroupProperty=expressionHelpers.setGroupProperty,i};var l=PropertyFactory.getProp;PropertyFactory.getProp=function(t,e,r,i,s){var a=l(t,e,r,i,s);a.kf?a.getValueAtTime=expressionHelpers.getValueAtTime.bind(a):a.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(a),a.setGroupProperty=expressionHelpers.setGroupProperty,a.loopOut=o,a.loopIn=h,a.smooth=p,a.getVelocityAtTime=expressionHelpers.getVelocityAtTime.bind(a),a.getSpeedAtTime=expressionHelpers.getSpeedAtTime.bind(a),a.numKeys=1===e.a?e.k.length:0,a.propertyIndex=e.ix;var n=0;return 0!==r&&(n=createTypedArray("float32",1===e.a?e.k[0].s.length:e.k.length)),a._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:n},expressionHelpers.searchExpressions(t,e,a),a.k&&s.addDynamicProperty(a),a};var t=ShapePropertyFactory.getConstructorFunction(),e=ShapePropertyFactory.getKeyframedConstructorFunction();function r(){}r.prototype={vertices:function(t,e){this.k&&this.getValue();var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0));var i,s=r._length,a=r[t],n=r.v,o=createSizedArray(s);for(i=0;i<s;i+=1)o[i]="i"===t||"o"===t?[a[i][0]-n[i][0],a[i][1]-n[i][1]]:[a[i][0],a[i][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var i,s=this._segmentsLength,a=s.lengths,n=s.totalLength*t,o=0,h=a.length,p=0;o<h;){if(p+a[o].addedLength>n){var l=o,m=r.c&&o===h-1?0:o+1,f=(n-p)/a[o].addedLength;i=bez.getPointInSegment(r.v[l],r.v[m],r.o[l],r.i[m],f,a[o]);break}p+=a[o].addedLength,o+=1}return i||(i=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),i},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var i=this.pointOnPath(t,e),s=this.pointOnPath(t+.001,e),a=s[0]-i[0],n=s[1]-i[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2));return"tangent"===r?[a/o,n/o]:[-n/o,a/o]},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},setGroupProperty:expressionHelpers.setGroupProperty,getValueAtTime:expressionHelpers.getStaticValueAtTime},extendPrototype([r],t),extendPrototype([r],e),e.prototype.getValueAtTime=function(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastTime<t?this._caching.lastIndex:0,this._cachingAtTime.lastTime=t,this.interpolateShape(t,this._cachingAtTime.shapeValue,this._cachingAtTime)),this._cachingAtTime.shapeValue},e.prototype.initiateExpression=ExpressionManager.initiateExpression;var n=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(t,e,r,i,s){var a=n(t,e,r,i,s);return a.propertyIndex=e.ix,a.lock=!1,3===r?expressionHelpers.searchExpressions(t,e.pt,a):4===r&&expressionHelpers.searchExpressions(t,e.ks,a),a.k&&t.addDynamicProperty(a),a}}(),TextProperty.prototype.getExpressionValue=function(t,e){var r=this.calculateExpression(e);if(t.t===r)return t;var i={};return this.copyData(i,t),i.t=r.toString(),i.__complete=!1,i},TextProperty.prototype.searchProperty=function(){var t=this.searchKeyframes(),e=this.searchExpressions();return this.kf=t||e,this.kf},TextProperty.prototype.searchExpressions=function(){if(this.data.d.x)return this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.addEffect(this.getExpressionValue.bind(this)),!0};var ShapeExpressionInterface=function(t,e,r){var i;function s(t){if("number"==typeof t)return i[t-1];for(var e=0,r=i.length;e<r;){if(i[e]._name===t)return i[e];e+=1}}return s.propertyGroup=r,i=DT(t,e,s),s.numProperties=i.length,s};function DT(t,e,r){var i,s=[],a=t?t.length:0;for(i=0;i<a;i+=1)"gr"==t[i].ty?s.push(FT(t[i],e[i],r)):"fl"==t[i].ty?s.push(GT(t[i],e[i],r)):"st"==t[i].ty?s.push(HT(t[i],e[i],r)):"tm"==t[i].ty?s.push(IT(t[i],e[i],r)):"tr"==t[i].ty||("el"==t[i].ty?s.push(KT(t[i],e[i],r)):"sr"==t[i].ty?s.push(LT(t[i],e[i],r)):"sh"==t[i].ty?s.push(PT(t[i],e[i],r)):"rc"==t[i].ty?s.push(MT(t[i],e[i],r)):"rd"==t[i].ty?s.push(NT(t[i],e[i],r)):"rp"==t[i].ty&&s.push(OT(t[i],e[i],r)));return s}function FT(t,e,r){var i=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return i.content;default:return i.transform}};i.propertyGroup=function(t){return 1===t?i:r(t-1)};var s=function(t,e,r){function i(t){for(var e=0,r=s.length;e<r;){if(s[e]._name===t||s[e].mn===t||s[e].propertyIndex===t||s[e].ix===t||s[e].ind===t)return s[e];e+=1}if("number"==typeof t)return s[t-1]}var s;return i.propertyGroup=function(t){return 1===t?i:r(t-1)},s=DT(t.it,e.it,i.propertyGroup),i.numProperties=s.length,i.propertyIndex=t.cix,i._name=t.nm,i}(t,e,i.propertyGroup),a=function(e,t,r){function i(t){return 1==t?s:r(--t)}t.transform.mProps.o.setGroupProperty(i),t.transform.mProps.p.setGroupProperty(i),t.transform.mProps.a.setGroupProperty(i),t.transform.mProps.s.setGroupProperty(i),t.transform.mProps.r.setGroupProperty(i),t.transform.mProps.sk&&(t.transform.mProps.sk.setGroupProperty(i),t.transform.mProps.sa.setGroupProperty(i));function s(t){return e.a.ix===t||"Anchor Point"===t?s.anchorPoint:e.o.ix===t||"Opacity"===t?s.opacity:e.p.ix===t||"Position"===t?s.position:e.r.ix===t||"Rotation"===t||"ADBE Vector Rotation"===t?s.rotation:e.s.ix===t||"Scale"===t?s.scale:e.sk&&e.sk.ix===t||"Skew"===t?s.skew:e.sa&&e.sa.ix===t||"Skew Axis"===t?s.skewAxis:void 0}return t.transform.op.setGroupProperty(i),Object.defineProperties(s,{opacity:{get:ExpressionPropertyInterface(t.transform.mProps.o)},position:{get:ExpressionPropertyInterface(t.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(t.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(t.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(t.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(t.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(t.transform.mProps.sa)},_name:{value:e.nm}}),s.ty="tr",s.mn=e.mn,s.propertyGroup=r,s}(t.it[t.it.length-1],e.it[e.it.length-1],i.propertyGroup);return i.content=s,i.transform=a,Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.numProperties=t.np,i.propertyIndex=t.ix,i.nm=t.nm,i.mn=t.mn,i}function GT(t,e,r){function i(t){return"Color"===t||"color"===t?i.color:"Opacity"===t||"opacity"===t?i.opacity:void 0}return Object.defineProperties(i,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(r),e.o.setGroupProperty(r),i}function HT(t,e,r){function i(t){return 1===t?ob:r(t-1)}function s(t){return 1===t?h:i(t-1)}var a,n,o=t.d?t.d.length:0,h={};for(a=0;a<o;a+=1)n=a,Object.defineProperty(h,t.d[n].nm,{get:ExpressionPropertyInterface(e.d.dataProps[n].p)}),e.d.dataProps[a].p.setGroupProperty(s);function p(t){return"Color"===t||"color"===t?p.color:"Opacity"===t||"opacity"===t?p.opacity:"Stroke Width"===t||"stroke width"===t?p.strokeWidth:void 0}return Object.defineProperties(p,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},strokeWidth:{get:ExpressionPropertyInterface(e.w)},dash:{get:function(){return h}},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(i),e.o.setGroupProperty(i),e.w.setGroupProperty(i),p}function IT(e,t,r){function i(t){return 1==t?s:r(--t)}function s(t){return t===e.e.ix||"End"===t||"end"===t?s.end:t===e.s.ix?s.start:t===e.o.ix?s.offset:void 0}return s.propertyIndex=e.ix,t.s.setGroupProperty(i),t.e.setGroupProperty(i),t.o.setGroupProperty(i),s.propertyIndex=e.ix,s.propertyGroup=r,Object.defineProperties(s,{start:{get:ExpressionPropertyInterface(t.s)},end:{get:ExpressionPropertyInterface(t.e)},offset:{get:ExpressionPropertyInterface(t.o)},_name:{value:e.nm}}),s.mn=e.mn,s}function KT(e,t,r){function i(t){return 1==t?a:r(--t)}a.propertyIndex=e.ix;var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.s.ix===t?a.size:void 0}return s.s.setGroupProperty(i),s.p.setGroupProperty(i),Object.defineProperties(a,{size:{get:ExpressionPropertyInterface(s.s)},position:{get:ExpressionPropertyInterface(s.p)},_name:{value:e.nm}}),a.mn=e.mn,a}function LT(e,t,r){function i(t){return 1==t?a:r(--t)}var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.r.ix===t?a.rotation:e.pt.ix===t?a.points:e.or.ix===t||"ADBE Vector Star Outer Radius"===t?a.outerRadius:e.os.ix===t?a.outerRoundness:!e.ir||e.ir.ix!==t&&"ADBE Vector Star Inner Radius"!==t?e.is&&e.is.ix===t?a.innerRoundness:void 0:a.innerRadius}return a.propertyIndex=e.ix,s.or.setGroupProperty(i),s.os.setGroupProperty(i),s.pt.setGroupProperty(i),s.p.setGroupProperty(i),s.r.setGroupProperty(i),e.ir&&(s.ir.setGroupProperty(i),s.is.setGroupProperty(i)),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},rotation:{get:ExpressionPropertyInterface(s.r)},points:{get:ExpressionPropertyInterface(s.pt)},outerRadius:{get:ExpressionPropertyInterface(s.or)},outerRoundness:{get:ExpressionPropertyInterface(s.os)},innerRadius:{get:ExpressionPropertyInterface(s.ir)},innerRoundness:{get:ExpressionPropertyInterface(s.is)},_name:{value:e.nm}}),a.mn=e.mn,a}function MT(e,t,r){function i(t){return 1==t?a:r(--t)}var s="tm"===t.sh.ty?t.sh.prop:t.sh;function a(t){return e.p.ix===t?a.position:e.r.ix===t?a.roundness:e.s.ix===t||"Size"===t||"ADBE Vector Rect Size"===t?a.size:void 0}return a.propertyIndex=e.ix,s.p.setGroupProperty(i),s.s.setGroupProperty(i),s.r.setGroupProperty(i),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},roundness:{get:ExpressionPropertyInterface(s.r)},size:{get:ExpressionPropertyInterface(s.s)},_name:{value:e.nm}}),a.mn=e.mn,a}function NT(e,t,r){var i=t;function s(t){if(e.r.ix===t||"Round Corners 1"===t)return s.radius}return s.propertyIndex=e.ix,i.rd.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{radius:{get:ExpressionPropertyInterface(i.rd)},_name:{value:e.nm}}),s.mn=e.mn,s}function OT(e,t,r){function i(t){return 1==t?a:r(--t)}var s=t;function a(t){return e.c.ix===t||"Copies"===t?a.copies:e.o.ix===t||"Offset"===t?a.offset:void 0}return a.propertyIndex=e.ix,s.c.setGroupProperty(i),s.o.setGroupProperty(i),Object.defineProperties(a,{copies:{get:ExpressionPropertyInterface(s.c)},offset:{get:ExpressionPropertyInterface(s.o)},_name:{value:e.nm}}),a.mn=e.mn,a}function PT(t,e,r){var i=e.sh;function s(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return s.path}return i.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{path:{get:function(){return i.k&&i.getValue(),i}},shape:{get:function(){return i.k&&i.getValue(),i}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),s}var TextExpressionInterface=function(e){var r;function t(){}return Object.defineProperty(t,"sourceText",{get:function(){e.textProperty.getValue();var t=e.textProperty.currentData.t;return void 0!==t&&(e.textProperty.currentData.t=void 0,(r=new String(t)).value=t||new String(t)),r}}),t},LayerExpressionInterface=function(e){var r;function i(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return i.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return r;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return i.effect}}i.toWorld=_V,i.fromWorld=aW,i.toComp=_V,i.fromComp=bW,i.sampleImage=cW,i.sourceRectAtTime=e.sourceRectAtTime.bind(e);var t=getDescriptor(r=TransformExpressionInterface((i._elem=e).finalTransform.mProp),"anchorPoint");return Object.defineProperties(i,{hasParent:{get:function(){return e.hierarchy.length}},parent:{get:function(){return e.hierarchy[0].layerInterface}},rotation:getDescriptor(r,"rotation"),scale:getDescriptor(r,"scale"),position:getDescriptor(r,"position"),opacity:getDescriptor(r,"opacity"),anchorPoint:t,anchor_point:t,transform:{get:function(){return r}},active:{get:function(){return e.isInRange}}}),i.startTime=e.data.st,i.index=e.data.ind,i.source=e.data.refId,i.height=0===e.data.ty?e.data.h:100,i.width=0===e.data.ty?e.data.w:100,i.inPoint=e.data.ip/e.comp.globalData.frameRate,i.outPoint=e.data.op/e.comp.globalData.frameRate,i._name=e.data.nm,i.registerMaskInterface=function(t){i.mask=new MaskManagerInterface(t,e)},i.registerEffectsInterface=function(t){i.effect=t},i};function _V(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.applyToPointArray(t[0],t[1],t[2]||0)}return r.applyToPointArray(t[0],t[1],t[2]||0)}function aW(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function bW(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var r,i=this._elem.hierarchy.length;for(r=0;r<i;r+=1)this._elem.hierarchy[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}function cW(){return[1,1,1,1]}var CompExpressionInterface=function(i){function t(t){for(var e=0,r=i.layers.length;e<r;){if(i.layers[e].nm===t||i.layers[e].ind===t)return i.elements[e].layerInterface;e+=1}return null}return Object.defineProperty(t,"_name",{value:i.data.nm}),(t.layer=t).pixelAspect=1,t.height=i.data.h||i.globalData.compSize.h,t.width=i.data.w||i.globalData.compSize.w,t.pixelAspect=1,t.frameDuration=1/i.globalData.frameRate,t.displayStartTime=0,t.numLayers=i.layers.length,t},TransformExpressionInterface=function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}if(Object.defineProperty(e,"rotation",{get:ExpressionPropertyInterface(t.r||t.rz)}),Object.defineProperty(e,"zRotation",{get:ExpressionPropertyInterface(t.rz||t.r)}),Object.defineProperty(e,"xRotation",{get:ExpressionPropertyInterface(t.rx)}),Object.defineProperty(e,"yRotation",{get:ExpressionPropertyInterface(t.ry)}),Object.defineProperty(e,"scale",{get:ExpressionPropertyInterface(t.s)}),t.p)var r=ExpressionPropertyInterface(t.p);return Object.defineProperty(e,"position",{get:function(){return t.p?r():[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:ExpressionPropertyInterface(t.px)}),Object.defineProperty(e,"yPosition",{get:ExpressionPropertyInterface(t.py)}),Object.defineProperty(e,"zPosition",{get:ExpressionPropertyInterface(t.pz)}),Object.defineProperty(e,"anchorPoint",{get:ExpressionPropertyInterface(t.a)}),Object.defineProperty(e,"opacity",{get:ExpressionPropertyInterface(t.o)}),Object.defineProperty(e,"skew",{get:ExpressionPropertyInterface(t.sk)}),Object.defineProperty(e,"skewAxis",{get:ExpressionPropertyInterface(t.sa)}),Object.defineProperty(e,"orientation",{get:ExpressionPropertyInterface(t.or)}),e},ProjectInterface=function(){function t(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return t.compositions=[],t.currentFrame=0,t.registerComposition=LW,t};function LW(t){this.compositions.push(t)}var EffectsExpressionInterface={createEffectsInterface:function(s,t){if(s.effectsManager){var e,a=[],r=s.data.ef,i=s.effectsManager.effectElements.length;for(e=0;e<i;e+=1)a.push(TW(r[e],s.effectsManager.effectElements[e],t,s));return function(t){for(var e=s.data.ef||[],r=0,i=e.length;r<i;){if(t===e[r].nm||t===e[r].mn||t===e[r].ix)return a[r];r+=1}}}}};function TW(s,t,e,r){var i,a=[],n=s.ef.length;for(i=0;i<n;i+=1)5===s.ef[i].ty?a.push(TW(s.ef[i],t.effectElements[i],t.effectElements[i].propertyGroup,r)):a.push(UW(t.effectElements[i],s.ef[i].ty,r,o));function o(t){return 1===t?h:e(t-1)}var h=function(t){for(var e=s.ef,r=0,i=e.length;r<i;){if(t===e[r].nm||t===e[r].mn||t===e[r].ix)return 5===e[r].ty?a[r]:a[r]();r+=1}return a[0]()};return h.propertyGroup=o,"ADBE Color Control"===s.mn&&Object.defineProperty(h,"color",{get:function(){return a[0]()}}),Object.defineProperty(h,"numProperties",{get:function(){return s.np}}),h.active=h.enabled=0!==s.en,h}function UW(t,e,r,i){var s=ExpressionPropertyInterface(t.p);return t.p.setGroupProperty&&t.p.setGroupProperty(i),function(){return 10===e?r.comp.compInterface(t.p.v):s()}}var MaskManagerInterface=function(){function a(t,e){this._mask=t,this._data=e}Object.defineProperty(a.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});return function(e,t){var r,i=createSizedArray(e.viewData.length),s=e.viewData.length;for(r=0;r<s;r+=1)i[r]=new a(e.viewData[r],e.masksProperties[r]);return function(t){for(r=0;r<s;){if(e.masksProperties[r].nm===t)return i[r];r+=1}}}}(),ExpressionPropertyInterface=(KX={pv:0,v:0,mult:1},LX={pv:[0,0,0],v:[0,0,0],mult:1},function(t){return t?"unidimensional"===t.propType?function(t){t&&"pv"in t||(t=KX);var e=1/t.mult,r=t.pv*e,i=new Number(r);return i.value=r,MX(i,t,"unidimensional"),function(){return t.k&&t.getValue(),r=t.v*e,i.value!==r&&((i=new Number(r)).value=r,MX(i,t,"unidimensional")),i}}(t):function(e){e&&"pv"in e||(e=LX);var r=1/e.mult,i=e.pv.length,s=createTypedArray("float32",i),a=createTypedArray("float32",i);return s.value=a,MX(s,e,"multidimensional"),function(){e.k&&e.getValue();for(var t=0;t<i;t+=1)s[t]=a[t]=e.v[t]*r;return s}}(t):PX}),KX,LX,fY,gY;function MX(i,s,a){Object.defineProperty(i,"velocity",{get:function(){return s.getVelocityAtTime(s.comp.currentFrame)}}),i.numKeys=s.keyframes?s.keyframes.length:0,i.key=function(t){if(i.numKeys){var e="";e="s"in s.keyframes[t-1]?s.keyframes[t-1].s:"e"in s.keyframes[t-2]?s.keyframes[t-2].e:s.keyframes[t-2].s;var r="unidimensional"===a?new Number(e):Object.assign({},e);return r.time=s.keyframes[t-1].t/s.elem.comp.globalData.frameRate,r}return 0},i.valueAtTime=s.getValueAtTime,i.speedAtTime=s.getSpeedAtTime,i.velocityAtTime=s.getVelocityAtTime,i.propertyGroup=s.propertyGroup}function PX(){return KX}function hY(t,e){return this.textIndex=t+1,this.textTotal=e,this.v=this.getValue()*this.mult,this.v}function SliderEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(t,e){var r=t.ef||[];this.effectElements=[];var i,s,a=r.length;for(i=0;i<a;i++)s=new GroupEffect(r[i],e),this.effectElements.push(s)}function GroupEffect(t,e){this.init(t,e)}fY=function(t,e){this.pv=1,this.comp=t.comp,this.elem=t,this.mult=.01,this.propType="textSelector",this.textTotal=e.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],this.k=!0,this.x=!0,this.getValue=ExpressionManager.initiateExpression.bind(this)(t,e,this),this.getMult=hY,this.getVelocityAtTime=expressionHelpers.getVelocityAtTime,this.kf?this.getValueAtTime=expressionHelpers.getValueAtTime.bind(this):this.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(this),this.setGroupProperty=expressionHelpers.setGroupProperty},gY=TextSelectorProp.getTextSelectorProp,TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new fY(t,e,r):gY(t,e,r)},extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(t,e){this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var r,i,s=this.data.ef.length,a=this.data.ef;for(r=0;r<s;r+=1){switch(i=null,a[r].ty){case 0:i=new SliderEffect(a[r],e,this);break;case 1:i=new AngleEffect(a[r],e,this);break;case 2:i=new ColorEffect(a[r],e,this);break;case 3:i=new PointEffect(a[r],e,this);break;case 4:case 7:i=new CheckboxEffect(a[r],e,this);break;case 10:i=new LayerIndexEffect(a[r],e,this);break;case 11:i=new MaskIndexEffect(a[r],e,this);break;case 5:i=new EffectsManager(a[r],e,this);break;default:i=new NoValueEffect(a[r],e,this)}i&&this.effectElements.push(i)}};var lottiejs={},_isFrozen=!1;function loadAnimation(t){return animationManager.loadAnimation(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&1<t&&(defaultCurveSegments=t);roundValues(!(50<=defaultCurveSegments))}lottiejs.play=animationManager.play,lottiejs.pause=animationManager.pause,lottiejs.togglePause=animationManager.togglePause,lottiejs.setSpeed=animationManager.setSpeed,lottiejs.setDirection=animationManager.setDirection,lottiejs.stop=animationManager.stop,lottiejs.registerAnimation=animationManager.registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.resize=animationManager.resize,lottiejs.goToAndStop=animationManager.goToAndStop,lottiejs.destroy=animationManager.destroy,lottiejs.setQuality=setQuality,lottiejs.freeze=animationManager.freeze,lottiejs.unfreeze=animationManager.unfreeze,lottiejs.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottiejs.version="5.5.2";var renderer="";return lottiejs}({}),currentAnimation=null;onmessage=function(t){if(t&&t.data){var e=null;if(currentAnimation)e=currentAnimation.renderer.canvasContext.canvas;else{if(!t.data.canvas)return;e=t.data.canvas}if(t.data.drawSize&&(e.height=t.data.drawSize.height,e.width=t.data.drawSize.width,currentAnimation&&currentAnimation.resize()),!currentAnimation){if(!t.data.animationData||!t.data.params)return;var r=t.data.params,i=e.getContext("2d");(currentAnimation=lottiejs.loadAnimation({renderer:"canvas",loop:r.loop,autoplay:r.autoplay,animationData:t.data.animationData,rendererSettings:{context:i,scaleMode:"noScale",clearCanvas:!0}})).play()}}};
\ No newline at end of file
diff --git a/third_party/markdown/OWNERS b/third_party/markdown/OWNERS
index 3977817..8a94c5d 100644
--- a/third_party/markdown/OWNERS
+++ b/third_party/markdown/OWNERS
@@ -1,2 +1,3 @@
 hukun@chromium.org
 rockot@google.com
+# COMPONENT: Tools
diff --git a/third_party/metrics_proto/OWNERS b/third_party/metrics_proto/OWNERS
index d8dcbe96..4fead43 100644
--- a/third_party/metrics_proto/OWNERS
+++ b/third_party/metrics_proto/OWNERS
@@ -5,3 +5,4 @@
 per-file execution_context.proto=wittman@chromium.org
 
 # COMPONENT: Internals>Metrics
+# TEAM: chromium-dev@chromium.org
diff --git a/third_party/motemplate/OWNERS b/third_party/motemplate/OWNERS
index e06924a..03dd10d 100644
--- a/third_party/motemplate/OWNERS
+++ b/third_party/motemplate/OWNERS
@@ -1 +1,2 @@
 rockot@google.com
+# COMPONENT: Internals
diff --git a/third_party/proguard/OWNERS b/third_party/proguard/OWNERS
index 557bec58..7d4ada84 100644
--- a/third_party/proguard/OWNERS
+++ b/third_party/proguard/OWNERS
@@ -2,3 +2,5 @@
 smaier@chromium.org
 torne@chromium.org
 yfriedman@chromium.org
+# COMPONENT: Infra
+# TEAM: chromium-reviews@chromium.org
diff --git a/third_party/pystache/OWNERS b/third_party/pystache/OWNERS
index b7e271da..c715087 100644
--- a/third_party/pystache/OWNERS
+++ b/third_party/pystache/OWNERS
@@ -1,3 +1,5 @@
 hanxi@chromium.org
 pkotwicz@chromium.org
 yfriedman@chromium.org
+# COMPONENT: Mobile>WebAPKs
+# TEAM: chromium-reviews@chromium.org
diff --git a/third_party/robolectric/OWNERS b/third_party/robolectric/OWNERS
index 3d7d347..0e3c69c5 100644
--- a/third_party/robolectric/OWNERS
+++ b/third_party/robolectric/OWNERS
@@ -1,3 +1,4 @@
 agrieve@chromium.org
 jbudorick@chromium.org
 yolandyan@chromium.org
+# COMPONENT: Test>Android
diff --git a/third_party/simplejson/OWNERS b/third_party/simplejson/OWNERS
index e06924a..7e98ba1 100644
--- a/third_party/simplejson/OWNERS
+++ b/third_party/simplejson/OWNERS
@@ -1 +1,2 @@
 rockot@google.com
+# COMPONENT: Tools
diff --git a/third_party/smhasher/OWNERS b/third_party/smhasher/OWNERS
index 9734890a..cc38486 100644
--- a/third_party/smhasher/OWNERS
+++ b/third_party/smhasher/OWNERS
@@ -1,2 +1,3 @@
 cavalcantii@chromium.org
 dcheng@chromium.org
+# COMPONENT: Internals
diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c
index 9cbd3422..41dcdb3d 100644
--- a/third_party/sqlite/amalgamation/sqlite3.c
+++ b/third_party/sqlite/amalgamation/sqlite3.c
@@ -71965,7 +71965,12 @@
       ** new entry uses overflow pages, as the insertCell() call below is
       ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry.  */
       assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */
-      if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
+      if( oldCell < pPage->aData+pPage->hdrOffset+10 ){
+        return SQLITE_CORRUPT_BKPT;
+      }
+      if( oldCell+szNew > pPage->aDataEnd ){
+        return SQLITE_CORRUPT_BKPT;
+      }
       memcpy(oldCell, newCell, szNew);
       return SQLITE_OK;
     }
@@ -223270,7 +223275,7 @@
 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
 
 /************** End of stmt.c ************************************************/
-#if __LINE__!=223273
+#if __LINE__!=223278
 #undef SQLITE_SOURCE_ID
 #define SQLITE_SOURCE_ID      "2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88alt2"
 #endif
diff --git a/third_party/sqlite/patched/src/btree.c b/third_party/sqlite/patched/src/btree.c
index 23cb6bb..887be63 100644
--- a/third_party/sqlite/patched/src/btree.c
+++ b/third_party/sqlite/patched/src/btree.c
@@ -8724,7 +8724,12 @@
       ** new entry uses overflow pages, as the insertCell() call below is
       ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry.  */
       assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */
-      if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
+      if( oldCell < pPage->aData+pPage->hdrOffset+10 ){
+        return SQLITE_CORRUPT_BKPT;
+      }
+      if( oldCell+szNew > pPage->aDataEnd ){
+        return SQLITE_CORRUPT_BKPT;
+      }
       memcpy(oldCell, newCell, szNew);
       return SQLITE_OK;
     }
diff --git a/third_party/sqlite/patches/0001-Call-ioctl-with-the-correct-signature-on-both-Androi.patch b/third_party/sqlite/patches/0001-Call-ioctl-with-the-correct-signature-on-both-Androi.patch
index 962d36fd..d07d2a0 100644
--- a/third_party/sqlite/patches/0001-Call-ioctl-with-the-correct-signature-on-both-Androi.patch
+++ b/third_party/sqlite/patches/0001-Call-ioctl-with-the-correct-signature-on-both-Androi.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Sarthak Kukreti <sarthakkukreti@chromium.org>
 Date: Mon, 15 Jul 2019 17:23:45 -0700
-Subject: [PATCH 1/4] Call ioctl() with the correct signature on both Android
+Subject: [PATCH 1/5] Call ioctl() with the correct signature on both Android
  and stock Linux.
 
 This backports https://sqlite.org/src/info/68e12e063fe41bcd
diff --git a/third_party/sqlite/patches/0002-Fix-Heap-Buffer-Overflow.patch b/third_party/sqlite/patches/0002-Fix-Heap-Buffer-Overflow.patch
index 062ca26..50fcbb0 100644
--- a/third_party/sqlite/patches/0002-Fix-Heap-Buffer-Overflow.patch
+++ b/third_party/sqlite/patches/0002-Fix-Heap-Buffer-Overflow.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 17 Jul 2019 14:52:39 -0700
-Subject: [PATCH 2/4] Fix Heap-Buffer-Overflow
+Subject: [PATCH 2/5] Fix Heap-Buffer-Overflow
 
     Backports https://www.sqlite.org/src/info/bd9a47a3a2997bfb
 
diff --git a/third_party/sqlite/patches/0003-Fix-ASSERT-memIsValid-hit.patch b/third_party/sqlite/patches/0003-Fix-ASSERT-memIsValid-hit.patch
index 16252de..8593b75 100644
--- a/third_party/sqlite/patches/0003-Fix-ASSERT-memIsValid-hit.patch
+++ b/third_party/sqlite/patches/0003-Fix-ASSERT-memIsValid-hit.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 17 Jul 2019 15:22:41 -0700
-Subject: [PATCH 3/4] Fix ASSERT memIsValid hit
+Subject: [PATCH 3/5] Fix ASSERT memIsValid hit
 
 Backports https://www.sqlite.org/src/info/7ef7b23cbb1b9ace
 
diff --git a/third_party/sqlite/patches/0004-Fix-incorrect-assert.patch b/third_party/sqlite/patches/0004-Fix-incorrect-assert.patch
index 17b10d1..5aa12cb 100644
--- a/third_party/sqlite/patches/0004-Fix-incorrect-assert.patch
+++ b/third_party/sqlite/patches/0004-Fix-incorrect-assert.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 17 Jul 2019 15:24:25 -0700
-Subject: [PATCH 4/4] Fix incorrect assert
+Subject: [PATCH 4/5] Fix incorrect assert
 
 Backports https://www.sqlite.org/src/info/59c9e73f86b89ee1
 
diff --git a/third_party/sqlite/patches/0005-Fix-bad-chrome_sqlite3_free.patch b/third_party/sqlite/patches/0005-Fix-bad-chrome_sqlite3_free.patch
new file mode 100644
index 0000000..0ac3ad6b
--- /dev/null
+++ b/third_party/sqlite/patches/0005-Fix-bad-chrome_sqlite3_free.patch
@@ -0,0 +1,33 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 23 Jul 2019 15:11:19 -0700
+Subject: [PATCH 5/5] Fix bad chrome_sqlite3_free
+
+Backports https://www.sqlite.org/src/info/f60a83069168899d
+
+Bug: 979950
+---
+ third_party/sqlite/patched/src/btree.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/sqlite/patched/src/btree.c b/third_party/sqlite/patched/src/btree.c
+index 23cb6bb3b083..887be63bd7d0 100644
+--- a/third_party/sqlite/patched/src/btree.c
++++ b/third_party/sqlite/patched/src/btree.c
+@@ -8724,7 +8724,12 @@ int sqlite3BtreeInsert(
+       ** new entry uses overflow pages, as the insertCell() call below is
+       ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry.  */
+       assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */
+-      if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
++      if( oldCell < pPage->aData+pPage->hdrOffset+10 ){
++        return SQLITE_CORRUPT_BKPT;
++      }
++      if( oldCell+szNew > pPage->aDataEnd ){
++        return SQLITE_CORRUPT_BKPT;
++      }
+       memcpy(oldCell, newCell, szNew);
+       return SQLITE_OK;
+     }
+-- 
+2.22.0.657.g960e92d24f-goog
+
diff --git a/third_party/vulkan/OWNERS b/third_party/vulkan/OWNERS
index f119de20..7fef03b 100644
--- a/third_party/vulkan/OWNERS
+++ b/third_party/vulkan/OWNERS
@@ -3,3 +3,4 @@
 vmiura@chromium.org
 
 # COMPONENT: Internals>GPU>Internals
+# TEAM: graphics-dev@chromium.org
diff --git a/third_party/woff2/OWNERS b/third_party/woff2/OWNERS
index 458697e6..f3d45a13 100644
--- a/third_party/woff2/OWNERS
+++ b/third_party/woff2/OWNERS
@@ -1,2 +1,4 @@
 ksakamoto@chromium.org
 bashi@chromium.org
+# COMPONENT: Blink>Fonts
+# TEAM: loading-dev@chromium.org
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 3120c030..fca43c4 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -17161,6 +17161,30 @@
   </description>
 </action>
 
+<action name="ReleaseNotes.LaunchedAboutPage">
+  <owner>yulunwu@chromium.org</owner>
+  <description>
+    Release Notes was launched from clicking link in about page.
+  </description>
+</action>
+
+<action name="ReleaseNotes.LaunchedNotification">
+  <owner>yulunwu@chromium.org</owner>
+  <description>
+    Release Notes was launched from clicking notification.
+  </description>
+</action>
+
+<action name="ReleaseNotes.NotificationShown">
+  <owner>yulunwu@chromium.org</owner>
+  <description>Release Notes notification was shown.</description>
+</action>
+
+<action name="ReleaseNotes.ShowReleaseNotes">
+  <owner>yulunwu@chromium.org</owner>
+  <description>Release Notes app was launched.</description>
+</action>
+
 <action name="Reload">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index bcb8707..5826175 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4593,6 +4593,7 @@
   <int value="10" label="Trace upload failed"/>
   <int value="11" label="Trace upload succeeded"/>
   <int value="12" label="Startup scenario triggered"/>
+  <int value="13" label="Large upload waiting to retry"/>
 </enum>
 
 <enum name="BackingStoreResults">
@@ -10671,6 +10672,7 @@
   <int value="529697949" label="CPP_EH_EXCEPTION"/>
   <int value="533692099" label="STATUS_GUARD_PAGE_VIOLATION"/>
   <int value="536870904" label="Out of Memory"/>
+  <int value="1073740760" label="STATUS_INVALID_IMAGE_HASH"/>
   <int value="1073740791" label="STATUS_STACK_BUFFER_OVERRUN"/>
   <int value="1073740940" label="STATUS_HEAP_CORRUPTION"/>
   <int value="1073741502" label="STATUS_DLL_INIT_FAILED"/>
@@ -17499,6 +17501,7 @@
   <int value="574" label="BrowserGuestModeEnforced"/>
   <int value="575" label="BuiltinCertificateVerifierEnabled"/>
   <int value="576" label="CrostiniRootAccessAllowed"/>
+  <int value="577" label="VmManagementCliAllowed"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -24005,6 +24008,7 @@
   <int value="2968" label="SVGSMILDiscardElementParsed"/>
   <int value="2969" label="SVGSMILDiscardElementTriggered"/>
   <int value="2970" label="LinkHeaderStylesheet"/>
+  <int value="2971" label="V8PointerEvent_GetPredictedEvents_Method"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -35587,6 +35591,7 @@
   <int value="474743272" label="material-design-ink-drop"/>
   <int value="475858648"
       label="OverlayScrollbarFlashAfterAnyScrollUpdate:disabled"/>
+  <int value="477796416" label="ReleaseNotes:enabled"/>
   <int value="477967119" label="enable-unified-media-pipeline"/>
   <int value="479906041" label="RunAllFlashInAllowMode:disabled"/>
   <int value="480544447" label="NonValidatingReloadOnRefreshContentV2:enabled"/>
@@ -35690,6 +35695,7 @@
   <int value="633442161" label="ExperimentalUi:disabled"/>
   <int value="634789085" label="LayeredAPI:disabled"/>
   <int value="635076832" label="MarkHttpAs:disabled"/>
+  <int value="635533110" label="ReleaseNotes:disabled"/>
   <int value="635971109" label="PrintPdfAsImage:disabled"/>
   <int value="636341169" label="ExploreSites:disabled"/>
   <int value="636425179" label="mhtml-generator-option"/>
@@ -50050,13 +50056,28 @@
 </enum>
 
 <enum name="RecurrenceRankerConfigurationError">
+  <obsolete>
+    Replaced by RecurrenceRankerInitializationStatus
+  </obsolete>
   <int value="0" label="HashMismatch"/>
   <int value="1" label="InvalidParameter"/>
   <int value="2" label="InvalidPredictor"/>
   <int value="3" label="FakePredictorUsed"/>
 </enum>
 
+<enum name="RecurrenceRankerInitializationStatus">
+  <int value="0" label="InitializationOk"/>
+  <int value="1" label="EphemeralUser"/>
+  <int value="2" label="HashMismatch"/>
+  <int value="3" label="InvalidConfigParameter"/>
+  <int value="4" label="InvalidConfigPredictor"/>
+  <int value="5" label="FakePredictorUsed"/>
+</enum>
+
 <enum name="RecurrenceRankerSerializationError">
+  <obsolete>
+    Replaced by RecurrenceRankerSerializationStatus
+  </obsolete>
   <int value="0" label="ModelReadError"/>
   <int value="1" label="ModelWriteError"/>
   <int value="2" label="FromProtoError"/>
@@ -50069,7 +50090,37 @@
   <int value="9" label="ZeroStateHourBinnedPredictorLoadingError"/>
 </enum>
 
+<enum name="RecurrenceRankerSerializationStatus">
+  <int value="0" label="SaveOk"/>
+  <int value="1" label="LoadOk"/>
+  <int value="2" label="ModelReadError"/>
+  <int value="3" label="ModelWriteError"/>
+  <int value="4" label="FromProtoError"/>
+  <int value="5" label="ToProtoError"/>
+  <int value="6" label="PredictorMissingError"/>
+  <int value="7" label="TargetsMissingError"/>
+  <int value="8" label="ConditionsMissingError"/>
+  <int value="9" label="FakePredictorLoadingError"/>
+  <int value="10" label="ConditionalFrequencyPredictorLoadingError"/>
+  <int value="11" label="FrecencyPredictorLoadingError"/>
+  <int value="12" label="HourBinPredictorLoadingError"/>
+  <int value="13" label="MarkovPredictorLoadingError"/>
+  <int value="14" label="ExponentialWeightsEnsembleLoadingError"/>
+</enum>
+
+<enum name="RecurrenceRankerUsage">
+  <int value="0" label="Record"/>
+  <int value="1" label="Rank"/>
+  <int value="2" label="RemoveCondition"/>
+  <int value="3" label="RenameCondition"/>
+  <int value="4" label="RemoveTarget"/>
+  <int value="5" label="RenameTarget"/>
+</enum>
+
 <enum name="RecurrenceRankerUsageError">
+  <obsolete>
+    Deprecated 07/2019.
+  </obsolete>
   <int value="0" label="InvalidTrainCall"/>
   <int value="1" label="InvalidRankCall"/>
 </enum>
@@ -62526,6 +62577,7 @@
   <int value="-1073740791" label="0xC0000409 - STATUS_STACK_BUFFER_OVERRUN"/>
   <int value="-1073740777"
       label="0xC0000417 - STATUS_INVALID_CRUNTIME_PARAMETER"/>
+  <int value="-1073740760" label="0xC0000428 - STATUS_INVALID_IMAGE_HASH"/>
   <int value="-1073740022"
       label="0xC000070A - STATUS_THREADPOOL_HANDLE_EXCEPTION"/>
   <int value="-1073740021"
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 605702df..8efe2cc 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -482,8 +482,12 @@
 </histogram>
 
 <histogram name="Accessibility.OOBEStartupSoundDelay" units="ms"
-    expires_after="M77">
+    expires_after="never">
+<!-- expires-never: Core metric for monitoring OOBE accessibility status. -->
+
   <owner>lpalmaro@chromium.org</owner>
+  <owner>jessejames@chromium.org</owner>
+  <owner>rsorokin@chromium.org</owner>
   <owner>alemate@chromium.org</owner>
   <summary>
     Delay between login_prompt_visible and Chrome OS OOBE startup sound
@@ -37527,6 +37531,34 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Event.Pen.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Negative"
+    units="microseconds" expires_after="M79">
+  <owner>nzolghadr@chromium.org</owner>
+  <owner>sarsha@microsoft.com</owner>
+  <summary>
+    On Windows, reports negative time delta between pointer input timestamps
+    based on TimeNow and the timestamp reported via
+    PointerInfo.PerformanceCount. This negative time delta is w.r.t to
+    PerformanceCount. See also
+    Pen.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Positive.
+  </summary>
+</histogram>
+
+<histogram
+    name="Event.Pen.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Positive"
+    units="microseconds" expires_after="M79">
+  <owner>nzolghadr@chromium.org</owner>
+  <owner>sarsha@microsoft.com</owner>
+  <summary>
+    On Windows, reports positive time delta between pointer input timestamps
+    based on TimeNow and the timestamp reported via
+    PointerInfo.PerformanceCount. This positive time delta is w.r.t to
+    PerformanceCount. See also
+    Pen.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Negative.
+  </summary>
+</histogram>
+
 <histogram name="Event.RenderView.DiscardInput" enum="BooleanHit"
     expires_after="2017-06-26">
   <obsolete>
@@ -37639,6 +37671,34 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Event.Touch.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Negative"
+    units="microseconds" expires_after="M79">
+  <owner>nzolghadr@chromium.org</owner>
+  <owner>sarsha@microsoft.com</owner>
+  <summary>
+    On Windows, reports negative time delta between pointer input timestamps
+    based on TimeNow and the timestamp reported via
+    PointerInfo.PerformanceCount. This negative time delta is w.r.t to
+    PerformanceCount. See also
+    Touch.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Positive.
+  </summary>
+</histogram>
+
+<histogram
+    name="Event.Touch.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Positive"
+    units="microseconds" expires_after="M79">
+  <owner>nzolghadr@chromium.org</owner>
+  <owner>sarsha@microsoft.com</owner>
+  <summary>
+    On Windows, reports positive time delta between pointer input timestamps
+    based on TimeNow and the timestamp reported via
+    PointerInfo.PerformanceCount. This positive time delta is w.r.t to
+    PerformanceCount. See also
+    Touch.InputEventTimeStamp.DeltaBetweenTimeNowAndPerformanceCount.Negative.
+  </summary>
+</histogram>
+
 <histogram name="Event.Touch.TargetAndDispatchResult"
     enum="TouchTargetAndDispatchResultType" expires_after="2016-05-19">
   <obsolete>
@@ -48465,16 +48525,18 @@
 </histogram>
 
 <histogram name="HIDDetection.OOBEDevicesDetectedOnContinuePressed"
-    enum="HIDContinueScenarioType" expires_after="M77">
-  <owner>alemate@chromium.org</owner>
+    enum="HIDContinueScenarioType" expires_after="M87">
+  <owner>rsorokin@chromium.org</owner>
+  <owner>oac-team@google.com</owner>
   <summary>
     Which HID were detected when user pressed Continue on OOBE dialog. This
     metric is specific to Chrome OS.
   </summary>
 </histogram>
 
-<histogram name="HIDDetection.OOBEDialogShown" expires_after="M77">
-  <owner>alemate@chromium.org</owner>
+<histogram name="HIDDetection.OOBEDialogShown" expires_after="M87">
+  <owner>rsorokin@chromium.org</owner>
+  <owner>oac-team@google.com</owner>
   <summary>
     Whether HID detection dialog was shown on OOBE. Logged on screen show or on
     screen skip respectively. This metric is specific to Chrome OS.
@@ -48482,7 +48544,8 @@
 </histogram>
 
 <histogram name="HIDDetection.TimesDialogShownPerOOBECompleted"
-    expires_after="M78">
+    expires_after="M97">
+  <owner>rsorokin@chromium.org</owner>
   <owner>alemate@chromium.org</owner>
   <summary>
     Records number of times the dialog was shown by the time OOBE is completed.
@@ -89361,8 +89424,12 @@
   <summary>Whether the reocmmend apps screen is shown.</summary>
 </histogram>
 
-<histogram name="OOBE.StepCompletionTime" units="ms">
+<histogram name="OOBE.StepCompletionTime" units="ms" expires_after="never">
+<!-- expires-never: Core metric for monitoring OOBE flow regressions. -->
+
   <owner>alemate@chromium.org</owner>
+  <owner>antrim@chromium.org</owner>
+  <owner>rsorokin@chromium.org</owner>
   <summary>Time spent on specific OOBE screen.</summary>
 </histogram>
 
@@ -107901,6 +107968,9 @@
 
 <histogram name="RecurrenceRanker.ConfigurationError"
     enum="RecurrenceRankerConfigurationError">
+  <obsolete>
+    Replaced by RecurrenceRanker.InitializationStatus.
+  </obsolete>
   <owner>tby@chromium.org</owner>
   <owner>charleszhao@chromium.org</owner>
   <summary>
@@ -107908,6 +107978,32 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="RecurrenceRanker.InitializationStatus"
+    enum="RecurrenceRankerInitializationStatus" expires_after="M85">
+<!-- Name completed by histogram_suffixes
+       name="RecurrenceRankerModel" -->
+
+  <owner>tby@chromium.org</owner>
+  <owner>charleszhao@chromium.org</owner>
+  <summary>
+    Records situations that can occur during the configuration and
+    initialization of a RecurrenceRanker.
+  </summary>
+</histogram>
+
+<histogram base="true" name="RecurrenceRanker.JsonConfigConversionStatus"
+    enum="BooleanSuccess" expires_after="M85">
+<!-- Name completed by histogram_suffixes
+       name="RecurrenceRankerModel" -->
+
+  <owner>tby@chromium.org</owner>
+  <owner>charleszhao@chromium.org</owner>
+  <summary>
+    Whether the conversion of a JSON config for a RecurrenceRanker succeeded for
+    failed.
+  </summary>
+</histogram>
+
 <histogram name="RecurrenceRanker.LogFileOpenType" enum="FileOpenType"
     expires_after="2019-12-31">
   <owner>jiameng@chromium.org</owner>
@@ -107920,6 +108016,9 @@
 
 <histogram name="RecurrenceRanker.SerializationError"
     enum="RecurrenceRankerSerializationError">
+  <obsolete>
+    Replaced by RecurrenceRanker.SerializationStatus.
+  </obsolete>
   <owner>tby@chromium.org</owner>
   <owner>charleszhao@chromium.org</owner>
   <summary>
@@ -107928,7 +108027,34 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="RecurrenceRanker.SerializationStatus"
+    enum="RecurrenceRankerSerializationStatus" expires_after="M85">
+<!-- Name completed by histogram_suffixes
+       name="RecurrenceRankerModel" -->
+
+  <owner>tby@chromium.org</owner>
+  <owner>charleszhao@chromium.org</owner>
+  <summary>
+    Reports the result of a save or load of a RecurrenceRanker model.
+  </summary>
+</histogram>
+
+<histogram base="true" name="RecurrenceRanker.Usage"
+    enum="RecurrenceRankerUsage" expires_after="M85">
+<!-- Name completed by histogram_suffixes
+       name="RecurrenceRankerModel" -->
+
+  <owner>tby@chromium.org</owner>
+  <owner>charleszhao@chromium.org</owner>
+  <summary>
+    Reports when the functions of a RecurrenceRanker model are used.
+  </summary>
+</histogram>
+
 <histogram name="RecurrenceRanker.UsageError" enum="RecurrenceRankerUsageError">
+  <obsolete>
+    The cases this reported can no longer occur.
+  </obsolete>
   <owner>tby@chromium.org</owner>
   <owner>charleszhao@chromium.org</owner>
   <summary>
@@ -122517,6 +122643,17 @@
   </summary>
 </histogram>
 
+<histogram name="ServiceWorkerCache.UsedIndexFileSize" enum="Boolean"
+    expires_after="M85">
+  <owner>wanderview@chromium.org</owner>
+  <owner>chrome-owp-storage@google.com</owner>
+  <summary>
+    Whether the size was calculated using the values stored in the origin's
+    index file. If this is false, then the size was recalculated by loading all
+    of the individual cache backends.
+  </summary>
+</histogram>
+
 <histogram name="Servicification.Startup" enum="ServicificationStartupMode"
     expires_after="2019-02-26">
   <obsolete>
@@ -123590,8 +123727,9 @@
 </histogram>
 
 <histogram name="Settings.PinUnlockSetup" enum="LockScreenProgress"
-    expires_after="M77">
-  <owner>sammiequon@chromium.org</owner>
+    expires_after="M97">
+  <owner>rsorokin@chromium.org</owner>
+  <owner>jessejames@chromium.org</owner>
   <summary>
     The users progress through the pin unlock setup wizard. Each type
     corresponds to the user completeing a different stage of the setup wizard.
@@ -142994,8 +143132,12 @@
 </histogram>
 
 <histogram name="UserManager.UserTypeChanged" enum="UserTypeChanged"
-    expires_after="M77">
+    expires_after="never">
+<!-- expires-never: Core metric for monitoring User type change regressions. -->
+
   <owner>alemate@chromium.org</owner>
+  <owner>michaelpg@chromium.org</owner>
+  <owner>rsorokin@chromium.org</owner>
   <summary>
     This is logged when new user type reported by Gaia is different from the old
     one (for existing user).
@@ -162660,10 +162802,25 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="OobeScreenName" separator=".">
+  <suffix name="App-downloading"/>
+  <suffix name="Arc_tos"/>
+  <suffix name="Assistant-optin-flow"/>
+  <suffix name="Auto-enrollment-check"/>
+  <suffix name="Demo-preferences"/>
+  <suffix name="Discover"/>
+  <suffix name="Enroll"/>
   <suffix name="Eula"/>
+  <suffix name="Fingerprint-setup"/>
   <suffix name="Hid-detection"/>
   <suffix name="Image"/>
+  <suffix name="Marketing-opt-in"/>
+  <suffix name="Multidevice-setup"/>
   <suffix name="Network"/>
+  <suffix name="Network-selection"/>
+  <suffix name="Recommend-apps"/>
+  <suffix name="Reset"/>
+  <suffix name="Sync-consent"/>
+  <suffix name="Tos"/>
   <suffix name="Update"/>
   <suffix name="Wrong-hwid"/>
   <affected-histogram name="OOBE.StepCompletionTime"/>
@@ -165120,6 +165277,15 @@
   <affected-histogram name="Net.QuicSession.ReadError"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="RecurrenceRankerModel" separator=".">
+  <suffix name="QueryBasedMixedTypes"/>
+  <suffix name="QueryBasedMixedTypesGroup"/>
+  <suffix name="ZeroStateMixedTypes"/>
+  <affected-histogram name="RecurrenceRanker.InitializationStatus"/>
+  <affected-histogram name="RecurrenceRanker.SerializationStatus"/>
+  <affected-histogram name="RecurrenceRanker.Usage"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ReferrerAttribution" separator=".">
   <suffix name="ApkDownloadTelemetry"
       label="APK downloads referrer attribution."/>
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index afb0236..f634b79 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3856,7 +3856,7 @@
       selection_start == selection_end)
     return nullptr;
 
-  return atk_text::GetText(ATK_TEXT(atk_object_), selection_start,
+  return atk_text::GetText(ATK_TEXT(GetOrCreateAtkObject()), selection_start,
                            selection_end);
 }
 
diff --git a/ui/base/clipboard/BUILD.gn b/ui/base/clipboard/BUILD.gn
index 4ac85f4..cc189e3 100644
--- a/ui/base/clipboard/BUILD.gn
+++ b/ui/base/clipboard/BUILD.gn
@@ -100,6 +100,7 @@
         deps += [
           "//ui/base",
           "//ui/base/x",
+          "//ui/events/x",
           "//ui/gfx/x",
         ]
       }
diff --git a/ui/base/clipboard/clipboard_aurax11.cc b/ui/base/clipboard/clipboard_aurax11.cc
index 55bc8738..63f9a13 100644
--- a/ui/base/clipboard/clipboard_aurax11.cc
+++ b/ui/base/clipboard/clipboard_aurax11.cc
@@ -28,10 +28,10 @@
 #include "ui/base/x/selection_requestor.h"
 #include "ui/base/x/selection_utils.h"
 #include "ui/base/x/x11_util.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/platform_event_observer.h"
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/x/x11.h"
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn
index cdca05a40..bf90e92 100644
--- a/ui/base/x/BUILD.gn
+++ b/ui/base/x/BUILD.gn
@@ -23,8 +23,6 @@
     "x11_util_internal.h",
     "x11_window.cc",
     "x11_window.h",
-    "x11_window_event_manager.cc",
-    "x11_window_event_manager.h",
   ]
 
   configs += [
diff --git a/ui/base/x/selection_owner.cc b/ui/base/x/selection_owner.cc
index 4efee2d..76d95fdd 100644
--- a/ui/base/x/selection_owner.cc
+++ b/ui/base/x/selection_owner.cc
@@ -8,8 +8,8 @@
 
 #include "base/logging.h"
 #include "ui/base/x/selection_utils.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 
diff --git a/ui/base/x/x11_window.cc b/ui/base/x/x11_window.cc
index 540e018..cc30577 100644
--- a/ui/base/x/x11_window.cc
+++ b/ui/base/x/x11_window.cc
@@ -14,12 +14,12 @@
 #include "ui/base/x/x11_pointer_grab.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/base/x/x11_util_internal.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/devices/x11/device_data_manager_x11.h"
 #include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/x/events_x_utils.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_skia_rep.h"
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index f102bec3..41119f7 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -174,7 +174,10 @@
 
   if (use_x11) {
     configs += [ "//build/config/linux:x11" ]
-    deps += [ "//ui/gfx/x" ]
+    deps += [
+      "//ui/events/x",
+      "//ui/gfx/x",
+    ]
   }
 
   if (is_mac) {
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index adc2e10..e5c3249 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -19,7 +19,11 @@
   "run_all_unittests\.cc": [
     "+mojo/core/embedder",
   ],
+  "test.*_x11\.cc": [
+    "+ui/events/x",
+  ],
   ".*_(unit|pixel|perf)test.*\.cc": [
     "+components/viz/test",
   ],
 }
+
diff --git a/ui/compositor/test/test_compositor_host_x11.cc b/ui/compositor/test/test_compositor_host_x11.cc
index dc9cbb4d..8b0476b 100644
--- a/ui/compositor/test/test_compositor_host_x11.cc
+++ b/ui/compositor/test/test_compositor_host_x11.cc
@@ -14,8 +14,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/compositor/compositor.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_types.h"
diff --git a/ui/events/blink/blink_event_util.cc b/ui/events/blink/blink_event_util.cc
index 3749059..2498868 100644
--- a/ui/events/blink/blink_event_util.cc
+++ b/ui/events/blink/blink_event_util.cc
@@ -317,17 +317,9 @@
   }
 
   if (event.has_synthetic_phase) {
-    // Synthetic phase information is added based on a timer in
-    // MouseWheelPhaseHandler. This information is for simulating scroll
-    // sequences when the beginning and end of scrolls are not available. It is
-    // alright to coalesce an event with synthetic phaseBegan to its previous
-    // event with synthetic phaseEnded since these phase values don't correspond
-    // with real start and end of the scroll sequences.
-    // It is also alright to coalesce a wheel event with synthetic phaseChanged
-    // to its previous one with synthetic phaseBegan.
-    return (event.phase == WebMouseWheelEvent::kPhaseEnded &&
-            event_to_coalesce.phase == WebMouseWheelEvent::kPhaseBegan) ||
-           (event.phase == WebMouseWheelEvent::kPhaseBegan &&
+    // It is alright to coalesce a wheel event with synthetic phaseChanged to
+    // its previous one with synthetic phaseBegan.
+    return (event.phase == WebMouseWheelEvent::kPhaseBegan &&
             event_to_coalesce.phase == WebMouseWheelEvent::kPhaseChanged);
   }
   return false;
@@ -377,18 +369,11 @@
       MergeDispatchTypes(old_dispatch_type, event_to_coalesce.dispatch_type);
   if (event_to_coalesce.has_synthetic_phase &&
       event_to_coalesce.phase != old_phase) {
-    if (event_to_coalesce.phase == WebMouseWheelEvent::kPhaseBegan) {
-      // Coalesce a wheel event with synthetic phase began with a wheel event
-      // with synthetic phase ended.
-      DCHECK_EQ(WebMouseWheelEvent::kPhaseEnded, old_phase);
-      event->phase = WebMouseWheelEvent::kPhaseChanged;
-    } else {
-      // Coalesce  a wheel event with synthetic phase changed to a wheel event
-      // with synthetic phase began.
-      DCHECK_EQ(WebMouseWheelEvent::kPhaseChanged, event_to_coalesce.phase);
-      DCHECK_EQ(WebMouseWheelEvent::kPhaseBegan, old_phase);
-      event->phase = WebMouseWheelEvent::kPhaseBegan;
-    }
+    // Coalesce  a wheel event with synthetic phase changed to a wheel event
+    // with synthetic phase began.
+    DCHECK_EQ(WebMouseWheelEvent::kPhaseChanged, event_to_coalesce.phase);
+    DCHECK_EQ(WebMouseWheelEvent::kPhaseBegan, old_phase);
+    event->phase = WebMouseWheelEvent::kPhaseBegan;
   }
 }
 
diff --git a/ui/events/blink/blink_event_util_unittest.cc b/ui/events/blink/blink_event_util_unittest.cc
index 04b8b52..dbaa3698 100644
--- a/ui/events/blink/blink_event_util_unittest.cc
+++ b/ui/events/blink/blink_event_util_unittest.cc
@@ -252,21 +252,24 @@
   coalesced_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
   EXPECT_FALSE(CanCoalesce(event_to_be_coalesced, coalesced_event));
 
+  // With timer based wheel scroll latching, we break the latching sequence on
+  // direction change when all prior GSU events in the current sequence are
+  // ignored. To do so we dispatch the pending wheel event with phaseEnded and
+  // the first wheel event in the opposite direction will have phaseBegan. The
+  // GSB generated from this wheel event will cause a new hittesting. To make
+  // sure that a GSB will actually get created we should not coalesce the wheel
+  // event with synthetic kPhaseBegan to one with synthetic kPhaseEnded.
   event_to_be_coalesced.has_synthetic_phase = true;
   coalesced_event.has_synthetic_phase = true;
-  EXPECT_TRUE(CanCoalesce(event_to_be_coalesced, coalesced_event));
-  Coalesce(event_to_be_coalesced, &coalesced_event);
-  EXPECT_EQ(blink::WebMouseWheelEvent::kPhaseChanged, coalesced_event.phase);
-  EXPECT_EQ(7, coalesced_event.delta_x);
-  EXPECT_EQ(9, coalesced_event.delta_y);
+  EXPECT_FALSE(CanCoalesce(event_to_be_coalesced, coalesced_event));
 
   event_to_be_coalesced.phase = blink::WebMouseWheelEvent::kPhaseChanged;
   coalesced_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
   EXPECT_TRUE(CanCoalesce(event_to_be_coalesced, coalesced_event));
   Coalesce(event_to_be_coalesced, &coalesced_event);
   EXPECT_EQ(blink::WebMouseWheelEvent::kPhaseBegan, coalesced_event.phase);
-  EXPECT_EQ(10, coalesced_event.delta_x);
-  EXPECT_EQ(13, coalesced_event.delta_y);
+  EXPECT_EQ(7, coalesced_event.delta_x);
+  EXPECT_EQ(9, coalesced_event.delta_y);
 
   event_to_be_coalesced.resending_plugin_id = 3;
   EXPECT_FALSE(CanCoalesce(event_to_be_coalesced, coalesced_event));
diff --git a/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc b/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
index d7d5b37..001cacda2 100644
--- a/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
+++ b/ui/events/keycodes/dom/dom_keyboard_layout_map_win.cc
@@ -129,12 +129,22 @@
       return ui::DomKey::FromCharacter(0x20a9);  // Korean won symbol.
   }
 
+  ui::DomKey key = ui::DomKey::NONE;
   if (key_type == 1)
-    return ui::DomKey::FromCharacter(char_buffer[0]);
-  if (key_type == -1)
-    return ui::DomKey::DeadKeyFromCombiningCharacter(char_buffer[0]);
+    key = ui::DomKey::FromCharacter(char_buffer[0]);
+  else if (key_type == -1) {
+    key = ui::DomKey::DeadKeyFromCombiningCharacter(char_buffer[0]);
 
-  return ui::DomKey::NONE;
+    // When we query info about dead keys, the system is left in a state
+    // such that the next key queried is in the context of that dead key.
+    // This causes ToUnicodeEx to return an incorrect result for the second
+    // key. To fix this we query a Space key after any dead key to clear out
+    // the dead key state. See crbug/977609 for details on how this problem
+    // exhibits itself to users.
+    ::ToUnicodeEx(0x0020, 0x0039, keyboard_state, char_buffer,
+                  base::size(char_buffer), /*wFlags=*/0, keyboard_layout);
+  }
+  return key;
 }
 
 }  // namespace
diff --git a/ui/events/platform/x11/BUILD.gn b/ui/events/platform/x11/BUILD.gn
index 31a20f0..c19c4d6 100644
--- a/ui/events/platform/x11/BUILD.gn
+++ b/ui/events/platform/x11/BUILD.gn
@@ -23,7 +23,6 @@
   configs += [ "//build/config/linux:x11" ]
 
   public_deps = [
-    "//ui/base/x",
     "//ui/events",
     "//ui/events:events_base",
     "//ui/events/devices",
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 45dd452..7836cf5e 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -6,13 +6,13 @@
 
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/devices/x11/device_data_manager_x11.h"
 #include "ui/events/devices/x11/touch_factory_x11.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/x11/x11_hotplug_event_handler.h"
 #include "ui/events/x/events_x_utils.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 
diff --git a/ui/events/x/BUILD.gn b/ui/events/x/BUILD.gn
index 1a93655..30a45e3 100644
--- a/ui/events/x/BUILD.gn
+++ b/ui/events/x/BUILD.gn
@@ -8,6 +8,8 @@
     "events_x_export.h",
     "events_x_utils.cc",
     "events_x_utils.h",
+    "x11_window_event_manager.cc",
+    "x11_window_event_manager.h",
   ]
   defines = [ "EVENTS_X_IMPLEMENTATION" ]
   deps = [
diff --git a/ui/base/x/x11_window_event_manager.cc b/ui/events/x/x11_window_event_manager.cc
similarity index 98%
rename from ui/base/x/x11_window_event_manager.cc
rename to ui/events/x/x11_window_event_manager.cc
index d54c36d..c8cfdbf 100644
--- a/ui/base/x/x11_window_event_manager.cc
+++ b/ui/events/x/x11_window_event_manager.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 "ui/base/x/x11_window_event_manager.h"
+#include "ui/events/x/x11_window_event_manager.h"
 
 #include <stddef.h>
 #include <xcb/xcb.h>
diff --git a/ui/base/x/x11_window_event_manager.h b/ui/events/x/x11_window_event_manager.h
similarity index 89%
rename from ui/base/x/x11_window_event_manager.h
rename to ui/events/x/x11_window_event_manager.h
index 41abdfb1..af777a97 100644
--- a/ui/base/x/x11_window_event_manager.h
+++ b/ui/events/x/x11_window_event_manager.h
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_BASE_X_X11_WINDOW_EVENT_MANAGER_H_
-#define UI_BASE_X_X11_WINDOW_EVENT_MANAGER_H_
+#ifndef UI_EVENTS_X_X11_WINDOW_EVENT_MANAGER_H_
+#define UI_EVENTS_X_X11_WINDOW_EVENT_MANAGER_H_
 
 #include <map>
 
 #include "base/component_export.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "ui/events/x/events_x_export.h"
 #include "ui/gfx/x/x11_types.h"
 
 namespace base {
@@ -23,7 +24,7 @@
 
 // Ensures events in |event_mask| are selected on |xid| for the duration of this
 // object's lifetime.
-class COMPONENT_EXPORT(UI_BASE_X) XScopedEventSelector {
+class EVENTS_X_EXPORT XScopedEventSelector {
  public:
   XScopedEventSelector(XID xid, uint32_t event_mask);
   ~XScopedEventSelector();
@@ -74,4 +75,4 @@
 
 }  // namespace ui
 
-#endif  // UI_BASE_X_X11_WINDOW_EVENT_MANAGER_H_
+#endif  // UI_EVENTS_X_X11_WINDOW_EVENT_MANAGER_H_
diff --git a/ui/file_manager/OWNERS b/ui/file_manager/OWNERS
index e60e0da..6db7e1c 100644
--- a/ui/file_manager/OWNERS
+++ b/ui/file_manager/OWNERS
@@ -7,3 +7,4 @@
 noel@chromium.org
 sammc@chromium.org
 slangley@chromium.org
+# COMPONENT: Platform>Apps>FileManager
diff --git a/ui/gfx/OWNERS b/ui/gfx/OWNERS
index f764a45..d196fe0b 100644
--- a/ui/gfx/OWNERS
+++ b/ui/gfx/OWNERS
@@ -53,3 +53,4 @@
 per-file BUILD.gn=*
 
 # COMPONENT: UI>GFX
+# TEAM: graphics-dev@chromium.org
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index b1855bfe..fd72f31 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -307,6 +307,7 @@
       "gl_wgl_api_implementation.h",
       "swap_chain_presenter.cc",
       "swap_chain_presenter.h",
+      "vsync_observer.h",
       "vsync_provider_win.cc",
       "vsync_provider_win.h",
       "vsync_thread_win.cc",
diff --git a/ui/gl/direct_composition_child_surface_win.cc b/ui/gl/direct_composition_child_surface_win.cc
index 15cfd1fa..06721e59 100644
--- a/ui/gl/direct_composition_child_surface_win.cc
+++ b/ui/gl/direct_composition_child_surface_win.cc
@@ -107,7 +107,9 @@
   return base::FeatureList::IsEnabled(features::kSwapChainFrameStatistics);
 }
 
-DirectCompositionChildSurfaceWin::DirectCompositionChildSurfaceWin() {}
+DirectCompositionChildSurfaceWin::DirectCompositionChildSurfaceWin(
+    gfx::VSyncProvider* vsync_provider)
+    : vsync_provider_(vsync_provider) {}
 
 DirectCompositionChildSurfaceWin::~DirectCompositionChildSurfaceWin() {
   Destroy();
@@ -258,6 +260,8 @@
   bool succeeded = ReleaseDrawTexture(false /* will_discard */);
 
   if (UseSwapChainFrameStatistics()) {
+    vsync_provider_->GetVSyncParametersIfAvailable(&last_vsync_time_,
+                                                   &last_vsync_interval_);
     CheckPendingFrames();
     // Enqueue callback after retiring previous callbacks so that it's called
     // after SwapBuffers() returns.
@@ -503,17 +507,6 @@
   return true;
 }
 
-void DirectCompositionChildSurfaceWin::UpdateVSyncParameters(
-    base::TimeTicks vsync_time,
-    base::TimeDelta vsync_interval) {
-  last_vsync_time_ = vsync_time;
-  last_vsync_interval_ = vsync_interval;
-}
-
-bool DirectCompositionChildSurfaceWin::HasPendingFrames() const {
-  return !pending_frames_.empty();
-}
-
 void DirectCompositionChildSurfaceWin::CheckPendingFrames() {
   DCHECK(UseSwapChainFrameStatistics());
 
diff --git a/ui/gl/direct_composition_child_surface_win.h b/ui/gl/direct_composition_child_surface_win.h
index 34a847f..3f84f9fa02 100644
--- a/ui/gl/direct_composition_child_surface_win.h
+++ b/ui/gl/direct_composition_child_surface_win.h
@@ -12,11 +12,15 @@
 
 #include "ui/gl/gl_surface_egl.h"
 
+namespace gfx {
+class VSyncProvider;
+}  // namespace gfx
+
 namespace gl {
 
 class DirectCompositionChildSurfaceWin : public GLSurfaceEGL {
  public:
-  DirectCompositionChildSurfaceWin();
+  explicit DirectCompositionChildSurfaceWin(gfx::VSyncProvider* vsync_provider);
 
   static bool UseSwapChainFrameStatistics();
 
@@ -40,11 +44,6 @@
               bool has_alpha) override;
   bool SetEnableDCLayers(bool enable) override;
 
-  void UpdateVSyncParameters(base::TimeTicks vsync_time,
-                             base::TimeDelta vsync_interval);
-  bool HasPendingFrames() const;
-  void CheckPendingFrames();
-
   const Microsoft::WRL::ComPtr<IDCompositionSurface>& dcomp_surface() const {
     return dcomp_surface_;
   }
@@ -76,6 +75,7 @@
     // Presentation callback enqueued in SwapBuffers().
     PresentationCallback callback;
   };
+  void CheckPendingFrames();
   void EnqueuePendingFrame(PresentationCallback callback);
   void ClearPendingFrames();
 
@@ -109,6 +109,7 @@
   // be called on the device.
   uint64_t dcomp_surface_serial_ = 0;
 
+  gfx::VSyncProvider* const vsync_provider_;
   base::TimeTicks last_vsync_time_;
   base::TimeDelta last_vsync_interval_ = base::TimeDelta::FromSecondsD(1. / 60);
 
diff --git a/ui/gl/direct_composition_surface_win.cc b/ui/gl/direct_composition_surface_win.cc
index 0522acc8..22587ec 100644
--- a/ui/gl/direct_composition_surface_win.cc
+++ b/ui/gl/direct_composition_surface_win.cc
@@ -172,15 +172,14 @@
     : GLSurfaceEGL(),
       child_window_(parent_window),
       task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      root_surface_(new DirectCompositionChildSurfaceWin()),
+      root_surface_(new DirectCompositionChildSurfaceWin(vsync_provider.get())),
       layer_tree_(std::make_unique<DCLayerTree>(
           settings.disable_nv12_dynamic_textures,
           settings.disable_larger_than_screen_overlays)),
-      vsync_provider_(std::move(vsync_provider)),
-      vsync_callback_(std::move(vsync_callback)),
       presentation_helper_(
-          std::make_unique<GLSurfacePresentationHelper>(vsync_provider_.get())),
-      weak_ptr_factory_(this) {}
+          std::make_unique<GLSurfacePresentationHelper>(vsync_provider.get())),
+      vsync_provider_(std::move(vsync_provider)),
+      vsync_callback_(std::move(vsync_callback)) {}
 
 DirectCompositionSurfaceWin::~DirectCompositionSurfaceWin() {
   Destroy();
@@ -396,27 +395,17 @@
   if (!root_surface_->Initialize(GLSurfaceFormat()))
     return false;
 
-  if (root_surface_->UseSwapChainFrameStatistics()) {
-    // Save weak ptr on main thread before any use on vsync thread.
-    main_thread_vsync_callback_ = base::BindRepeating(
-        &DirectCompositionSurfaceWin::HandleVSyncOnMainThread,
-        weak_ptr_factory_.GetWeakPtr());
-  }
-
-  if ((SupportsGpuVSync() && vsync_callback_) || main_thread_vsync_callback_) {
-    vsync_thread_ = std::make_unique<VSyncThreadWin>(
-        window_, d3d11_device_,
-        base::BindRepeating(
-            &DirectCompositionSurfaceWin::HandleVSyncOnVSyncThread,
-            base::Unretained(this)));
-  }
+  if (SupportsGpuVSync() && vsync_callback_)
+    vsync_thread_ = VSyncThreadWin::GetInstance();
 
   return true;
 }
 
 void DirectCompositionSurfaceWin::Destroy() {
-  // Destroy vsync thread because joining it could issue callbacks.
-  vsync_thread_ = nullptr;
+  if (vsync_thread_) {
+    vsync_thread_->RemoveObserver(this);
+    vsync_thread_ = nullptr;
+  }
   // Destroy presentation helper first because its dtor calls GetHandle.
   presentation_helper_ = nullptr;
   root_surface_->Destroy();
@@ -459,14 +448,11 @@
     callback.Reset();
   }
 
-  gfx::SwapResult swap_result = root_surface_->SwapBuffers(std::move(callback));
-
-  if (swap_result == gfx::SwapResult::SWAP_ACK &&
+  gfx::SwapResult swap_result;
+  if (root_surface_->SwapBuffers(std::move(callback)) ==
+          gfx::SwapResult::SWAP_ACK &&
       layer_tree_->CommitAndClearPendingOverlays(root_surface_.get())) {
-    if (vsync_thread_) {
-      vsync_thread_->SetEnabled(root_surface_->HasPendingFrames() ||
-                                vsync_callback_enabled_);
-    }
+    swap_result = gfx::SwapResult::SWAP_ACK;
   } else {
     swap_result = gfx::SwapResult::SWAP_FAILED;
   }
@@ -547,34 +533,17 @@
 
 void DirectCompositionSurfaceWin::SetGpuVSyncEnabled(bool enabled) {
   DCHECK(vsync_thread_);
-  if (vsync_callback_enabled_ == enabled)
-    return;
-  vsync_callback_enabled_ = enabled;
-  vsync_thread_->SetEnabled(root_surface_->HasPendingFrames() ||
-                            vsync_callback_enabled_);
-}
-
-void DirectCompositionSurfaceWin::HandleVSyncOnVSyncThread(
-    base::TimeTicks vsync_time,
-    base::TimeDelta vsync_interval) {
-  if (vsync_callback_)
-    vsync_callback_.Run(vsync_time, vsync_interval);
-
-  if (main_thread_vsync_callback_) {
-    task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(main_thread_vsync_callback_, vsync_time,
-                                  vsync_interval));
+  if (enabled) {
+    vsync_thread_->AddObserver(this);
+  } else {
+    vsync_thread_->RemoveObserver(this);
   }
 }
 
-void DirectCompositionSurfaceWin::HandleVSyncOnMainThread(
-    base::TimeTicks vsync_time,
-    base::TimeDelta vsync_interval) {
-  // Check pending frames in root surface in case client stops issuing swaps.
-  root_surface_->UpdateVSyncParameters(vsync_time, vsync_interval);
-  root_surface_->CheckPendingFrames();
-  vsync_thread_->SetEnabled(root_surface_->HasPendingFrames() ||
-                            vsync_callback_enabled_);
+void DirectCompositionSurfaceWin::OnVSync(base::TimeTicks vsync_time,
+                                          base::TimeDelta interval) {
+  DCHECK(vsync_callback_);
+  vsync_callback_.Run(vsync_time, interval);
 }
 
 scoped_refptr<base::TaskRunner>
diff --git a/ui/gl/direct_composition_surface_win.h b/ui/gl/direct_composition_surface_win.h
index 1c65a78..de3d4c7 100644
--- a/ui/gl/direct_composition_surface_win.h
+++ b/ui/gl/direct_composition_surface_win.h
@@ -16,6 +16,7 @@
 #include "ui/gl/child_window_win.h"
 #include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/vsync_observer.h"
 
 namespace gl {
 class DCLayerTree;
@@ -23,7 +24,8 @@
 class GLSurfacePresentationHelper;
 class VSyncThreadWin;
 
-class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL {
+class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
+                                              public VSyncObserver {
  public:
   using VSyncCallback =
       base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>;
@@ -105,7 +107,6 @@
   gfx::Vector2d GetDrawOffset() const override;
   bool SupportsGpuVSync() const override;
   void SetGpuVSyncEnabled(bool enabled) override;
-
   // This schedules an overlay plane to be displayed on the next SwapBuffers
   // or PostSubBuffer call. Overlay planes must be scheduled before every swap
   // to remain in the layer tree. This surface's backbuffer doesn't have to be
@@ -113,6 +114,9 @@
   // tree at z-order 0.
   bool ScheduleDCLayer(const ui::DCRendererLayerParams& params) override;
 
+  // VSyncObserver implementation.
+  void OnVSync(base::TimeTicks vsync_time, base::TimeDelta interval) override;
+
   HWND window() const { return window_; }
 
   scoped_refptr<base::TaskRunner> GetWindowTaskRunnerForTesting();
@@ -127,33 +131,21 @@
   ~DirectCompositionSurfaceWin() override;
 
  private:
-  void HandleVSyncOnVSyncThread(base::TimeTicks vsync_time,
-                                base::TimeDelta vsync_interval);
-
-  void HandleVSyncOnMainThread(base::TimeTicks vsync_time,
-                               base::TimeDelta vsync_interval);
-
   HWND window_ = nullptr;
   ChildWindowWin child_window_;
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   scoped_refptr<DirectCompositionChildSurfaceWin> root_surface_;
   std::unique_ptr<DCLayerTree> layer_tree_;
-
-  std::unique_ptr<VSyncThreadWin> vsync_thread_;
-  std::unique_ptr<gfx::VSyncProvider> vsync_provider_;
-
-  const VSyncCallback vsync_callback_;
-  bool vsync_callback_enabled_ = false;
-
   std::unique_ptr<GLSurfacePresentationHelper> presentation_helper_;
 
+  std::unique_ptr<gfx::VSyncProvider> vsync_provider_;
+  const VSyncCallback vsync_callback_;
+  VSyncThreadWin* vsync_thread_ = nullptr;
+
   Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
   Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device_;
 
-  VSyncCallback main_thread_vsync_callback_;
-  base::WeakPtrFactory<DirectCompositionSurfaceWin> weak_ptr_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(DirectCompositionSurfaceWin);
 };
 
diff --git a/ui/gl/vsync_observer.h b/ui/gl/vsync_observer.h
new file mode 100644
index 0000000..5d0fe964
--- /dev/null
+++ b/ui/gl/vsync_observer.h
@@ -0,0 +1,20 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GL_VSYNC_OBSERVER_H_
+#define UI_GL_VSYNC_OBSERVER_H_
+
+namespace gl {
+class GL_EXPORT VSyncObserver {
+ public:
+  // Called on vsync thread.
+  virtual void OnVSync(base::TimeTicks vsync_time,
+                       base::TimeDelta interval) = 0;
+
+ protected:
+  virtual ~VSyncObserver() {}
+};
+}  // namespace gl
+
+#endif  // UI_GL_VSYNC_OBSERVER_H_
diff --git a/ui/gl/vsync_thread_win.cc b/ui/gl/vsync_thread_win.cc
index a9e341573..9502606 100644
--- a/ui/gl/vsync_thread_win.cc
+++ b/ui/gl/vsync_thread_win.cc
@@ -5,6 +5,10 @@
 #include "ui/gl/vsync_thread_win.h"
 
 #include "base/bind.h"
+#include "base/memory/singleton.h"
+#include "base/stl_util.h"
+#include "ui/gl/gl_angle_util_win.h"
+#include "ui/gl/vsync_observer.h"
 
 namespace gl {
 namespace {
@@ -43,45 +47,51 @@
 }
 }  // namespace
 
-VSyncThreadWin::VSyncThreadWin(
-    HWND window,
-    Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
-    VSyncCallback callback)
+// static
+VSyncThreadWin* VSyncThreadWin::GetInstance() {
+  return base::Singleton<VSyncThreadWin>::get();
+}
+
+VSyncThreadWin::VSyncThreadWin()
     : vsync_thread_("GpuVSyncThread"),
-      window_(window),
-      d3d11_device_(std::move(d3d11_device)),
-      callback_(std::move(callback)) {
-  DCHECK(window_);
-  DCHECK(callback_);
+      d3d11_device_(QueryD3D11DeviceObjectFromANGLE()) {
+  DCHECK(d3d11_device_);
   base::Thread::Options options;
-  // Inherit priority from GPU main thread which depends on finch flags.
-  options.priority = base::PlatformThread::GetCurrentThreadPriority();
+  options.priority = base::ThreadPriority::DISPLAY;
   vsync_thread_.StartWithOptions(std::move(options));
 }
 
 VSyncThreadWin::~VSyncThreadWin() {
-  SetEnabled(false);
+  {
+    base::AutoLock auto_lock(lock_);
+    observers_.clear();
+  }
   vsync_thread_.Stop();
 }
 
-void VSyncThreadWin::SetEnabled(bool enabled) {
+void VSyncThreadWin::AddObserver(VSyncObserver* obs) {
   base::AutoLock auto_lock(lock_);
-  if (enabled_ == enabled)
-    return;
-  enabled_ = enabled;
-  if (enabled_ && !started_) {
-    started_ = true;
+  observers_.insert(obs);
+  if (is_idle_) {
+    is_idle_ = false;
     vsync_thread_.task_runner()->PostTask(
         FROM_HERE,
         base::BindOnce(&VSyncThreadWin::WaitForVSync, base::Unretained(this)));
   }
 }
 
+void VSyncThreadWin::RemoveObserver(VSyncObserver* obs) {
+  base::AutoLock auto_lock(lock_);
+  observers_.erase(obs);
+}
+
 void VSyncThreadWin::WaitForVSync() {
-  HMONITOR monitor = MonitorFromWindow(window_, MONITOR_DEFAULTTONEAREST);
-  if (window_monitor_ != monitor) {
-    window_monitor_ = monitor;
-    window_output_ = DXGIOutputFromMonitor(monitor, d3d11_device_);
+  // From Raymond Chen's blog "How do I get a handle to the primary monitor?"
+  // https://devblogs.microsoft.com/oldnewthing/20141106-00/?p=43683
+  HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
+  if (primary_monitor_ != monitor) {
+    primary_monitor_ = monitor;
+    primary_output_ = DXGIOutputFromMonitor(monitor, d3d11_device_);
   }
 
   base::TimeDelta interval = base::TimeDelta::FromSecondsD(1.0 / 60);
@@ -102,13 +112,13 @@
 
   base::TimeTicks wait_for_vblank_start_time = base::TimeTicks::Now();
   bool wait_for_vblank_succeeded =
-      window_output_ && SUCCEEDED(window_output_->WaitForVBlank());
+      primary_output_ && SUCCEEDED(primary_output_->WaitForVBlank());
 
   // WaitForVBlank returns very early instead of waiting until vblank when the
   // monitor goes to sleep.  We use 1ms as a threshold for the duration of
   // WaitForVBlank and fallback to Sleep() if it returns before that.  This
   // could happen during normal operation for the first call after the vsync
-  // callback is enabled, but it shouldn't happen often.
+  // thread becomes non-idle, but it shouldn't happen often.
   const auto kVBlankIntervalThreshold = base::TimeDelta::FromMilliseconds(1);
   base::TimeDelta wait_for_vblank_elapsed_time =
       base::TimeTicks::Now() - wait_for_vblank_start_time;
@@ -119,17 +129,15 @@
   }
 
   base::AutoLock auto_lock(lock_);
-  DCHECK(started_);
-  if (enabled_) {
+  if (!observers_.empty()) {
     vsync_thread_.task_runner()->PostTask(
         FROM_HERE,
         base::BindOnce(&VSyncThreadWin::WaitForVSync, base::Unretained(this)));
-    // Release lock before running callback to guard against any reentracny
-    // deadlock.
-    base::AutoUnlock auto_unlock(lock_);
-    callback_.Run(base::TimeTicks::Now(), interval);
+    base::TimeTicks vsync_time = base::TimeTicks::Now();
+    for (auto* obs : observers_)
+      obs->OnVSync(vsync_time, interval);
   } else {
-    started_ = false;
+    is_idle_ = true;
   }
 }
 
diff --git a/ui/gl/vsync_thread_win.h b/ui/gl/vsync_thread_win.h
index f540f75..d148353 100644
--- a/ui/gl/vsync_thread_win.h
+++ b/ui/gl/vsync_thread_win.h
@@ -9,48 +9,53 @@
 #include <windows.h>
 #include <wrl/client.h>
 
+#include "base/containers/flat_set.h"
 #include "base/threading/thread.h"
 #include "ui/gl/gl_export.h"
 
-namespace gl {
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
 
-// Helper class that manages a thread for calling IDXGIOutput::WaitForVBlank()
-// for the output corresponding to the given |window|, and runs |callback| on
-// the same thread.  The callback can be enabled or disabled via SetEnabled().
-// This is used by DirectCompositionSurfaceWin to plumb vsync signal back to the
-// display compositor's BeginFrameSource.
+namespace gl {
+class VSyncObserver;
+// Helper singleton that wraps a thread for calling IDXGIOutput::WaitForVBlank()
+// for the primary monitor, and notifies observers on the same thread. Observers
+// can be added or removed on the main thread, and the vsync thread goes to
+// sleep if there are no observers. This is used by DirectCompositionSurfaceWin
+// to plumb vsync signal back to the display compositor's BeginFrameSource.
 class GL_EXPORT VSyncThreadWin {
  public:
-  using VSyncCallback =
-      base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>;
-  VSyncThreadWin(HWND window,
-                 Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
-                 VSyncCallback callback);
-  ~VSyncThreadWin();
+  static VSyncThreadWin* GetInstance();
 
-  void SetEnabled(bool enabled);
+  // These methods are not rentrancy safe, and shouldn't be called inside
+  // VSyncObserver::OnVSync.  It's safe to assume that these can be called only
+  // from the main thread.
+  void AddObserver(VSyncObserver* obs);
+  void RemoveObserver(VSyncObserver* obs);
 
  private:
+  friend struct base::DefaultSingletonTraits<VSyncThreadWin>;
+
+  VSyncThreadWin();
+  ~VSyncThreadWin();
+
   void WaitForVSync();
 
   base::Thread vsync_thread_;
 
   // Used on vsync thread only after initialization.
-  const HWND window_;
   const Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
-  const VSyncCallback callback_;
-
-  // Used on vsync thread exclusively.
-  HMONITOR window_monitor_ = nullptr;
-  Microsoft::WRL::ComPtr<IDXGIOutput> window_output_;
+  HMONITOR primary_monitor_ = nullptr;
+  Microsoft::WRL::ComPtr<IDXGIOutput> primary_output_;
 
   base::Lock lock_;
-  bool GUARDED_BY(lock_) enabled_ = false;
-  bool GUARDED_BY(lock_) started_ = false;
+  bool GUARDED_BY(lock_) is_idle_ = true;
+  base::flat_set<VSyncObserver*> GUARDED_BY(lock_) observers_;
 
   DISALLOW_COPY_AND_ASSIGN(VSyncThreadWin);
 };
-
 }  // namespace gl
 
 #endif  // UI_GL_VSYNC_THREAD_WIN_H_
diff --git a/ui/latency/OWNERS b/ui/latency/OWNERS
index d0ec0c4..d0e31cd 100644
--- a/ui/latency/OWNERS
+++ b/ui/latency/OWNERS
@@ -5,3 +5,4 @@
 
 # frame metrics
 brianderson@chromium.org
+# COMPONENT: Speed>Metrics
diff --git a/ui/login/OWNERS b/ui/login/OWNERS
index 43c2ba7..6ecf4da 100644
--- a/ui/login/OWNERS
+++ b/ui/login/OWNERS
@@ -7,3 +7,4 @@
 # (in CET)
 antrim@chromium.org
 rsorokin@chromium.org
+# COMPONENT: UI>Shell>OOBE
diff --git a/ui/ozone/platform/x11/x11_window_ozone.h b/ui/ozone/platform/x11/x11_window_ozone.h
index b82099a..cdbd58d 100644
--- a/ui/ozone/platform/x11/x11_window_ozone.h
+++ b/ui/ozone/platform/x11/x11_window_ozone.h
@@ -11,9 +11,9 @@
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "ui/base/x/x11_window.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/x11/x11_event_source_libevent.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/platform_window/platform_window.h"
diff --git a/ui/platform_window/x11/BUILD.gn b/ui/platform_window/x11/BUILD.gn
index 3e46e8c..f0d40e73 100644
--- a/ui/platform_window/x11/BUILD.gn
+++ b/ui/platform_window/x11/BUILD.gn
@@ -15,6 +15,7 @@
     "//base",
     "//skia",
     "//ui/base",
+    "//ui/base/x",
     "//ui/events",
     "//ui/events/devices",
     "//ui/events/devices/x11",
diff --git a/ui/platform_window/x11/x11_window_base.cc b/ui/platform_window/x11/x11_window_base.cc
index f87681ea..0265e5fc 100644
--- a/ui/platform_window/x11/x11_window_base.cc
+++ b/ui/platform_window/x11/x11_window_base.cc
@@ -9,12 +9,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/platform_window_defaults.h"
 #include "ui/base/x/x11_util.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 #include "ui/platform_window/platform_window_delegate.h"
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index a83c5c3..cc8e75ed 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -960,7 +960,10 @@
     }
   }
   if (use_x11) {
-    deps += [ "//ui/gfx/x" ]
+    deps += [
+      "//ui/events/x",
+      "//ui/gfx/x",
+    ]
   }
   if (ozone_platform_x11) {
     deps += [ "//ui/base/x" ]
diff --git a/ui/views/test/x11_property_change_waiter.cc b/ui/views/test/x11_property_change_waiter.cc
index ffd146c..1e365700 100644
--- a/ui/views/test/x11_property_change_waiter.cc
+++ b/ui/views/test/x11_property_change_waiter.cc
@@ -7,9 +7,9 @@
 #include <utility>
 
 #include "base/run_loop.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/platform/scoped_event_dispatcher.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
index 0d545f2..121481d 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
@@ -24,12 +24,12 @@
 #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h"
 #include "ui/base/layout.h"
 #include "ui/base/x/selection_utils.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/display/screen.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/platform_event.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_atom_cache.h"
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 411ab07..a2afb0e 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -39,7 +39,6 @@
 #include "ui/base/x/x11_pointer_grab.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/base/x/x11_util_internal.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/display/screen.h"
 #include "ui/events/devices/x11/device_list_cache_x11.h"
 #include "ui/events/event.h"
@@ -48,6 +47,7 @@
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/x/events_x_utils.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_skia_rep.h"
diff --git a/ui/views/widget/desktop_aura/x11_desktop_handler.cc b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
index 6b7cf82..cfe62d6 100644
--- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc
+++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
@@ -11,8 +11,8 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/x/x11_menu_list.h"
 #include "ui/base/x/x11_util.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_atom_cache.h"
 #include "ui/gfx/x/x11_error_tracker.h"
diff --git a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
index d666e67e..cbeea44f 100644
--- a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
+++ b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
@@ -23,13 +23,13 @@
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/x/x11_pointer_grab.h"
 #include "ui/base/x/x11_util.h"
-#include "ui/base/x/x11_window_event_manager.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/keyboard_code_conversion_x.h"
 #include "ui/events/platform/platform_event_source.h"
 #include "ui/events/platform/scoped_event_dispatcher.h"
 #include "ui/events/platform/x11/x11_event_source.h"
+#include "ui/events/x/x11_window_event_manager.h"
 #include "ui/gfx/x/x11.h"
 
 namespace views {
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index dba70a0..9b683f3 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -18,6 +18,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop_current.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -276,6 +277,49 @@
   }
 }
 
+void RecordDeltaBetweenTimeNowAndPerformanceCountHistogram(
+    base::TimeTicks event_time,
+    UINT64 performance_count,
+    POINTER_INPUT_TYPE pointer_input_type,
+    bool is_session_remote) {
+  // In remote session, sometimes |performance_count| drifts
+  // substantially in future compared to |TimeTicks::Now()| - enough to skew the
+  // histogram data.  Additionally, user input over remote session already has
+  // lag, so user is less likely to be sensitive to the responsiveness of input
+  // in such case. So we are less concerned capturing the deltas in remote
+  // session scenario.
+  if (base::TimeTicks::IsHighResolution() && !is_session_remote) {
+    base::TimeTicks event_time_from_pointer =
+        base::TimeTicks::FromQPCValue(performance_count);
+
+    double delta_between_event_timestamps =
+        (event_time - event_time_from_pointer).InMicrosecondsF();
+    std::string pointer_type;
+    switch (pointer_input_type) {
+      case PT_PEN:
+        pointer_type = "Pen";
+        break;
+      case PT_TOUCH:
+        pointer_type = "Touch";
+        break;
+      default:
+        NOTREACHED();
+    }
+
+    std::string number_sign =
+        delta_between_event_timestamps >= 0 ? "Positive" : "Negative";
+    base::TimeDelta delta_sample_value = base::TimeDelta::FromMicroseconds(
+        std::abs(delta_between_event_timestamps));
+
+    base::UmaHistogramCustomMicrosecondsTimes(
+        base::StringPrintf("Event.%s.InputEventTimeStamp."
+                           "DeltaBetweenTimeNowAndPerformanceCount.%s",
+                           pointer_type.c_str(), number_sign.c_str()),
+        delta_sample_value, base::TimeDelta::FromMicroseconds(1),
+        base::TimeDelta::FromMilliseconds(30), 30);
+  }
+}
+
 constexpr int kTouchDownContextResetTimeout = 500;
 
 // Windows does not flag synthesized mouse messages from touch or pen in all
@@ -408,6 +452,7 @@
       pointer_events_for_touch_(::features::IsUsingWMPointerForTouch()),
       precision_touchpad_scroll_phase_enabled_(base::FeatureList::IsEnabled(
           ::features::kPrecisionTouchpadScrollPhase)),
+      is_remote_session_(base::win::IsCurrentSessionRemote()),
       autohide_factory_(this) {}
 
 HWNDMessageHandler::~HWNDMessageHandler() {
@@ -2413,6 +2458,7 @@
     if (flags == SPI_SETWORKAREA)
       delegate_->HandleWorkAreaChanged();
     SetMsgHandled(FALSE);
+    is_remote_session_ = base::win::IsCurrentSessionRemote();
   }
 
   // If the work area is changing, then it could be as a result of the taskbar
@@ -3041,6 +3087,10 @@
   base::WeakPtr<HWNDMessageHandler> ref(msg_handler_weak_factory_.GetWeakPtr());
   delegate_->HandleTouchEvent(&event);
 
+  RecordDeltaBetweenTimeNowAndPerformanceCountHistogram(
+      event_time, pointer_info.PerformanceCount, pointer_info.pointerType,
+      is_remote_session_);
+
   if (ref) {
     // Mark touch released events handled. These will usually turn into tap
     // gestures, and doing this avoids propagating the event to other windows.
@@ -3090,12 +3140,16 @@
   // window, so use the weak ptr to check if destruction occured or not.
   base::WeakPtr<HWNDMessageHandler> ref(msg_handler_weak_factory_.GetWeakPtr());
   if (event) {
-    if (event->IsTouchEvent())
+    if (event->IsTouchEvent()) {
       delegate_->HandleTouchEvent(event->AsTouchEvent());
-    else if (event->IsMouseEvent())
+      RecordDeltaBetweenTimeNowAndPerformanceCountHistogram(
+          event->time_stamp(), pointer_pen_info.pointerInfo.PerformanceCount,
+          pointer_pen_info.pointerInfo.pointerType, is_remote_session_);
+    } else if (event->IsMouseEvent()) {
       delegate_->HandleMouseEvent(event->AsMouseEvent());
-    else
+    } else {
       NOTREACHED();
+    }
     last_touch_or_pen_message_time_ = ::GetMessageTime();
   }
 
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index 83fe042..9f0a1a8 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -764,6 +764,9 @@
   // the first message after frame type changes.
   bool needs_dwm_frame_clear_ = true;
 
+  // True if user is in remote session.
+  bool is_remote_session_;
+
   // This is a map of the HMONITOR to full screeen window instance. It is safe
   // to keep a raw pointer to the HWNDMessageHandler instance as we track the
   // window destruction and ensure that the map is cleaned up.
diff --git a/ui/webui/resources/cr_elements/chromeos/network/cr_network_icon.js b/ui/webui/resources/cr_elements/chromeos/network/cr_network_icon.js
index 814d60f..2cb7bae 100644
--- a/ui/webui/resources/cr_elements/chromeos/network/cr_network_icon.js
+++ b/ui/webui/resources/cr_elements/chromeos/network/cr_network_icon.js
@@ -88,8 +88,7 @@
     }
 
     if (!this.isListItem &&
-        (!connectionState ||
-         connectionState == mojom.ConnectionStateType.kNotConnected)) {
+        connectionState == mojom.ConnectionStateType.kNotConnected) {
       return prefix + 'not-connected';
     }
 
diff --git a/ui/webui/resources/js/assert.js b/ui/webui/resources/js/assert.js
index a7c1bfa..1c7c227 100644
--- a/ui/webui/resources/js/assert.js
+++ b/ui/webui/resources/js/assert.js
@@ -23,10 +23,9 @@
     }
     const error = new Error(message);
     const global = function() {
-      const thisOrSelf = this || self;
       /** @type {boolean} */
-      thisOrSelf.traceAssertionsForTesting;
-      return thisOrSelf;
+      this.traceAssertionsForTesting;
+      return this;
     }();
     if (global.traceAssertionsForTesting) {
       console.warn(error.stack);
diff --git a/ui/webui/resources/js/cr/ui/bubble.js b/ui/webui/resources/js/cr/ui/bubble.js
index 9b971f2..3ac4e889 100644
--- a/ui/webui/resources/js/cr/ui/bubble.js
+++ b/ui/webui/resources/js/cr/ui/bubble.js
@@ -4,60 +4,54 @@
 
 // require: event_tracker.js
 
-// TODO(vitalyp): Inline the enums below into cr.ui definition function, remove
-// cr.exportPath() call and remove exportPath from exports in cr.js when this
-// issue will be fixed:
-// https://github.com/google/closure-compiler/issues/544
-cr.exportPath('cr.ui');
-
-/**
- * The arrow location specifies how the arrow and bubble are positioned in
- * relation to the anchor node.
- * @enum {string}
- */
-cr.ui.ArrowLocation = {
-  // The arrow is positioned at the top and the start of the bubble. In left
-  // to right mode this is the top left. The entire bubble is positioned below
-  // the anchor node.
-  TOP_START: 'top-start',
-  // The arrow is positioned at the top and the end of the bubble. In left to
-  // right mode this is the top right. The entire bubble is positioned below
-  // the anchor node.
-  TOP_END: 'top-end',
-  // The arrow is positioned at the bottom and the start of the bubble. In
-  // left to right mode this is the bottom left. The entire bubble is
-  // positioned above the anchor node.
-  BOTTOM_START: 'bottom-start',
-  // The arrow is positioned at the bottom and the end of the bubble. In
-  // left to right mode this is the bottom right. The entire bubble is
-  // positioned above the anchor node.
-  BOTTOM_END: 'bottom-end'
-};
-
-/**
- * The bubble alignment specifies the position of the bubble in relation to
- * the anchor node.
- * @enum {string}
- */
-cr.ui.BubbleAlignment = {
-  // The bubble is positioned just above or below the anchor node (as
-  // specified by the arrow location) so that the arrow points at the midpoint
-  // of the anchor.
-  ARROW_TO_MID_ANCHOR: 'arrow-to-mid-anchor',
-  // The bubble is positioned just above or below the anchor node (as
-  // specified by the arrow location) so that its reference edge lines up with
-  // the edge of the anchor.
-  BUBBLE_EDGE_TO_ANCHOR_EDGE: 'bubble-edge-anchor-edge',
-  // The bubble is positioned so that it is entirely within view and does not
-  // obstruct the anchor element, if possible. The specified arrow location is
-  // taken into account as the preferred alignment but may be overruled if
-  // there is insufficient space (see BubbleBase.reposition for the exact
-  // placement algorithm).
-  ENTIRELY_VISIBLE: 'entirely-visible'
-};
-
 cr.define('cr.ui', function() {
   /**
+   * The arrow location specifies how the arrow and bubble are positioned in
+   * relation to the anchor node.
+   * @enum {string}
+   */
+  const ArrowLocation = {
+    // The arrow is positioned at the top and the start of the bubble. In left
+    // to right mode this is the top left. The entire bubble is positioned below
+    // the anchor node.
+    TOP_START: 'top-start',
+    // The arrow is positioned at the top and the end of the bubble. In left to
+    // right mode this is the top right. The entire bubble is positioned below
+    // the anchor node.
+    TOP_END: 'top-end',
+    // The arrow is positioned at the bottom and the start of the bubble. In
+    // left to right mode this is the bottom left. The entire bubble is
+    // positioned above the anchor node.
+    BOTTOM_START: 'bottom-start',
+    // The arrow is positioned at the bottom and the end of the bubble. In
+    // left to right mode this is the bottom right. The entire bubble is
+    // positioned above the anchor node.
+    BOTTOM_END: 'bottom-end'
+  };
+
+  /**
+   * The bubble alignment specifies the position of the bubble in relation to
+   * the anchor node.
+   * @enum {string}
+   */
+  const BubbleAlignment = {
+    // The bubble is positioned just above or below the anchor node (as
+    // specified by the arrow location) so that the arrow points at the midpoint
+    // of the anchor.
+    ARROW_TO_MID_ANCHOR: 'arrow-to-mid-anchor',
+    // The bubble is positioned just above or below the anchor node (as
+    // specified by the arrow location) so that its reference edge lines up with
+    // the edge of the anchor.
+    BUBBLE_EDGE_TO_ANCHOR_EDGE: 'bubble-edge-anchor-edge',
+    // The bubble is positioned so that it is entirely within view and does not
+    // obstruct the anchor element, if possible. The specified arrow location is
+    // taken into account as the preferred alignment but may be overruled if
+    // there is insufficient space (see BubbleBase.reposition for the exact
+    // placement algorithm).
+    ENTIRELY_VISIBLE: 'entirely-visible'
+  };
+
+  /**
    * Abstract base class that provides common functionality for implementing
    * free-floating informational bubbles with a triangular arrow pointing at an
    * anchor node.
@@ -552,10 +546,11 @@
     },
   };
 
-
   return {
+    ArrowLocation: ArrowLocation,
+    AutoCloseBubble: AutoCloseBubble,
+    BubbleAlignment: BubbleAlignment,
     BubbleBase: BubbleBase,
     Bubble: Bubble,
-    AutoCloseBubble: AutoCloseBubble
   };
 });
diff --git a/ui/webui/resources/js/event_tracker.js b/ui/webui/resources/js/event_tracker.js
index 828295bc..3086efb 100644
--- a/ui/webui/resources/js/event_tracker.js
+++ b/ui/webui/resources/js/event_tracker.js
@@ -12,18 +12,6 @@
  */
 
 /**
- * The type of the internal tracking entry. TODO(dbeam): move this back to
- * EventTracker.Entry when https://github.com/google/closure-compiler/issues/544
- * is fixed.
- * @typedef {{target: !EventTarget,
- *            eventType: string,
- *            listener: (EventListener|Function),
- *            capture: boolean}}
- */
-// eslint-disable-next-line no-var
-var EventTrackerEntry;
-
-/**
  * Create an EventTracker to track a set of events.
  * EventTracker instances are typically tied 1:1 with other objects or
  * DOM elements whose listeners should be removed when the object is disposed
@@ -32,12 +20,21 @@
  */
 function EventTracker() {
   /**
-   * @type {Array<EventTrackerEntry>}
+   * @type {Array<EventTracker.Entry>}
    * @private
    */
   this.listeners_ = [];
 }
 
+/**
+ * The type of the internal tracking entry.
+ * @typedef {{target: !EventTarget,
+ *            eventType: string,
+ *            listener: (EventListener|Function),
+ *            capture: boolean}}
+ */
+EventTracker.Entry;
+
 EventTracker.prototype = {
   /**
    * Add an event listener - replacement for EventTarget.addEventListener.
@@ -85,7 +82,7 @@
 /**
  * Remove a single event listener given it's tracking entry. It's up to the
  * caller to ensure the entry is removed from listeners_.
- * @param {EventTrackerEntry} h The entry describing the listener to remove.
+ * @param {EventTracker.Entry} h The entry describing the listener to remove.
  * @private
  */
 EventTracker.removeEventListener_ = function(h) {