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", ®ion); + 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(' '); - }); - - 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>  </span><span> 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&¤tAnimation.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) {