diff --git a/.github/workflows/label-cherry-pick.yaml b/.github/workflows/label-cherry-pick.yaml index 6788ea9cf93be..a3433850cd2a7 100644 --- a/.github/workflows/label-cherry-pick.yaml +++ b/.github/workflows/label-cherry-pick.yaml @@ -75,8 +75,13 @@ jobs: set -e git fetch origin ${{ matrix.target_branch }} git cherry-pick -x $MERGE_COMMIT_SHA - git add . - git cherry-pick --continue + RES=$? + set -e + if [ $RES -ne 0 ]; then + git add . + git cherry-pick --continue + fi + exit $RES - name: Create Pull Request id: create-pr diff --git a/cobalt/h5vcc/h5vcc_settings.cc b/cobalt/h5vcc/h5vcc_settings.cc index e6c7b26e6e86d..69aabbf248ac6 100644 --- a/cobalt/h5vcc/h5vcc_settings.cc +++ b/cobalt/h5vcc/h5vcc_settings.cc @@ -23,16 +23,6 @@ namespace cobalt { namespace h5vcc { -namespace { -// Only including needed video combinations for the moment. -// option 0 disables all video codecs except h264 -// option 1 disables all video codecs except av1 -// option 2 disables all video codecs except vp9 -constexpr std::array kDisableCodecCombinations{ - {"av01;hev1;hvc1;vp09;vp8.vp9", "avc1;avc3;hev1;hvc1;vp09;vp8;vp9", - "av01;avc1;avc3;hev1;hvc1;vp8"}}; -}; // namespace - H5vccSettings::H5vccSettings( const SetSettingFunc& set_web_setting_func, cobalt::media::MediaModule* media_module, @@ -56,9 +46,9 @@ H5vccSettings::H5vccSettings( persistent_settings_(persistent_settings) { } -bool H5vccSettings::Set(const std::string& name, int32 value) const { +bool H5vccSettings::Set(const std::string& name, SetValueType value) const { const char kMediaPrefix[] = "Media."; - const char kDisableMediaCodec[] = "DisableMediaCodec"; + const char kMediaCodecBlockList[] = "MediaCodecBlockList"; const char kNavigatorUAData[] = "NavigatorUAData"; const char kClientHintHeaders[] = "ClientHintHeaders"; const char kQUIC[] = "QUIC"; @@ -67,35 +57,37 @@ bool H5vccSettings::Set(const std::string& name, int32 value) const { const char kUpdaterMinFreeSpaceBytes[] = "Updater.MinFreeSpaceBytes"; #endif - if (name == kDisableMediaCodec && - value < static_cast(kDisableCodecCombinations.size())) { - can_play_type_handler_->SetDisabledMediaCodecs( - kDisableCodecCombinations[value]); + if (name == kMediaCodecBlockList && value.IsType() && + value.AsType().size() < 256) { + can_play_type_handler_->SetDisabledMediaCodecs(value.AsType()); return true; } - if (set_web_setting_func_ && set_web_setting_func_.Run(name, value)) { + if (set_web_setting_func_ && value.IsType() && + set_web_setting_func_.Run(name, value.AsType())) { return true; } - if (name.rfind(kMediaPrefix, 0) == 0) { - return media_module_ ? media_module_->SetConfiguration( - name.substr(strlen(kMediaPrefix)), value) - : false; + if (name.rfind(kMediaPrefix, 0) == 0 && value.IsType()) { + return media_module_ + ? media_module_->SetConfiguration( + name.substr(strlen(kMediaPrefix)), value.AsType()) + : false; } - if (name.compare(kNavigatorUAData) == 0 && value == 1) { + if (name.compare(kNavigatorUAData) == 0 && value.IsType() && + value.AsType() == 1) { global_environment_->BindTo("userAgentData", user_agent_data_, "navigator"); return true; } - if (name.compare(kClientHintHeaders) == 0) { + if (name.compare(kClientHintHeaders) == 0 && value.IsType()) { if (!persistent_settings_) { return false; } else { persistent_settings_->SetPersistentSetting( network::kClientHintHeadersEnabledPersistentSettingsKey, - std::make_unique(value)); + std::make_unique(value.AsType())); // Tell NetworkModule (if exists) to re-query persistent settings. if (network_module_) { network_module_ @@ -105,13 +97,13 @@ bool H5vccSettings::Set(const std::string& name, int32 value) const { } } - if (name.compare(kQUIC) == 0) { + if (name.compare(kQUIC) == 0 && value.IsType()) { if (!persistent_settings_) { return false; } else { persistent_settings_->SetPersistentSetting( network::kQuicEnabledPersistentSettingsKey, - std::make_unique(value != 0)); + std::make_unique(value.AsType() != 0)); // Tell NetworkModule (if exists) to re-query persistent settings. if (network_module_) { network_module_->SetEnableQuicFromPersistentSettings(); @@ -121,8 +113,8 @@ bool H5vccSettings::Set(const std::string& name, int32 value) const { } #if SB_IS(EVERGREEN) - if (name.compare(kUpdaterMinFreeSpaceBytes) == 0) { - updater_module_->SetMinFreeSpaceBytes(value); + if (name.compare(kUpdaterMinFreeSpaceBytes) == 0 && value.IsType()) { + updater_module_->SetMinFreeSpaceBytes(value.AsType()); return true; } #endif diff --git a/cobalt/h5vcc/h5vcc_settings.h b/cobalt/h5vcc/h5vcc_settings.h index 34e7a440d3a64..f7e10cf56de43 100644 --- a/cobalt/h5vcc/h5vcc_settings.h +++ b/cobalt/h5vcc/h5vcc_settings.h @@ -21,6 +21,7 @@ #include "cobalt/network/network_module.h" #include "cobalt/persistent_storage/persistent_settings.h" #include "cobalt/script/global_environment.h" +#include "cobalt/script/union_type.h" #include "cobalt/script/wrappable.h" #include "cobalt/web/navigator_ua_data.h" @@ -39,6 +40,8 @@ class H5vccSettings : public script::Wrappable { typedef base::Callback SetSettingFunc; + typedef script::UnionType2 SetValueType; + H5vccSettings(const SetSettingFunc& set_web_setting_func, cobalt::media::MediaModule* media_module, cobalt::media::CanPlayTypeHandler* can_play_type_handler, @@ -53,7 +56,7 @@ class H5vccSettings : public script::Wrappable { // Returns true when the setting is set successfully or if the setting has // already been set to the expected value. Returns false when the setting is // invalid or not set to the expected value. - bool Set(const std::string& name, int32 value) const; + bool Set(const std::string& name, SetValueType value) const; DEFINE_WRAPPABLE_TYPE(H5vccSettings); diff --git a/cobalt/h5vcc/h5vcc_settings.idl b/cobalt/h5vcc/h5vcc_settings.idl index fe250c8bbc371..34650a9d1f639 100644 --- a/cobalt/h5vcc/h5vcc_settings.idl +++ b/cobalt/h5vcc/h5vcc_settings.idl @@ -13,5 +13,5 @@ // limitations under the License. interface H5vccSettings { - boolean set(DOMString name, long value); + boolean set(DOMString name, (long or DOMString) value); }; diff --git a/cobalt/media/base/sbplayer_pipeline.cc b/cobalt/media/base/sbplayer_pipeline.cc index 8280e53fc685e..55bf818650512 100644 --- a/cobalt/media/base/sbplayer_pipeline.cc +++ b/cobalt/media/base/sbplayer_pipeline.cc @@ -339,6 +339,8 @@ void SbPlayerPipeline::Stop(const base::Closure& stop_cb) { if (demuxer_) { stop_cb_ = stop_cb; demuxer_->Stop(); + video_stream_ = nullptr; + audio_stream_ = nullptr; OnDemuxerStopped(); } else { stop_cb.Run(); @@ -1371,6 +1373,8 @@ void SbPlayerPipeline::ResumeTask(PipelineWindow window, std::string SbPlayerPipeline::AppendStatisticsString( const std::string& message) const { + DCHECK(task_runner_->BelongsToCurrentThread()); + if (nullptr == video_stream_) { return message + ", playback statistics: n/a."; } else { diff --git a/cobalt/watchdog/watchdog.cc b/cobalt/watchdog/watchdog.cc index 2c1d682b95299..39e0c22d38e4a 100644 --- a/cobalt/watchdog/watchdog.cc +++ b/cobalt/watchdog/watchdog.cc @@ -44,9 +44,9 @@ const int kWatchdogMaxViolations = 200; // The minimum number of microseconds between writes. const int64_t kWatchdogWriteWaitTime = 300000000; // The maximum number of most recent ping infos. -const int kWatchdogMaxPingInfos = 20; +const int kWatchdogMaxPingInfos = 60; // The maximum length of each ping info. -const int kWatchdogMaxPingInfoLength = 128; +const int kWatchdogMaxPingInfoLength = 1024; // The maximum number of milliseconds old of an unfetched Watchdog violation. const int64_t kWatchdogMaxViolationsAge = 86400000; diff --git a/cobalt/watchdog/watchdog_test.cc b/cobalt/watchdog/watchdog_test.cc index ec3116cf3f95a..6668c2a8d9e0e 100644 --- a/cobalt/watchdog/watchdog_test.cc +++ b/cobalt/watchdog/watchdog_test.cc @@ -199,11 +199,7 @@ TEST_F(WatchdogTest, PingOnlyAcceptsValidParameters) { base::kApplicationStateStarted, kWatchdogMonitorFrequency)); ASSERT_TRUE(watchdog_->Ping("test-name", "42")); - ASSERT_FALSE( - watchdog_->Ping("test-name", - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxx")); + ASSERT_FALSE(watchdog_->Ping("test-name", std::string(1025, 'x'))); ASSERT_TRUE(watchdog_->Unregister("test-name")); } @@ -213,11 +209,7 @@ TEST_F(WatchdogTest, PingByClientOnlyAcceptsValidParameters) { kWatchdogMonitorFrequency); ASSERT_NE(client, nullptr); ASSERT_TRUE(watchdog_->PingByClient(client, "42")); - ASSERT_FALSE(watchdog_->PingByClient( - client, - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxx")); + ASSERT_FALSE(watchdog_->PingByClient(client, std::string(1025, 'x'))); ASSERT_TRUE(watchdog_->UnregisterByClient(client)); } @@ -358,7 +350,7 @@ TEST_F(WatchdogTest, PingInfosAreEvictedAfterMax) { ASSERT_TRUE(watchdog_->Register("test-name", "test_desc", base::kApplicationStateStarted, kWatchdogMonitorFrequency)); - for (int i = 0; i < 21; i++) { + for (int i = 0; i < 61; i++) { ASSERT_TRUE(watchdog_->Ping("test-name", std::to_string(i))); } SbThreadSleep(kWatchdogSleepDuration); @@ -369,7 +361,7 @@ TEST_F(WatchdogTest, PingInfosAreEvictedAfterMax) { base::Value* violation_dict = violations_map->FindKey("test-name"); base::Value* violations = violation_dict->FindKey("violations"); base::Value* pingInfos = violations->GetList()[0].FindKey("pingInfos"); - ASSERT_EQ(pingInfos->GetList().size(), 20); + ASSERT_EQ(pingInfos->GetList().size(), 60); ASSERT_EQ(pingInfos->GetList()[0].FindKey("info")->GetString(), "1"); ASSERT_TRUE(watchdog_->Unregister("test-name")); } diff --git a/components/version_info/BUILD.gn b/components/version_info/BUILD.gn index 6bfe793d709df..ec9ac1176f002 100644 --- a/components/version_info/BUILD.gn +++ b/components/version_info/BUILD.gn @@ -6,7 +6,7 @@ import("//build/config/chrome_build.gni") import("//build/util/lastchange.gni") import("//build/util/process_version.gni") if (!use_cobalt_customizations) { - import("//chrome/process_version_rc_template.gni") # For branding_file_path. +import("//chrome/process_version_rc_template.gni") # For branding_file_path. } declare_args() { @@ -24,13 +24,11 @@ static_library("version_info") { "//base", ] - public_deps = [ ":generate_version_info", ":channel", ] - if (is_starboard) { sources += [ "starboard_version_info_values.h" @@ -49,24 +47,24 @@ static_library("version_info") { } if (!use_cobalt_customizations) { - # Isolate the //ui/base dependency in this target. - static_library("version_string") { - sources = [ - "version_string.cc", - "version_string.h", - ] +# Isolate the //ui/base dependency in this target. +static_library("version_string") { + sources = [ + "version_string.cc", + "version_string.h", + ] - deps = [ - ":version_info", - "//components/strings", - ] + deps = [ + ":version_info", + "//components/strings", + ] - if (use_unofficial_version_number) { - defines = [ "USE_UNOFFICIAL_VERSION_NUMBER" ] - deps += [ "//ui/base" ] - } + if (use_unofficial_version_number) { + defines = [ "USE_UNOFFICIAL_VERSION_NUMBER" ] + deps += [ "//ui/base" ] } } +} source_set("channel") { sources = [ @@ -75,13 +73,13 @@ source_set("channel") { } if (!use_cobalt_customizations) { - process_version("generate_version_info") { - template_file = "version_info_values.h.version" - sources = [ - "//chrome/VERSION", - branding_file_path, - lastchange_file, - ] - output = "$target_gen_dir/version_info_values.h" - } +process_version("generate_version_info") { + template_file = "version_info_values.h.version" + sources = [ + "//chrome/VERSION", + branding_file_path, + lastchange_file, + ] + output = "$target_gen_dir/version_info_values.h" +} } diff --git a/components/version_info/METADATA b/components/version_info/METADATA index 278a2aa21eaeb..8a4b945d52d39 100644 --- a/components/version_info/METADATA +++ b/components/version_info/METADATA @@ -9,10 +9,9 @@ third_party { } url { type: GIT - value: "https://github.com/chromium/chromium" + value: "https://chromium.googlesource.com/chromium/src" } - # Closest commit hash to m70. - version: "737f4cc3d91409d092991dc6834788b9e4c5613a" + version: "71.0.3578.127" last_upgrade_date { year: 2018 month: 08 diff --git a/extensions/buildflags/METADATA b/extensions/buildflags/METADATA index c18d21e239cd4..5f76fa3e50bce 100644 --- a/extensions/buildflags/METADATA +++ b/extensions/buildflags/METADATA @@ -9,10 +9,9 @@ third_party { } url { type: GIT - value: "https://github.com/chromium/chromium" + value: "https://chromium.googlesource.com/chromium/src" } - # Closest commit hash to m70. - version: "835b1103d31bdb8a2df943e3c837099a79e930ad" + version: "80.0.3987.162" last_upgrade_date { year: 2018 month: 03 diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar deleted file mode 100644 index 3b4cb1f72e255..0000000000000 Binary files a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar and /dev/null differ diff --git a/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar new file mode 100644 index 0000000000000..f34483df77752 Binary files /dev/null and b/starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar differ diff --git a/starboard/android/arm/cobalt/configuration.py b/starboard/android/arm/cobalt/configuration.py index 86c7716b0fc45..579c23f831534 100644 --- a/starboard/android/arm/cobalt/configuration.py +++ b/starboard/android/arm/cobalt/configuration.py @@ -39,6 +39,7 @@ 'service_worker_persist_test', 'deep_links', 'web_platform_tests', + 'persistent_cookie', ], } diff --git a/starboard/android/shared/BUILD.gn b/starboard/android/shared/BUILD.gn index d5172d419125d..96130a4a69955 100644 --- a/starboard/android/shared/BUILD.gn +++ b/starboard/android/shared/BUILD.gn @@ -21,11 +21,14 @@ import("//starboard/shared/starboard/player/player_tests.gni") # Configuration to extract GameActivity native files. ########################################################## -game_activity_aar_file = "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-1.2.2.aar" +game_activity_aar_file = "//starboard/android/apk/app/src/main/java/dev/cobalt/libraries/game_activity/games-activity-2.0.2.aar" game_activity_source_files = [ "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivity.cpp", "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivity.h", + "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityEvents.cpp", + "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityEvents.h", + "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-activity/GameActivityLog.h", "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gamecommon.h", "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gametextinput.cpp", "$target_gen_dir/game_activity/prefab/modules/game-activity/include/game-text-input/gametextinput.h", diff --git a/starboard/android/shared/media_capabilities_cache.cc b/starboard/android/shared/media_capabilities_cache.cc index d272428df3d08..2ff290e4301d5 100644 --- a/starboard/android/shared/media_capabilities_cache.cc +++ b/starboard/android/shared/media_capabilities_cache.cc @@ -74,6 +74,7 @@ constexpr int TYPE_USB_HEADSET = 22; constexpr int TYPE_WIRED_HEADPHONES = 4; constexpr int TYPE_WIRED_HEADSET = 3; +#if SB_API_VERSION >= 15 SbMediaAudioConnector GetConnectorFromAndroidOutputType( int android_output_device_type) { switch (android_output_device_type) { @@ -145,6 +146,7 @@ SbMediaAudioConnector GetConnectorFromAndroidOutputType( << android_output_device_type; return kSbMediaAudioConnectorUnknown; } +#endif // SB_API_VERSION >= 15 bool EndsWith(const std::string& str, const std::string& suffix) { if (str.size() < suffix.size()) { @@ -267,8 +269,12 @@ bool GetAudioConfiguration(int index, return env->CallIntMethodOrAbort(j_output_device_info.Get(), name, "()I"); }; +#if SB_API_VERSION >= 15 configuration->connector = GetConnectorFromAndroidOutputType(call_int_method("getType")); +#else // SB_API_VERSION >= 15 + configuration->connector = kSbMediaAudioConnectorHdmi; +#endif // SB_API_VERSION >= 15 configuration->latency = 0; configuration->coding_type = kSbMediaAudioCodingTypePcm; configuration->number_of_channels = call_int_method("getChannels"); diff --git a/starboard/android/shared/media_decoder.cc b/starboard/android/shared/media_decoder.cc index 912ee0673b636..6f76681896ce8 100644 --- a/starboard/android/shared/media_decoder.cc +++ b/starboard/android/shared/media_decoder.cc @@ -467,24 +467,20 @@ bool MediaDecoder::ProcessOneInputBuffer( } jint status; - if (event.type == Event::kWriteCodecConfig) { - if (!drm_system_ || (drm_system_ && drm_system_->IsReady())) { - status = media_codec_bridge_->QueueInputBuffer(dequeue_input_result.index, - kNoOffset, size, kNoPts, - BUFFER_FLAG_CODEC_CONFIG); - } else { - status = MEDIA_CODEC_NO_KEY; - } + if (drm_system_ && !drm_system_->IsReady()) { + // Drm system initialization is asynchronous. If there's a drm system, we + // should wait until it's initialized to avoid errors. + status = MEDIA_CODEC_NO_KEY; + } else if (event.type == Event::kWriteCodecConfig) { + status = media_codec_bridge_->QueueInputBuffer(dequeue_input_result.index, + kNoOffset, size, kNoPts, + BUFFER_FLAG_CODEC_CONFIG); } else if (event.type == Event::kWriteInputBuffer) { jlong pts_us = input_buffer->timestamp(); if (drm_system_ && input_buffer->drm_info()) { - if (drm_system_->IsReady()) { - status = media_codec_bridge_->QueueSecureInputBuffer( - dequeue_input_result.index, kNoOffset, *input_buffer->drm_info(), - pts_us); - } else { - status = MEDIA_CODEC_NO_KEY; - } + status = media_codec_bridge_->QueueSecureInputBuffer( + dequeue_input_result.index, kNoOffset, *input_buffer->drm_info(), + pts_us); } else { status = media_codec_bridge_->QueueInputBuffer( dequeue_input_result.index, kNoOffset, size, pts_us, kNoBufferFlags); diff --git a/starboard/build/config/BUILDCONFIG.gn b/starboard/build/config/BUILDCONFIG.gn index ad91e1df8891f..6b9e73370d4f4 100644 --- a/starboard/build/config/BUILDCONFIG.gn +++ b/starboard/build/config/BUILDCONFIG.gn @@ -507,6 +507,10 @@ template("shared_library") { forward_variables_from(invoker, [ "testonly" ]) sources = [ "//$starboard_path/starboard_loader.cc" ] + if (defined(extra_platform_loader_sources)) { + sources += extra_platform_loader_sources + } + if (use_asan) { sources += [ "//$starboard_path/sanitizer_options.cc" ] } diff --git a/starboard/build/config/modular/BUILD.gn b/starboard/build/config/modular/BUILD.gn index 231b6a187e811..d266109b94de1 100644 --- a/starboard/build/config/modular/BUILD.gn +++ b/starboard/build/config/modular/BUILD.gn @@ -68,9 +68,9 @@ config("modular") { "-O0", "-frtti", ] - if (!(is_host_win && using_old_compiler)) { + if (!cobalt_fastbuild) { cflags += [ - # This flag causes significant increase in shared library binary size on certain windows platforms. Refer b/297357707 + # This flag causes an increase in binary size on certain platforms. Refer b/297357707 "-g", ] } @@ -79,20 +79,17 @@ config("modular") { "-O2", "-frtti", ] - if (!(is_host_win && using_old_compiler)) { + if (!cobalt_fastbuild) { cflags += [ - # This flag causes significant increase in shared library binary size on certain windows platforms. Refer b/297357707 + # This flag causes an increase in binary size on certain platforms. Refer b/297357707 "-g", ] } } else { - cflags += [ "-fno-rtti" ] - if (!(is_host_win && using_old_compiler)) { - cflags += [ - # This flag causes significant increase in shared library binary size on certain windows platforms. Refer b/297357707 - "-gline-tables-only", - ] - } + cflags += [ + "-fno-rtti", + "-gline-tables-only", + ] } if (is_clang) { diff --git a/starboard/build/platform_configuration.py b/starboard/build/platform_configuration.py index eab019ce7b8fc..94d2144c85e1e 100644 --- a/starboard/build/platform_configuration.py +++ b/starboard/build/platform_configuration.py @@ -169,6 +169,7 @@ def GetTestTargets(self): return [ 'app_key_files_test', 'app_key_test', + 'base_unittests', 'common_test', 'cwrappers_test', 'drain_file_test', diff --git a/starboard/build/platforms.py b/starboard/build/platforms.py index 696453e633f67..03a9187ff2e4e 100644 --- a/starboard/build/platforms.py +++ b/starboard/build/platforms.py @@ -36,6 +36,7 @@ 'android-x86': 'starboard/android/x86', 'raspi-2': 'starboard/raspi/2', 'raspi-2-skia': 'starboard/raspi/2/skia', + 'rdk': 'starboard/rdk', 'evergreen-x64': 'starboard/evergreen/x64', 'evergreen-x86': 'starboard/evergreen/x86', 'evergreen-arm-hardfp': 'starboard/evergreen/arm/hardfp', diff --git a/starboard/evergreen/shared/launcher.py b/starboard/evergreen/shared/launcher.py index cd427f4332305..a6b7aa38fd3a2 100644 --- a/starboard/evergreen/shared/launcher.py +++ b/starboard/evergreen/shared/launcher.py @@ -175,8 +175,12 @@ def _StageTargetsAndContents(self): # TODO(b/267568637): Make the Linux launcher run from the install_directory. if 'linux' in self.loader_platform: self._StageTargetsAndContentsLinux() - else: + elif 'raspi' in self.loader_platform: self._StageTargetsAndContentsRaspi() + elif 'rdk' in self.loader_platform: + self._StageTargetsAndContentsRdk() + else: + raise ValueError(f"'{self.loader_platform}' is not recognized") def _StageTargetsAndContentsLinux(self): """Stage targets and their contents for GN builds for Linux platforms.""" @@ -271,6 +275,32 @@ def _StageTargetsAndContentsRaspi(self): os.makedirs(os.path.join(target_staging_dir, 'lib')) shutil.copy(target_binary_src, target_binary_dst) + def _StageTargetsAndContentsRdk(self): + """Stage targets and their contents for GN builds for RDK platforms.""" + content_subdir = os.path.join('usr', 'share', 'cobalt') + + # The rdk loader always loads libcobalt.so. Hard code target_name to match. + target_name = 'cobalt' + + # Copy target content and binary. + target_install_path = os.path.join(self.out_directory, 'install') + target_staging_dir = os.path.join(self.staging_directory, 'content', 'app', + target_name) + os.makedirs(target_staging_dir) + + # TODO(b/218889313): Reset the content path for the evergreen artifacts. + content_subdir = os.path.join('usr', 'share', 'cobalt') + target_content_src = os.path.join(target_install_path, content_subdir) + target_content_dst = os.path.join(target_staging_dir, 'content') + shutil.copytree(target_content_src, target_content_dst) + shlib_name = f'lib{self.target_name}.so' + + target_binary_src = os.path.join(self.out_directory, shlib_name) + target_binary_dst = os.path.join(target_staging_dir, 'lib', shlib_name) + + os.makedirs(os.path.join(target_staging_dir, 'lib')) + shutil.copy(target_binary_src, target_binary_dst) + def SupportsSuspendResume(self): return self.launcher.SupportsSuspendResume() diff --git a/starboard/extension/extension_test.cc b/starboard/extension/extension_test.cc index d32cc8436d7f1..0a40eef7c3612 100644 --- a/starboard/extension/extension_test.cc +++ b/starboard/extension/extension_test.cc @@ -27,6 +27,7 @@ #include "starboard/extension/memory_mapped_file.h" #include "starboard/extension/platform_info.h" #include "starboard/extension/platform_service.h" +#include "starboard/extension/time_zone.h" #include "starboard/extension/updater_notification.h" #include "starboard/extension/url_fetcher_observer.h" #include "starboard/system.h" @@ -438,5 +439,25 @@ TEST(ExtensionTest, PlatformInfo) { << "Extension struct should be a singleton"; } +TEST(ExtensionTest, TimeZone) { + typedef StarboardExtensionTimeZoneApi ExtensionApi; + const char* kExtensionName = kStarboardExtensionTimeZoneName; + + const ExtensionApi* extension_api = + static_cast(SbSystemGetExtension(kExtensionName)); + if (!extension_api) { + return; + } + + EXPECT_STREQ(extension_api->name, kExtensionName); + EXPECT_EQ(extension_api->version, 1u); + EXPECT_NE(extension_api->SetTimeZone, nullptr); + + const ExtensionApi* second_extension_api = + static_cast(SbSystemGetExtension(kExtensionName)); + EXPECT_EQ(second_extension_api, extension_api) + << "Extension struct should be a singleton"; +} + } // namespace extension } // namespace starboard diff --git a/starboard/extension/time_zone.h b/starboard/extension/time_zone.h new file mode 100644 index 0000000000000..bfddcea3a4f7a --- /dev/null +++ b/starboard/extension/time_zone.h @@ -0,0 +1,47 @@ +// Copyright 2023 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STARBOARD_EXTENSION_TIME_ZONE_H_ +#define STARBOARD_EXTENSION_TIME_ZONE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define kStarboardExtensionTimeZoneName "dev.starboard.extension.TimeZone" + +typedef struct StarboardExtensionTimeZoneApi { + // Name should be the string |kStarboardExtensionSetTimeZoneName|. + // This helps to validate that the extension API is correct. + const char* name; + + // This specifies the version of the API that is implemented. + uint32_t version; + + // Sets the current time zone to the specified time zone name. + // Note: This function should not be called with a NULL or empty + // string. It does not actually change the system clock, so it + // will not affect the time displayed on the system clock or + // used by other system processes. + bool (*SetTimeZone)(const char* time_zone_name); + +} StarboardExtensionTimeZoneApi; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // STARBOARD_EXTENSION_TIME_ZONE_H_ diff --git a/starboard/linux/shared/BUILD.gn b/starboard/linux/shared/BUILD.gn index 8bccb8278244a..ce8b874f4b82e 100644 --- a/starboard/linux/shared/BUILD.gn +++ b/starboard/linux/shared/BUILD.gn @@ -80,6 +80,8 @@ static_library("starboard_platform_sources") { "//starboard/linux/shared/system_get_extensions.cc", "//starboard/linux/shared/system_get_path.cc", "//starboard/linux/shared/system_has_capability.cc", + "//starboard/linux/shared/time_zone.cc", + "//starboard/linux/shared/time_zone.h", "//starboard/shared/alsa/alsa_audio_sink_type.cc", "//starboard/shared/alsa/alsa_audio_sink_type.h", "//starboard/shared/alsa/alsa_util.cc", diff --git a/starboard/linux/shared/system_get_extensions.cc b/starboard/linux/shared/system_get_extensions.cc index 4a0b2805e7e40..e1a44b4fe62c9 100644 --- a/starboard/linux/shared/system_get_extensions.cc +++ b/starboard/linux/shared/system_get_extensions.cc @@ -22,7 +22,9 @@ #include "starboard/extension/free_space.h" #include "starboard/extension/memory_mapped_file.h" #include "starboard/extension/platform_service.h" +#include "starboard/extension/time_zone.h" #include "starboard/linux/shared/soft_mic_platform_service.h" +#include "starboard/linux/shared/time_zone.h" #include "starboard/shared/enhanced_audio/enhanced_audio.h" #include "starboard/shared/ffmpeg/ffmpeg_demuxer.h" #include "starboard/shared/posix/free_space.h" @@ -74,5 +76,8 @@ const void* SbSystemGetExtension(const char* name) { return use_ffmpeg_demuxer ? starboard::shared::ffmpeg::GetFFmpegDemuxerApi() : NULL; } + if (strcmp(name, kStarboardExtensionTimeZoneName) == 0) { + return starboard::shared::GetTimeZoneApi(); + } return NULL; } diff --git a/starboard/linux/shared/time_zone.cc b/starboard/linux/shared/time_zone.cc new file mode 100644 index 0000000000000..30919af1107ba --- /dev/null +++ b/starboard/linux/shared/time_zone.cc @@ -0,0 +1,60 @@ +// Copyright 2023 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/linux/shared/time_zone.h" + +#include "starboard/extension/time_zone.h" + +#include +#include +#include + +#include "starboard/common/log.h" + +namespace starboard { +namespace shared { + +namespace { + +// Definitions of any functions included as components in the extension +// are added here. + +bool SetTimeZone(const char* time_zone_name) { + if (time_zone_name == nullptr || strlen(time_zone_name) == 0) { + SB_LOG(ERROR) << "Set time zone failed!"; + SB_LOG(ERROR) << "Time zone name can't be null or empty string."; + return false; + } + if (setenv("TZ", time_zone_name, 1) != 0) { + SB_LOG(WARNING) << "Set time zone failed!"; + return false; + } + tzset(); + return true; +} + +const StarboardExtensionTimeZoneApi kTimeZoneApi = { + kStarboardExtensionTimeZoneName, + 1, // API version that's implemented. + &SetTimeZone, +}; + +} // namespace + +const void* GetTimeZoneApi() { + return &kTimeZoneApi; +} + +} // namespace shared +} // namespace starboard diff --git a/starboard/linux/shared/time_zone.h b/starboard/linux/shared/time_zone.h new file mode 100644 index 0000000000000..6f063b0f2d41b --- /dev/null +++ b/starboard/linux/shared/time_zone.h @@ -0,0 +1,27 @@ +// Copyright 2023 The Cobalt Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STARBOARD_LINUX_SHARED_TIME_ZONE_H_ +#define STARBOARD_LINUX_SHARED_TIME_ZONE_H_ + +// Omit namespace linux due to symbol name conflict. +namespace starboard { +namespace shared { + +const void* GetTimeZoneApi(); + +} // namespace shared +} // namespace starboard + +#endif // STARBOARD_LINUX_SHARED_TIME_ZONE_H_ diff --git a/starboard/nplb/time_zone_get_current_test.cc b/starboard/nplb/time_zone_get_current_test.cc index 0c136d0f1fe6c..0c2b3b86d646d 100644 --- a/starboard/nplb/time_zone_get_current_test.cc +++ b/starboard/nplb/time_zone_get_current_test.cc @@ -12,7 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "starboard/extension/time_zone.h" #include "starboard/nplb/time_constants.h" +#include "starboard/system.h" #include "starboard/time_zone.h" #include "testing/gtest/include/gtest/gtest.h" @@ -34,9 +36,64 @@ TEST(SbTimeZoneGetCurrentTest, IsKindOfSane) { // ... and +24 hours from the Prime Meridian, inclusive EXPECT_LE(zone, 24 * 60); - if (zone == 0) { - SB_LOG(WARNING) << "SbTimeZoneGetCurrent() returns 0. This is only correct " - "if the current time zone is the same as UTC"; + static auto const* time_zone_extension = + static_cast( + SbSystemGetExtension(kStarboardExtensionTimeZoneName)); + if (time_zone_extension) { + ASSERT_STREQ(time_zone_extension->name, kStarboardExtensionTimeZoneName); + ASSERT_EQ(time_zone_extension->version, 1u); + time_zone_extension->SetTimeZone("UTC"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 0); + + // Atlantic time zone, UTC−04:00 + time_zone_extension->SetTimeZone("America/Puerto_Rico"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 240); + + // Eastern time zone, UTC−05:00 + time_zone_extension->SetTimeZone("America/New_York"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 300); + + time_zone_extension->SetTimeZone("US/Eastern"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 300); + + // Central time zone, UTC−06:00 + time_zone_extension->SetTimeZone("America/Chicago"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 360); + + // Mountain time zone, UTC−07:00 + time_zone_extension->SetTimeZone("US/Mountain"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 420); + + // Pacific time zone, UTC-08:00 + time_zone_extension->SetTimeZone("US/Pacific"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 480); + + // Alaska time zone, UTC-09:00 + time_zone_extension->SetTimeZone("US/Alaska"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 540); + + // Hawaii-Aleutian time zone, UTC-10:00 + time_zone_extension->SetTimeZone("Pacific/Honolulu"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 600); + + // American Samoa time zone, UTC-11:00 + time_zone_extension->SetTimeZone("US/Samoa"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, 660); + + // American Samoa time zone, UTC+10:00 + time_zone_extension->SetTimeZone("Pacific/Guam"); + zone = SbTimeZoneGetCurrent(); + EXPECT_EQ(zone, -600); } } diff --git a/starboard/raspi/shared/BUILD.gn b/starboard/raspi/shared/BUILD.gn index d3c16a91425ab..5d01947a8fd0d 100644 --- a/starboard/raspi/shared/BUILD.gn +++ b/starboard/raspi/shared/BUILD.gn @@ -35,6 +35,8 @@ static_library("starboard_platform_sources") { "//starboard/linux/shared/system_get_connection_type.cc", "//starboard/linux/shared/system_get_path.cc", "//starboard/linux/shared/system_has_capability.cc", + "//starboard/linux/shared/time_zone.cc", + "//starboard/linux/shared/time_zone.h", "//starboard/raspi/shared/application_dispmanx.cc", "//starboard/raspi/shared/audio_sink_type_dispatcher.cc", "//starboard/raspi/shared/dispmanx_util.cc", diff --git a/starboard/raspi/shared/launcher.py b/starboard/raspi/shared/launcher.py index f2802e08f294a..9010198da22a1 100644 --- a/starboard/raspi/shared/launcher.py +++ b/starboard/raspi/shared/launcher.py @@ -27,7 +27,7 @@ import pexpect from starboard.tools import abstract_launcher -from starboard.raspi.shared import retry +from starboard.shared import retry IS_MODULAR_BUILD = os.getenv('MODULAR_BUILD', '0') == '1' diff --git a/starboard/raspi/shared/retry_test.py b/starboard/raspi/shared/retry_test.py index 465edda5e265f..96da7b61d5806 100644 --- a/starboard/raspi/shared/retry_test.py +++ b/starboard/raspi/shared/retry_test.py @@ -15,7 +15,7 @@ """Tests for `retry` module""" import unittest -from starboard.raspi.shared import retry +from starboard.shared import retry import argparse import logging import sys diff --git a/starboard/raspi/shared/system_get_extensions.cc b/starboard/raspi/shared/system_get_extensions.cc index bd7854d66915f..511fb793d14eb 100644 --- a/starboard/raspi/shared/system_get_extensions.cc +++ b/starboard/raspi/shared/system_get_extensions.cc @@ -18,11 +18,13 @@ #include "starboard/extension/configuration.h" #include "starboard/extension/crash_handler.h" #include "starboard/extension/graphics.h" +#include "starboard/extension/time_zone.h" #include "starboard/shared/starboard/crash_handler.h" #if SB_IS(EVERGREEN_COMPATIBLE) #include "starboard/elf_loader/evergreen_config.h" #endif +#include "starboard/linux/shared/time_zone.h" #include "starboard/raspi/shared/configuration.h" #include "starboard/raspi/shared/graphics.h" @@ -48,5 +50,8 @@ const void* SbSystemGetExtension(const char* name) { if (strcmp(name, kCobaltExtensionCrashHandlerName) == 0) { return starboard::common::GetCrashHandlerApi(); } + if (strcmp(name, kStarboardExtensionTimeZoneName) == 0) { + return starboard::shared::GetTimeZoneApi(); + } return NULL; } diff --git a/starboard/rdk/gyp_configuration.py b/starboard/rdk/gyp_configuration.py new file mode 100644 index 0000000000000..508c47362c2e9 --- /dev/null +++ b/starboard/rdk/gyp_configuration.py @@ -0,0 +1,34 @@ +# Copyright 2023 The Cobalt Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Starboard RDK platform configuration.""" + +import os + +from starboard.build import platform_configuration + + +def CreatePlatformConfig(): + return RdkPlatformConfig('rdk') + + +class RdkPlatformConfig(platform_configuration.PlatformConfiguration): + """Starboard RDK platform configuration.""" + + def __init__(self, platform): + super().__init__(platform) + self.AppendApplicationConfigurationPath(os.path.dirname(__file__)) + + def GetLauncherPath(self): + """Gets the path to the launcher module for this platform.""" + return os.path.dirname(__file__) diff --git a/starboard/rdk/launcher.py b/starboard/rdk/launcher.py new file mode 100644 index 0000000000000..2fa4874b2624f --- /dev/null +++ b/starboard/rdk/launcher.py @@ -0,0 +1,426 @@ +# +# Copyright 2023 The Cobalt Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""RDK implementation of Starboard launcher abstraction.""" + +import functools +import logging +import os +import re +import signal +import six +import sys +import threading +import time +import contextlib + +import pexpect +from starboard.tools import abstract_launcher +from starboard.shared import retry + + +# pylint: disable=unused-argument +def _sigint_or_sigterm_handler(signum, frame): + """Clean up and exit with status |signum|. + + Args: + signum: Signal number that triggered this callback. Passed in when the + signal handler is called by python runtime. + frame: Current stack frame. Passed in when the signal handler is called by + python runtime. + """ + sys.exit(signum) + + +# First call returns True, otherwise return false. +def first_run(): + v = globals() + if 'first_run' not in v: + v['first_run'] = False + return True + return False + + +class Launcher(abstract_launcher.AbstractLauncher): + """Class for launching Cobalt/tools on RDK.""" + + _STARTUP_TIMEOUT_SECONDS = 1800 + + _RDK_USERNAME = 'root' + _RDK_PASSWORD = '' + _RDK_PROMPT = 'root@AmlogicFirebolt:' + _RDK_LOG_FILE = '/opt/logs/wpeframework.log' + + _SSH_LOGIN_SIGNAL = 'cobalt-launcher-login-success' + _SSH_SLEEP_SIGNAL = 'cobalt-launcher-done-sleeping' + + # pexpect times out each second to allow Kill to quickly stop a test run + _PEXPECT_TIMEOUT = 1 + + # SSH shell command retries + _PEXPECT_SPAWN_RETRIES = 20 + + # pexpect.sendline retries + _PEXPECT_SENDLINE_RETRIES = 3 + + # Old process kill retries + _KILL_RETRIES = 3 + + _PEXPECT_SHUTDOWN_SLEEP_TIME = 3 + # Time to wait after processes were killed + _PROCESS_KILL_SLEEP_TIME = 10 + + # Retrys for getting a clean prompt + _PROMPT_WAIT_MAX_RETRIES = 5 + # Wait up to 10 seconds for the password prompt from the RDK + _PEXPECT_PASSWORD_TIMEOUT_MAX_RETRIES = 10 + # Wait up to 900 seconds for new output from the RDK + _PEXPECT_READLINE_TIMEOUT_MAX_RETRIES = 900 + # Delay between subsequent SSH commands + _INTER_COMMAND_DELAY_SECONDS = 1.5 + + # This is used to strip ansi color codes from pexpect output. + _PEXPECT_SANITIZE_LINE_RE = re.compile(r'\x1b[^m]*m') + + # Exceptions to retry + _RETRY_EXCEPTIONS = (pexpect.TIMEOUT, pexpect.ExceptionPexpect, + pexpect.exceptions.EOF, OSError) + + def __init__(self, platform, target_name, config, device_id, **kwargs): + # pylint: disable=super-with-arguments + super().__init__(platform, target_name, config, device_id, **kwargs) + env = os.environ.copy() + env.update(self.env_variables) + self.full_env = env + self.platform = platform + + if not self.device_id: + self.device_id = self.full_env.get('RDK_ADDR') + if not self.device_id: + raise ValueError( + 'Unable to determine target, please pass it in, or set RDK_ADDR ' + 'environment variable.') + + self.startup_timeout_seconds = Launcher._STARTUP_TIMEOUT_SECONDS + + self.pexpect_process = None + + self._InitPexpectCommands() + + self.run_inactive = threading.Event() + self.run_inactive.set() + + self.shutdown_initiated = threading.Event() + + self.log_targets = kwargs.get('log_targets', True) + + signal.signal(signal.SIGINT, functools.partial(_sigint_or_sigterm_handler)) + signal.signal(signal.SIGTERM, functools.partial(_sigint_or_sigterm_handler)) + + self.last_run_pexpect_cmd = '' + + def _InitPexpectCommands(self): + """Initializes all of the pexpect commands needed for running the test.""" + + # Ensure no trailing slashes + self.out_directory = self.out_directory.rstrip('/') + + rdk_user_hostname = f'{Launcher._RDK_USERNAME}@{self.device_id}' + rdk_test_dir = '/usr/share/content/data/app' + + # scp command setup + options = '-rOCq' + source = os.path.join(self.out_directory, 'content', 'app', 'cobalt') + destination = f'{rdk_user_hostname}:{rdk_test_dir}/' + + # rsync command setup + options = '-avzLhc' + destination = f'{rdk_user_hostname}:{rdk_test_dir}/' + self.rsync_command = 'rsync ' + options + ' ' + source + ' ' + destination + + # ssh command setup + rsa_options = ( + '-o \"LogLevel ERROR\" ' + '-o \"UserKnownHostsFile=/dev/null\" -o \"StrictHostKeyChecking=no\"') + self.ssh_command = (f'ssh -t {rsa_options} {rdk_user_hostname} ' + f'TERM=dumb bash -l') + + # test output tags + self.test_complete_tag = 'test suites ran.' + self.test_failure_tag = 'tests, listed below' + self.test_success_tag = 'succeeded' + + def _request_payload(method): + """Create the request paylaod needed for running the test.""" + + cmd_test_param = (f'"sbmainargs":{self.target_command_line_params}' + if self.target_command_line_params else '') + json_cmd = ( + f'\'{{"jsonrpc": "2.0","id": 3,"method": "org.rdk.RDKShell.{method}",' + f'"params": {{"callsign":"YouTube","type":"Cobalt",' + f'"configuration":{{ {cmd_test_param}}} }} }}\' ') + return json_cmd + + # test command setup + cmd_log = f'tail -f {Launcher._RDK_LOG_FILE}' + self.test_command = (f'curl -X POST http://127.0.0.1:9998/jsonrpc -d ' + f'{_request_payload("1.launch")}; ' + f'{cmd_log}') + self.terminate_command = (f'curl -X POST http://127.0.0.1:9998/jsonrpc -d ' + f'{_request_payload("destroy")}; ') + + # pylint: disable=no-method-argument + def _CommandBackoff(): + time.sleep(Launcher._INTER_COMMAND_DELAY_SECONDS) + + def _ShutdownBackoff(self): + Launcher._CommandBackoff() + return self.shutdown_initiated.is_set() + + @retry.retry( + exceptions=_RETRY_EXCEPTIONS, + retries=_PEXPECT_SPAWN_RETRIES, + backoff=_CommandBackoff) + def _PexpectSpawnAndConnect(self, command): + """Spawns a process with pexpect and connect to the RDK. + + Args: + command: The command to use when spawning the pexpect process. + """ + + logging.info('executing: %s', command) + kwargs = {} if six.PY2 else {'encoding': 'utf-8'} + self.pexpect_process = pexpect.spawn( + command, timeout=Launcher._PEXPECT_TIMEOUT, **kwargs) + # Let pexpect output directly to our output stream + self.pexpect_process.logfile_read = self.output_file + expected_prompts = [ + r'.*Are\syou\ssure.*', # Fingerprint verification + r'.* password:', # Password prompt + '.*[a-zA-Z]+.*', # Any other text input + ] + + # pylint: disable=unnecessary-lambda + @retry.retry( + exceptions=Launcher._RETRY_EXCEPTIONS, + retries=Launcher._PEXPECT_PASSWORD_TIMEOUT_MAX_RETRIES, + backoff=lambda: self._ShutdownBackoff(), + wrap_exceptions=False) + def _inner(): + i = self.pexpect_process.expect(expected_prompts) + if i == 0: + self._PexpectSendLine('yes') + elif i == 1: + self._PexpectSendLine(Launcher._RDK_PASSWORD) + else: + # If any other input comes in, maybe we've logged in with rsa key or + # RDK does not have password. Check if we've logged in by echoing + # a special sentence and expect it back. + self._PexpectSendLine('echo ' + Launcher._SSH_LOGIN_SIGNAL) + i = self.pexpect_process.expect([Launcher._SSH_LOGIN_SIGNAL]) + + _inner() + + @retry.retry( + exceptions=_RETRY_EXCEPTIONS, + retries=_PEXPECT_SENDLINE_RETRIES, + wrap_exceptions=False) + def _PexpectSendLine(self, cmd): + """Send lines to Pexpect and record the last command for logging purposes""" + logging.info('sending >> : %s ', cmd) + self.last_run_pexpect_cmd = cmd + self.pexpect_process.sendline(cmd) + + def _PexpectReadLines(self): + """Reads all lines from the pexpect process.""" + # pylint: disable=unnecessary-lambda + @retry.retry( + exceptions=Launcher._RETRY_EXCEPTIONS, + retries=Launcher._PEXPECT_READLINE_TIMEOUT_MAX_RETRIES, + backoff=lambda: self.shutdown_initiated.is_set(), + wrap_exceptions=False) + def _readloop(): + while True: + # Sanitize the line to remove ansi color codes. + line = Launcher._PEXPECT_SANITIZE_LINE_RE.sub( + '', self.pexpect_process.readline()) + self.output_file.flush() + if not line: + return + # Check for the test complete tag. It will be followed by either a + # success or failure tag. + if line.find(self.test_complete_tag) != -1: + self.return_value = 0 + return + + _readloop() + + def _Sleep(self, val): + self._PexpectSendLine(f'sleep {val};echo {Launcher._SSH_SLEEP_SIGNAL}') + self.pexpect_process.expect([Launcher._SSH_SLEEP_SIGNAL]) + + def _CleanupPexpectProcess(self): + """Closes current pexpect process.""" + + if self.pexpect_process is not None and self.pexpect_process.isalive(): + # Check if kernel logged OOM kill or any other system failure message + if self.return_value: + logging.info('Sending dmesg') + with contextlib.suppress(Launcher._RETRY_EXCEPTIONS): + self._PexpectSendLine('dmesg -P --color=never | tail -n 100') + time.sleep(self._PEXPECT_SHUTDOWN_SLEEP_TIME) + with contextlib.suppress(Launcher._RETRY_EXCEPTIONS): + self.pexpect_process.readlines() + logging.info('Done sending dmesg') + + # Send ctrl-c to the RDK and close the process. + with contextlib.suppress(Launcher._RETRY_EXCEPTIONS): + self._PexpectSendLine(chr(3)) + time.sleep(self._PEXPECT_TIMEOUT) # Allow time for normal shutdown + with contextlib.suppress(Launcher._RETRY_EXCEPTIONS): + self.pexpect_process.close() + + def _WaitForPrompt(self): + """Sends empty commands, until a bash prompt is returned""" + + def backoff(): + self._PexpectSendLine('echo ' + Launcher._SSH_SLEEP_SIGNAL) + return self._ShutdownBackoff() + + retry.with_retry( + lambda: self.pexpect_process.expect(self._RDK_PROMPT), + exceptions=Launcher._RETRY_EXCEPTIONS, + retries=Launcher._PROMPT_WAIT_MAX_RETRIES, + backoff=backoff, + wrap_exceptions=False) + + @retry.retry( + exceptions=_RETRY_EXCEPTIONS, + retries=_KILL_RETRIES, + backoff=_CommandBackoff) + def _KillExistingCobaltProcesses(self): + """If there are leftover Cobalt processes, kill them. + + It is possible that a previous process did not exit cleanly. + Zombie Cobalt instances can block the WebDriver port or + cause other problems. + """ + logging.info('Killing existing processes') + self._PexpectSendLine(self.terminate_command) + self._WaitForPrompt() + logging.info('Done killing existing processes') + + def Run(self): + """Runs launcher's executable on the target RDK. + + Returns: + Whether or not the run finished successfully. + """ + + if self.log_targets: + logging.info('-' * 32) + logging.info('Starting to run target: %s', self.target_name) + logging.info('=' * 32) + + self.return_value = 1 + + try: + # Notify other threads that the run is now active + self.run_inactive.clear() + + # copy the test files to the RDK + if not self.shutdown_initiated.is_set(): + #self._PexpectSpawnAndConnect(self.scp_command) + self._PexpectSpawnAndConnect(self.rsync_command) + + if not self.shutdown_initiated.is_set(): + self._PexpectReadLines() + + # ssh into the RDK and run the test + if not self.shutdown_initiated.is_set(): + self._PexpectSpawnAndConnect(self.ssh_command) + self._Sleep(self._INTER_COMMAND_DELAY_SECONDS) + + # Execute debugging commands on the first run + first_run_commands = [] + if self.test_result_xml_path: + first_run_commands.append(f'touch {self.test_result_xml_path}') + + first_run_commands.extend(['free -mh', 'ps -ux', 'df -h']) + if first_run(): + for cmd in first_run_commands: + if not self.shutdown_initiated.is_set(): + self._PexpectSendLine(cmd) + + def _readline(): + line = self.pexpect_process.readline() + self.output_file.write(line) + + retry.with_retry( + _readline, + exceptions=Launcher._RETRY_EXCEPTIONS, + retries=Launcher._PROMPT_WAIT_MAX_RETRIES) + self._WaitForPrompt() + self.output_file.flush() + self._Sleep(self._INTER_COMMAND_DELAY_SECONDS) + self._KillExistingCobaltProcesses() + self._Sleep(self._INTER_COMMAND_DELAY_SECONDS) + + if not self.shutdown_initiated.is_set(): + self._PexpectSendLine(self.test_command) + self._PexpectReadLines() + + except retry.RetriesExceeded: + logging.exception('Command retry exceeded (cmd: %s)', + self.last_run_pexpect_cmd) + except pexpect.EOF: + logging.exception('pexpect encountered EOF while reading line. (cmd: %s)', + self.last_run_pexpect_cmd) + except pexpect.TIMEOUT: + logging.exception('pexpect timed out while reading line. (cmd: %s)', + self.last_run_pexpect_cmd) + except Exception: # pylint: disable=broad-except + logging.exception('Error occurred while running test. (cmd: %s)', + self.last_run_pexpect_cmd) + finally: + self._CleanupPexpectProcess() + + # Notify other threads that the run is no longer active + self.run_inactive.set() + + if self.log_targets: + logging.info('-' * 32) + logging.info('Finished running target: %s', self.target_name) + logging.info('=' * 32) + + return self.return_value + + def Kill(self): + """Stops the run so that the launcher can be killed.""" + + sys.stderr.write('\n***Killing Launcher***\n') + if self.run_inactive.is_set(): + return + # Initiate the shutdown. This causes the run to abort within one second. + self.shutdown_initiated.set() + # Wait up to three seconds for the run to be set to inactive. + self.run_inactive.wait(Launcher._PEXPECT_SHUTDOWN_SLEEP_TIME) + + def GetDeviceIp(self): + """Gets the device IP.""" + return self.device_id + + def GetDeviceOutputPath(self): + """Writable path where test targets can output files""" + return '/tmp' diff --git a/starboard/rdk/test_filters.py b/starboard/rdk/test_filters.py new file mode 100644 index 0000000000000..ca01191f58541 --- /dev/null +++ b/starboard/rdk/test_filters.py @@ -0,0 +1,111 @@ +# Copyright 2023 The Cobalt Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Starboard RDK Platform Test Filters.""" + +from starboard.tools.testing import test_filter + +# pylint: disable=line-too-long +_FILTERED_TESTS = { + 'base_unittests': [ + # TODO: (b/302394149) These cases need to be executed on RDK + 'PersistentHistogramStorageTest.HistogramWriteTest', + 'FileEnumerator.EmptyFolder', + 'FileEnumerator.SingleFileInFolderForFileSearch', + 'FileEnumerator.SingleFileInFolderForDirSearch', + 'FileEnumerator.SingleFolderInFolderForFileSearch', + 'FileEnumerator.SingleFolderInFolderForDirSearch', + 'FileEnumerator.FolderAndFileInFolder', + 'FileEnumerator.FilesInParentFolderAlwaysFirst', + 'FileEnumerator.FileInSubfolder', + 'FileProxyTest.CreateOrOpen_Create', + 'FileProxyTest.CreateOrOpen_Open', + 'FileProxyTest.CreateOrOpen_OpenNonExistent', + 'FileProxyTest.CreateOrOpen_AbandonedCreate', + 'FileProxyTest.Close', + 'FileProxyTest.CreateTemporary', + 'FileProxyTest.SetAndTake', + 'FileProxyTest.GetInfo', + 'FileProxyTest.Read', + 'FileProxyTest.WriteAndFlush', + 'FileProxyTest.SetLength_Shrink', + 'FileProxyTest.SetLength_Expand', + 'FileTest.Create', + 'FileTest.Async', + 'FileTest.ReadWrite', + 'FileTest.Append', + 'FileTest.Length', + 'FileTest.ReadAtCurrentPosition', + 'FileTest.WriteAtCurrentPosition', + 'FileTest.Seek', + 'FileTest.WriteDataToLargeOffset', + 'FileUtilTest.FileAndDirectorySize', + 'FileUtilTest.DeleteNonExistent', + 'FileUtilTest.DeleteNonExistentWithNonExistentParent', + 'FileUtilTest.DeleteFile', + 'FileUtilTest.DeleteDirNonRecursive', + 'FileUtilTest.DeleteDirRecursive', + 'FileUtilTest.DeleteDirRecursiveWithOpenFile', + 'FileUtilTest.CopyFile', + 'FileUtilTest.CreateTemporaryFileTest', + 'FileUtilTest.GetHomeDirTest', + 'FileUtilTest.CreateDirectoryTest', + 'FileUtilTest.DetectDirectoryTest', + 'FileUtilTest.FileEnumeratorTest', + 'FileUtilTest.AppendToFile', + 'FileUtilTest.ReadFile', + 'FileUtilTest.ReadFileToString', + 'FileUtilTest.ReadFileToStringWithUnknownFileSize', + 'FileUtilTest.ReadFileToStringWithLargeFile', + 'FileUtilTest.TouchFile', + 'FileUtilTest.IsDirectoryEmpty', + 'ImportantFileWriterTest.Basic', + 'ImportantFileWriterTest.WriteWithObserver', + 'ImportantFileWriterTest.CallbackRunsOnWriterThread', + 'ImportantFileWriterTest.ScheduleWrite', + 'ImportantFileWriterTest.DoScheduledWrite', + 'ImportantFileWriterTest.BatchingWrites', + 'ImportantFileWriterTest.ScheduleWrite_FailToSerialize', + 'ImportantFileWriterTest.ScheduleWrite_WriteNow', + 'ImportantFileWriterTest.DoScheduledWrite_FailToSerialize', + 'ScopedTempDir.FullPath', + 'ScopedTempDir.TempDir', + 'ScopedTempDir.UniqueTempDirUnderPath', + 'ScopedTempDir.MultipleInvocations', + 'JSONValueDeserializerTest.ReadProperJSONFromFile', + 'JSONValueDeserializerTest.ReadJSONWithCommasFromFile', + 'JSONFileValueSerializerTest.Roundtrip', + 'JSONFileValueSerializerTest.RoundtripNested', + 'JSONFileValueSerializerTest.NoWhitespace', + 'PathServiceTest.Get', + 'PathServiceTest.Override', + 'PathServiceTest.OverrideMultiple', + 'PathServiceTest.RemoveOverride', + 'SysInfoTest.AmountOfFreeDiskSpace', + 'SysInfoTest.AmountOfTotalDiskSpace', + ], +} + + +class TestFilters(object): + """Starboard RDK platform test filters.""" + + def GetTestFilters(self): + filters = [] + for target, tests in _FILTERED_TESTS.items(): + filters.extend(test_filter.TestFilter(target, test) for test in tests) + return filters + + +def CreateTestFilters(): + return TestFilters() diff --git a/starboard/raspi/shared/retry.py b/starboard/shared/retry.py similarity index 100% rename from starboard/raspi/shared/retry.py rename to starboard/shared/retry.py diff --git a/starboard/shared/uwp/application_uwp.cc b/starboard/shared/uwp/application_uwp.cc index c1192f542e525..b0f18dced91ed 100644 --- a/starboard/shared/uwp/application_uwp.cc +++ b/starboard/shared/uwp/application_uwp.cc @@ -660,7 +660,8 @@ ref class App sealed : public IFrameworkView { TryAddCommandArgsFromStarboardFile(&args_); CommandLine cmd_line(args_); if (cmd_line.HasSwitch(kNetArgsCommandSwitchWait)) { - SbTime timeout = kSbTimeSecond * 2; + // Wait for net args is flaky and needs extended wait time on Xbox. + SbTime timeout = kSbTimeSecond * 30; std::string val = cmd_line.GetSwitchValue(kNetArgsCommandSwitchWait); if (!val.empty()) { timeout = atoi(val.c_str()); diff --git a/starboard/shared/uwp/extended_resources_manager.cc b/starboard/shared/uwp/extended_resources_manager.cc index d7a82e013eb62..08f20da3c4ec2 100644 --- a/starboard/shared/uwp/extended_resources_manager.cc +++ b/starboard/shared/uwp/extended_resources_manager.cc @@ -44,6 +44,7 @@ using Windows::Foundation::Metadata::ApiInformation; using ::starboard::xb1::shared::Av1VideoDecoder; using ::starboard::xb1::shared::VpxVideoDecoder; #endif // defined(INTERNAL_BUILD) +using ::starboard::xb1::shared::GpuVideoDecoderBase; const SbTime kReleaseTimeout = kSbTimeSecond; @@ -472,6 +473,8 @@ void ExtendedResourcesManager::ReleaseExtendedResourcesInternal() { } else { SB_LOG(INFO) << "CreateFence() failed with " << hr; } + // Clear frame buffers used for rendering queue + GpuVideoDecoderBase::ClearFrameBuffersPool(); } if (d3d12queue_) { @@ -483,15 +486,6 @@ void ExtendedResourcesManager::ReleaseExtendedResourcesInternal() { d3d12queue_.Reset(); } - if (d3d12device_) { -#if !defined(COBALT_BUILD_TYPE_GOLD) - d3d12device_->AddRef(); - ULONG reference_count = d3d12device_->Release(); - SB_LOG(INFO) << "Reference count of |d3d12device_| is " - << reference_count; -#endif - d3d12device_.Reset(); - } if (d3d12FrameBuffersHeap_) { #if !defined(COBALT_BUILD_TYPE_GOLD) d3d12FrameBuffersHeap_->AddRef(); @@ -502,6 +496,16 @@ void ExtendedResourcesManager::ReleaseExtendedResourcesInternal() { d3d12FrameBuffersHeap_.Reset(); } + if (d3d12device_) { +#if !defined(COBALT_BUILD_TYPE_GOLD) + d3d12device_->AddRef(); + ULONG reference_count = d3d12device_->Release(); + SB_LOG(INFO) << "Reference count of |d3d12device_| is " + << reference_count; +#endif + d3d12device_.Reset(); + } + } catch (const std::exception& e) { SB_LOG(ERROR) << "Exception on releasing extended resources: " << e.what(); OnNonrecoverableFailure(); diff --git a/starboard/tools/testing/test_runner.py b/starboard/tools/testing/test_runner.py index cfbc5b6d22032..cfcbf6aeccae6 100755 --- a/starboard/tools/testing/test_runner.py +++ b/starboard/tools/testing/test_runner.py @@ -25,6 +25,7 @@ import sys import threading import traceback +import warnings from six.moves import cStringIO as StringIO from starboard.tools import abstract_launcher @@ -40,11 +41,11 @@ # pylint: disable=consider-using-f-string _FLAKY_RETRY_LIMIT = 4 -_TOTAL_TESTS_REGEX = re.compile(r"^\[==========\] (.*) tests? from .*" +_TOTAL_TESTS_REGEX = re.compile(r"\[==========\] (.*) tests? from .*" r"test suites? ran. \(.* ms total\)") -_TESTS_PASSED_REGEX = re.compile(r"^\[ PASSED \] (.*) tests?") -_TESTS_FAILED_REGEX = re.compile(r"^\[ FAILED \] (.*) tests?, listed below:") -_SINGLE_TEST_FAILED_REGEX = re.compile(r"^\[ FAILED \] (.*)") +_TESTS_PASSED_REGEX = re.compile(r"\[ PASSED \] (.*) tests?") +_TESTS_FAILED_REGEX = re.compile(r"\[ FAILED \] (.*) tests?, listed below:") +_SINGLE_TEST_FAILED_REGEX = re.compile(r"\[ FAILED \] (.*)") _NATIVE_CRASHPAD_TARGET = "native_target/crashpad_handler" _LOADER_TARGET = "elf_loader_sandbox" @@ -52,7 +53,7 @@ def _EnsureBuildDirectoryExists(path): if not os.path.exists(path): - raise ValueError(f"'{path}' does not exist.") + warnings.warn(f"'{path}' does not exist.") def _FilterTests(target_list, filters, config_name): diff --git a/starboard/xb1/shared/gpu_base_video_decoder.cc b/starboard/xb1/shared/gpu_base_video_decoder.cc index 62ff40229a1c1..a37dc716f4595 100644 --- a/starboard/xb1/shared/gpu_base_video_decoder.cc +++ b/starboard/xb1/shared/gpu_base_video_decoder.cc @@ -118,6 +118,8 @@ class GpuFrameBufferPool { return true; } + void Clear() { frame_buffers_.clear(); } + private: std::vector> frame_buffers_; @@ -754,6 +756,10 @@ void GpuVideoDecoderBase::ReleaseFrameBuffer(GpuFrameBuffer* frame_buffer) { frame_buffers_condition_.Signal(); } +void GpuVideoDecoderBase::ClearFrameBuffersPool() { + GetGpuFrameBufferPool()->Clear(); +} + GpuVideoDecoderBase::GpuFrameBuffer* GpuVideoDecoderBase::GetAvailableFrameBuffer(uint16_t width, uint16_t height) { if (decoder_behavior_.load() == kResettingDecoder) { diff --git a/starboard/xb1/shared/gpu_base_video_decoder.h b/starboard/xb1/shared/gpu_base_video_decoder.h index de0e45b4480f3..1853a640fc1d8 100644 --- a/starboard/xb1/shared/gpu_base_video_decoder.h +++ b/starboard/xb1/shared/gpu_base_video_decoder.h @@ -97,6 +97,7 @@ class GpuVideoDecoderBase int GetWidth() { return frame_width_; } int GetHeight() { return frame_height_; } bool IsHdrVideo() { return is_hdr_video_; } + static void ClearFrameBuffersPool(); protected: typedef ::starboard::shared::starboard::media::VideoStreamInfo diff --git a/starboard/xb1/tools/packager.py b/starboard/xb1/tools/packager.py index c2ab23dbae56a..a8b4e5ef0f063 100644 --- a/starboard/xb1/tools/packager.py +++ b/starboard/xb1/tools/packager.py @@ -53,6 +53,7 @@ } _DEFAULT_SDK_BIN_DIR = 'C:\\Program Files (x86)\\Windows Kits\\10\\bin' _DEFAULT_WIN_SDK_VERSION = '10.0.22621.0' +_BACKUP_WIN_SDK_VERSION = '10.0.22000.0' _SOURCE_SPLASH_SCREEN_SUB_PATH = os.path.join('internal', 'cobalt', 'browser', 'splash_screen') # The splash screen file referenced in starboard/xb1/shared/configuration.cc @@ -89,7 +90,13 @@ def _GetSourceSplashScreenDir(): def GetWinToolsPath() -> str: windows_sdk_bin_dir = _SelectBestPath('WindowsSdkBinPath', _DEFAULT_SDK_BIN_DIR) - return os.path.join(windows_sdk_bin_dir, _DEFAULT_WIN_SDK_VERSION, 'x64') + + # This check can be removed once it's confirmed our builders are using the new + # version of the win sdk. + path = os.path.join(windows_sdk_bin_dir, _DEFAULT_WIN_SDK_VERSION, 'x64') + if os.path.exists(path): + return path + return os.path.join(windows_sdk_bin_dir, _BACKUP_WIN_SDK_VERSION, 'x64') class Package(package.PackageBase): @@ -143,6 +150,15 @@ def _CopySplashScreen(self): return shutil.copy(src_splash_screen_file, splash_screen_dir) + def _CopyAppxData(self): + appx_data_output_dir = os.path.join(self.appx_folder_location, 'content', + 'data') + source_dir = os.path.join(self.source_dir, 'appx', 'content', 'data') + if not os.path.exists(source_dir): + logging.error('Failed to find source content in: %s', source_dir) + return + shutil.copytree(source_dir, appx_data_output_dir, dirs_exist_ok=True) + @classmethod def SupportedPlatforms(cls): if platform.system() == 'Windows': @@ -164,6 +180,11 @@ def __init__(self, publisher, product, **kwargs): if self.publisher: self._UpdateAppxManifestPublisher(publisher) + # For YouTubeTV and MainAppBeta move the appx data content to the correct + # appx directory. + if (self.product in ['youtubetv', 'mainappbeta']): + self._CopyAppxData() + # Remove any previous splash screen from content. self._CleanSplashScreenDir() # Copy the correct splash screen into content. diff --git a/starboard/xb1/tools/xb1_launcher.py b/starboard/xb1/tools/xb1_launcher.py index ab54abd45660e..cf252793fa1cc 100644 --- a/starboard/xb1/tools/xb1_launcher.py +++ b/starboard/xb1/tools/xb1_launcher.py @@ -95,6 +95,14 @@ _XB1_NET_LOG_PORT = 49353 _XB1_NET_ARG_PORT = 49355 +# Number of times a test will try or retry. +_TEST_MAX_TRIES = 4 +# Seconds to wait between retries (scales with backoff factor). +_TEST_RETRY_WAIT = 8 +# Amount to multiply retry time with each failed attempt (i.e. 2 doubles the +# amount of time to wait between retries). +_TEST_RETRY_BACKOFF_FACTOR = 2 + _PROCESS_TIMEOUT = 60 * 5.0 _PROCESS_KILL_TIMEOUT_SECONDS = 5.0 @@ -448,6 +456,31 @@ def CheckPackageIsDeployed(self): return False return package_list[package_index:].split('\n')[0].strip() + def RunTest(self, appx_name: str): + self.net_args_thread = None + attempt_num = 0 + retry_wait_s = _TEST_RETRY_WAIT + while attempt_num < _TEST_MAX_TRIES: + if not self.net_args_thread or not self.net_args_thread.is_alive(): + # This thread must start before the app executes or else it is possible + # the app will hang at _network_api.ExecuteBinary() + self.net_args_thread = net_args.NetArgsThread(self.device_id, + _XB1_NET_ARG_PORT, + self._target_args) + if self._network_api.ExecuteBinary(_DEFAULT_PACKAGE_NAME, appx_name): + break + + if not self.net_args_thread.ArgsSent(): + self._LogLn( + 'Net Args were not sent to the test! This will likely cause ' + 'the test to fail!') + attempt_num += 1 + self._LogLn(f'Retry attempt {attempt_num}.') + time.sleep(retry_wait_s) + retry_wait_s *= _TEST_RETRY_BACKOFF_FACTOR + if hasattr(self, 'net_args_thread'): + self.net_args_thread.join() + def Run(self): # Only upload and install Appx on the first run. if FirstRun(): @@ -474,12 +507,6 @@ def Run(self): try: self.Kill() # Kill existing running app. - - # These threads must start before the app executes or else it is possible - # the app will hang at _network_api.ExecuteBinary() - self.net_args_thread = net_args.NetArgsThread(self.device_id, - _XB1_NET_ARG_PORT, - self._target_args) # While binary is running, extract the net log and stream it to # the output. self.net_log_thread = net_log.NetLogThread(self.device_id, @@ -487,7 +514,7 @@ def Run(self): appx_name = ToAppxFriendlyName(self.target_name) - self._network_api.ExecuteBinary(_DEFAULT_PACKAGE_NAME, appx_name) + self.RunTest(appx_name) while self._network_api.IsBinaryRunning(self.target_name): self._Log(self.net_log_thread.GetLog()) diff --git a/starboard/xb1/tools/xb1_network_api.py b/starboard/xb1/tools/xb1_network_api.py index 093218e662f74..2d8834e9e3638 100644 --- a/starboard/xb1/tools/xb1_network_api.py +++ b/starboard/xb1/tools/xb1_network_api.py @@ -421,7 +421,8 @@ def FetchPackageFile(self, return None return None - def ExecuteBinary(self, partial_package_name, app_alias_name): + def ExecuteBinary(self, partial_package_name: str, + app_alias_name: str) -> bool: default_relative_name = self._GetDefaultRelativeId(partial_package_name) if not default_relative_name or not '!' in default_relative_name: raise IOError('Could not resolve package name "' + partial_package_name + @@ -432,33 +433,25 @@ def ExecuteBinary(self, partial_package_name, app_alias_name): appid_64 = base64.b64encode(package_relative_id.encode('UTF-8')) package_64 = base64.b64encode(default_relative_name.encode('UTF-8')) - retry_count = 4 - # Time to wait between tries. - retry_wait_s = 8 try: - while retry_count > 0: - self.LogLn('Executing: ' + package_relative_id) - response = self._DoJsonRequest( - 'POST', - _TASKMANAGER_ENDPOINT, - params={ - 'appid': appid_64, - 'package': package_64 - }, - raise_on_failure=False) - if not response or response == requests.codes.OK: - self.LogLn('Execution successful') - break - self.LogLn('Execution not successful: ' + str(response)) - self.LogLn('Retrying with ' + str(retry_count) + ' attempts remaining.') - time.sleep(retry_wait_s) - retry_count -= 1 - # Double the wait time until the next attempt. - retry_wait_s *= 2 + self.LogLn('Executing: ' + package_relative_id) + response = self._DoJsonRequest( + 'POST', + _TASKMANAGER_ENDPOINT, + params={ + 'appid': appid_64, + 'package': package_64 + }, + raise_on_failure=False) + if not response or response == requests.codes.OK: + self.LogLn('Execution successful') + return True + self.LogLn('Execution not successful: ' + str(response)) except Exception as err: err_msg = '\n Failed to run:\n ' + package_relative_id + \ '\n because of:\n' + str(err) raise IOError(err_msg) from err + return False # Given a package name, return all files + directories. # Throws IOError if the app is locked. diff --git a/third_party/angle/include/GLSLANG/ShaderVars.h b/third_party/angle/include/GLSLANG/ShaderVars.h index 52f6ad077556d..5d2d14683604f 100644 --- a/third_party/angle/include/GLSLANG/ShaderVars.h +++ b/third_party/angle/include/GLSLANG/ShaderVars.h @@ -12,6 +12,7 @@ #include #include +#include #include #include diff --git a/third_party/angle/src/common/angleutils.h b/third_party/angle/src/common/angleutils.h index 3a1391e29b72e..c8d36f5518611 100644 --- a/third_party/angle/src/common/angleutils.h +++ b/third_party/angle/src/common/angleutils.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/third_party/crashpad/util/misc/reinterpret_bytes.cc b/third_party/crashpad/util/misc/reinterpret_bytes.cc index 65ec33f348ec6..3fee722dea390 100644 --- a/third_party/crashpad/util/misc/reinterpret_bytes.cc +++ b/third_party/crashpad/util/misc/reinterpret_bytes.cc @@ -17,6 +17,7 @@ #include #include +#include #include "base/logging.h" diff --git a/third_party/devtools/.gitignore b/third_party/devtools/.gitignore index c5f70224e21b9..c3b88e4b41ef6 100644 --- a/third_party/devtools/.gitignore +++ b/third_party/devtools/.gitignore @@ -4,7 +4,6 @@ *.Makefile *.mk *.pyc -*.rsp *.rules *.sln *.stamp diff --git a/third_party/devtools/BUILD.gn b/third_party/devtools/BUILD.gn index 6b84392c42c23..e11ca6ee943de 100644 --- a/third_party/devtools/BUILD.gn +++ b/third_party/devtools/BUILD.gn @@ -121,14 +121,25 @@ all_devtools_files = [ "front_end/elements_test_runner/SetOuterHTMLTestRunner.js", "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js", "front_end/emulated_devices/module.json", + "front_end/emulation/AdvancedApp.js", + "front_end/emulation/DeviceModeModel.js", "front_end/emulation/deviceModeToolbar.css", + "front_end/emulation/DeviceModeToolbar.js", "front_end/emulation/deviceModeView.css", + "front_end/emulation/DeviceModeView.js", + "front_end/emulation/DeviceModeWrapper.js", "front_end/emulation/devicesSettingsTab.css", + "front_end/emulation/DevicesSettingsTab.js", + "front_end/emulation/EmulatedDevices.js", "front_end/emulation/geolocationsSettingsTab.css", + "front_end/emulation/GeolocationsSettingsTab.js", "front_end/emulation/inspectedPagePlaceholder.css", + "front_end/emulation/InspectedPagePlaceholder.js", "front_end/emulation/mediaQueryInspector.css", + "front_end/emulation/MediaQueryInspector.js", "front_end/emulation/module.json", "front_end/emulation/sensors.css", + "front_end/emulation/SensorsView.js", "front_end/event_listeners/eventListenersView.css", "front_end/event_listeners/module.json", "front_end/extensions/module.json", @@ -174,7 +185,10 @@ all_devtools_files = [ "front_end/layers/module.json", "front_end/layers_test_runner/LayersTestRunner.js", "front_end/layers_test_runner/module.json", + "front_end/main/ExecutionContextSelector.js", + "front_end/main/Main.js", "front_end/main/module.json", + "front_end/main/SimpleApp.js", "front_end/protocol_monitor/protocolMonitor.css", "front_end/protocol_monitor/module.json", "front_end/mobile_throttling/module.json", @@ -192,21 +206,46 @@ all_devtools_files = [ "front_end/ndb_app.json", "front_end/network/binaryResourceView.css", "front_end/network/blockedURLsPane.css", + "front_end/network/BinaryResourceView.js", + "front_end/network/BlockedURLsPane.js", "front_end/network/eventSourceMessagesView.css", + "front_end/network/EventSourceMessagesView.js", + "front_end/network/HARWriter.js", "front_end/network/module.json", "front_end/network/networkConfigView.css", + "front_end/network/NetworkConfigView.js", + "front_end/network/NetworkDataGridNode.js", + "front_end/network/NetworkItemView.js", "front_end/network/networkLogView.css", + "front_end/network/NetworkLogView.js", + "front_end/network/NetworkLogViewColumns.js", + "front_end/network/NetworkFrameGrouper.js", "front_end/network/networkManageCustomHeadersView.css", + "front_end/network/NetworkManageCustomHeadersView.js", + "front_end/network/NetworkOverview.js", "front_end/network/networkPanel.css", + "front_end/network/NetworkPanel.js", + "front_end/network/NetworkSearchScope.js", + "front_end/network/NetworkTimeCalculator.js", "front_end/network/networkTimingTable.css", "front_end/network/networkWaterfallColumn.css", + "front_end/network/NetworkWaterfallColumn.js", "front_end/network/requestCookiesView.css", + "front_end/network/RequestCookiesView.js", "front_end/network/requestHeadersTree.css", "front_end/network/requestHeadersView.css", + "front_end/network/RequestHeadersView.js", "front_end/network/requestHTMLView.css", + "front_end/network/RequestHTMLView.js", "front_end/network/requestInitiatorView.css", + "front_end/network/RequestInitiatorView.js", + "front_end/network/RequestPreviewView.js", + "front_end/network/RequestResponseView.js", + "front_end/network/RequestTimingView.js", + "front_end/network/ResourceWebSocketFrameView.js", "front_end/network/signedExchangeInfoTree.css", "front_end/network/signedExchangeInfoView.css", + "front_end/network/SignedExchangeInfoView.js", "front_end/network/webSocketFrameView.css", "front_end/network_test_runner/module.json", "front_end/network_test_runner/NetworkTestRunner.js", @@ -343,7 +382,6 @@ all_devtools_files = [ "front_end/sources/CallStackSidebarPane.js", "front_end/sources/CSSPlugin.js", "front_end/sources/DebuggerPlugin.js", - "front_end/sources/CoveragePlugin.js", "front_end/sources/dialog.css", "front_end/sources/debuggerPausedMessage.css", "front_end/sources/DebuggerPausedMessage.js", @@ -391,6 +429,7 @@ all_devtools_files = [ "front_end/sources_test_runner/SourcesTestRunner.js", "front_end/sources_test_runner/module.json", "front_end/test_runner/module.json", + "front_end/test_runner/TestRunner.js", "front_end/text_editor/autocompleteTooltip.css", "front_end/text_editor/cmdevtools.css", "front_end/text_editor/module.json", @@ -539,46 +578,6 @@ lighthouse_locale_files = [ all_devtools_files += lighthouse_locale_files all_devtools_modules = [ - "front_end/network/network.js", - "front_end/network/SignedExchangeInfoView.js", - "front_end/network/ResourceWebSocketFrameView.js", - "front_end/network/RequestTimingView.js", - "front_end/network/RequestResponseView.js", - "front_end/network/RequestPreviewView.js", - "front_end/network/RequestInitiatorView.js", - "front_end/network/RequestHeadersView.js", - "front_end/network/RequestHTMLView.js", - "front_end/network/RequestCookiesView.js", - "front_end/network/NetworkWaterfallColumn.js", - "front_end/network/NetworkTimeCalculator.js", - "front_end/network/NetworkSearchScope.js", - "front_end/network/NetworkPanel.js", - "front_end/network/NetworkOverview.js", - "front_end/network/NetworkManageCustomHeadersView.js", - "front_end/network/NetworkLogViewColumns.js", - "front_end/network/NetworkLogView.js", - "front_end/network/NetworkItemView.js", - "front_end/network/NetworkFrameGrouper.js", - "front_end/network/NetworkDataGridNode.js", - "front_end/network/NetworkConfigView.js", - "front_end/network/HARWriter.js", - "front_end/network/EventSourceMessagesView.js", - "front_end/network/BlockedURLsPane.js", - "front_end/network/BinaryResourceView.js", - "front_end/test_runner/test_runner.js", - "front_end/test_runner/TestRunner.js", - "front_end/emulation/emulation.js", - "front_end/emulation/SensorsView.js", - "front_end/emulation/MediaQueryInspector.js", - "front_end/emulation/InspectedPagePlaceholder.js", - "front_end/emulation/GeolocationsSettingsTab.js", - "front_end/emulation/EmulatedDevices.js", - "front_end/emulation/DevicesSettingsTab.js", - "front_end/emulation/DeviceModeWrapper.js", - "front_end/emulation/DeviceModeView.js", - "front_end/emulation/DeviceModeToolbar.js", - "front_end/emulation/DeviceModeModel.js", - "front_end/emulation/AdvancedApp.js", "front_end/inspector_main/inspector_main.js", "front_end/inspector_main/RenderingOptions.js", "front_end/inspector_main/InspectorMain.js", @@ -594,10 +593,6 @@ all_devtools_modules = [ "front_end/screencast/InputModel.js", "front_end/performance_monitor/performance_monitor.js", "front_end/performance_monitor/PerformanceMonitor.js", - "front_end/main/main.js", - "front_end/main/SimpleApp.js", - "front_end/main/MainImpl.js", - "front_end/main/ExecutionContextSelector.js", "front_end/snippets/snippets.js", "front_end/snippets/SnippetsQuickOpen.js", "front_end/snippets/ScriptSnippetFileSystem.js", @@ -655,7 +650,6 @@ all_devtools_modules = [ "front_end/quick_open/FilteredListWidget.js", "front_end/quick_open/CommandMenu.js", "front_end/elements/elements.js", - "front_end/elements/elements-legacy.js", "front_end/elements/StylesSidebarPane.js", "front_end/elements/StylePropertyTreeElement.js", "front_end/elements/StylePropertyHighlighter.js", @@ -1191,6 +1185,7 @@ devtools_test_files = [ "front_end/sources_test_runner/SearchTestRunner.js", "front_end/sources_test_runner/SourcesTestRunner.js", "front_end/test_runner/module.json", + "front_end/test_runner/TestRunner.js", ] if (is_starboard) { @@ -1336,7 +1331,7 @@ if (is_starboard) { if (is_starboard) { resources_out_dir ="$sb_static_contents_output_data_dir/web/debug_remote/devtools" } else { - resources_out_dir = "$root_out_dir/resources/inspector" +resources_out_dir = "$root_out_dir/resources/inspector" } generated_scripts = [ @@ -1359,46 +1354,6 @@ application_templates = [ ] copied_devtools_modules = [ - "$resources_out_dir/network/network.js", - "$resources_out_dir/network/SignedExchangeInfoView.js", - "$resources_out_dir/network/ResourceWebSocketFrameView.js", - "$resources_out_dir/network/RequestTimingView.js", - "$resources_out_dir/network/RequestResponseView.js", - "$resources_out_dir/network/RequestPreviewView.js", - "$resources_out_dir/network/RequestInitiatorView.js", - "$resources_out_dir/network/RequestHeadersView.js", - "$resources_out_dir/network/RequestHTMLView.js", - "$resources_out_dir/network/RequestCookiesView.js", - "$resources_out_dir/network/NetworkWaterfallColumn.js", - "$resources_out_dir/network/NetworkTimeCalculator.js", - "$resources_out_dir/network/NetworkSearchScope.js", - "$resources_out_dir/network/NetworkPanel.js", - "$resources_out_dir/network/NetworkOverview.js", - "$resources_out_dir/network/NetworkManageCustomHeadersView.js", - "$resources_out_dir/network/NetworkLogViewColumns.js", - "$resources_out_dir/network/NetworkLogView.js", - "$resources_out_dir/network/NetworkItemView.js", - "$resources_out_dir/network/NetworkFrameGrouper.js", - "$resources_out_dir/network/NetworkDataGridNode.js", - "$resources_out_dir/network/NetworkConfigView.js", - "$resources_out_dir/network/HARWriter.js", - "$resources_out_dir/network/EventSourceMessagesView.js", - "$resources_out_dir/network/BlockedURLsPane.js", - "$resources_out_dir/network/BinaryResourceView.js", - "$resources_out_dir/test_runner/test_runner.js", - "$resources_out_dir/test_runner/TestRunner.js", - "$resources_out_dir/emulation/emulation.js", - "$resources_out_dir/emulation/SensorsView.js", - "$resources_out_dir/emulation/MediaQueryInspector.js", - "$resources_out_dir/emulation/InspectedPagePlaceholder.js", - "$resources_out_dir/emulation/GeolocationsSettingsTab.js", - "$resources_out_dir/emulation/EmulatedDevices.js", - "$resources_out_dir/emulation/DevicesSettingsTab.js", - "$resources_out_dir/emulation/DeviceModeWrapper.js", - "$resources_out_dir/emulation/DeviceModeView.js", - "$resources_out_dir/emulation/DeviceModeToolbar.js", - "$resources_out_dir/emulation/DeviceModeModel.js", - "$resources_out_dir/emulation/AdvancedApp.js", "$resources_out_dir/inspector_main/inspector_main.js", "$resources_out_dir/inspector_main/RenderingOptions.js", "$resources_out_dir/inspector_main/InspectorMain.js", @@ -1414,10 +1369,6 @@ copied_devtools_modules = [ "$resources_out_dir/screencast/InputModel.js", "$resources_out_dir/performance_monitor/performance_monitor.js", "$resources_out_dir/performance_monitor/PerformanceMonitor.js", - "$resources_out_dir/main/main.js", - "$resources_out_dir/main/SimpleApp.js", - "$resources_out_dir/main/MainImpl.js", - "$resources_out_dir/main/ExecutionContextSelector.js", "$resources_out_dir/snippets/snippets.js", "$resources_out_dir/snippets/SnippetsQuickOpen.js", "$resources_out_dir/snippets/ScriptSnippetFileSystem.js", @@ -1440,7 +1391,6 @@ copied_devtools_modules = [ "$resources_out_dir/web_audio/AudioContextSelector.js", "$resources_out_dir/web_audio/AudioContextContentBuilder.js", "$resources_out_dir/elements/elements.js", - "$resources_out_dir/elements/elements-legacy.js", "$resources_out_dir/elements/StylesSidebarPane.js", "$resources_out_dir/elements/StylePropertyTreeElement.js", "$resources_out_dir/elements/StylePropertyHighlighter.js", @@ -2212,42 +2162,42 @@ copy("copy_wasm_deps") { } if (!is_starboard) { - action("generate_devtools_grd") { - script = "scripts/build/generate_devtools_grd.py" +action("generate_devtools_grd") { + script = "scripts/build/generate_devtools_grd.py" - deps = [ - ":devtools_frontend_resources", - ] + deps = [ + ":devtools_frontend_resources", + ] - grd_files = - copied_devtools_modules + generated_applications + - generated_non_autostart_non_remote_modules + devtools_embedder_scripts + - generated_scripts + generated_worker_bundles + - [ - "$resources_out_dir/devtools_extension_api.js", - "$resources_out_dir/sdk/wasm_source_map/pkg/wasm_source_map_bg.wasm", - ] - - inputs = grd_files + devtools_image_files - outfile = "$root_gen_dir/devtools/devtools_resources.grd" - outputs = [ - outfile, - ] + grd_files = + copied_devtools_modules + generated_applications + + generated_non_autostart_non_remote_modules + devtools_embedder_scripts + + generated_scripts + generated_worker_bundles + + [ + "$resources_out_dir/devtools_extension_api.js", + "$resources_out_dir/sdk/wasm_source_map/pkg/wasm_source_map_bg.wasm", + ] + + inputs = grd_files + devtools_image_files + outfile = "$root_gen_dir/devtools/devtools_resources.grd" + outputs = [ + outfile, + ] - relative_path_dirs = [ - resources_out_dir, - "front_end", - ] + relative_path_dirs = [ + resources_out_dir, + "front_end", + ] - args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] + - rebase_path(relative_path_dirs, root_build_dir) + - [ - "--images", - rebase_path("front_end/Images", root_build_dir), - "--output", - rebase_path(outfile, root_build_dir), - ] - } + args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] + + rebase_path(relative_path_dirs, root_build_dir) + + [ + "--images", + rebase_path("front_end/Images", root_build_dir), + "--output", + rebase_path(outfile, root_build_dir), + ] +} } action("devtools_extension_api") { @@ -2275,9 +2225,9 @@ action("supported_css_properties") { "blink/properties/CSSProperties.json5", ] } else { - inputs = [ - "//third_party/blink/renderer/core/css/css_properties.json5", - ] + inputs = [ + "//third_party/blink/renderer/core/css/css_properties.json5", + ] } outputs = [ @@ -2296,9 +2246,9 @@ action("aria_properties") { "blink/properties/aria_properties.json5", ] } else { - inputs = [ - "//third_party/blink/renderer/core/html/aria_properties.json5", - ] + inputs = [ + "//third_party/blink/renderer/core/html/aria_properties.json5", + ] } outputs = [ @@ -2320,9 +2270,9 @@ action("frontend_protocol_sources") { "third_party/blink/public/devtools_protocol:protocol_version", ] } else { - deps = [ - "//third_party/blink/public/devtools_protocol:protocol_version", - ] + deps = [ + "//third_party/blink/public/devtools_protocol:protocol_version", + ] } inputs = [ "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json", @@ -2360,9 +2310,8 @@ action("build_release_devtools") { ] inputs = - helper_scripts + all_devtools_files + - devtools_test_files + generated_scripts + generated_aria_properties + - application_templates + + helper_scripts + all_devtools_files + devtools_test_files + + generated_scripts + generated_aria_properties + application_templates + # In `build_release_applications` we sometimes include # the content of Runtime.js into the build output. [ "front_end/Runtime.js" ] diff --git a/third_party/devtools/DEPS b/third_party/devtools/DEPS index 57b5bfa4e03c2..5c893e8989d1a 100644 --- a/third_party/devtools/DEPS +++ b/third_party/devtools/DEPS @@ -4,16 +4,16 @@ vars = { 'build_url': 'https://chromium.googlesource.com/chromium/src/build.git', - 'build_revision': 'dfe5662014cf45982441c8a767092934dfecfa9e', + 'build_revision': 'fb441b00ec01a484a292b7b0310e3faacc922966', 'buildtools_url': 'https://chromium.googlesource.com/chromium/src/buildtools.git', 'buildtools_revision': '6b3e658d6fe8cd9c2588796d296f07312b776054', 'depot_tools_url': 'https://chromium.googlesource.com/chromium/tools/depot_tools.git', - 'depot_tools_revision': '8b34eb4d1e76ae1a94ffce09dbc2a1fbc75d551c', + 'depot_tools_revision': '9212599f6aacbdbecd378814e63e236660ab42aa', 'inspector_protocol_url': 'https://chromium.googlesource.com/deps/inspector_protocol', - 'inspector_protocol_revision': 'a17fd5126f847b42c20f6e80846bccde97e95e9f', + 'inspector_protocol_revision': 'd2983fdc34c8558e817af97e8f166b4e3f5d3849', 'clang_format_url': 'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git', 'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917', diff --git a/third_party/devtools/METADATA b/third_party/devtools/METADATA index f1535f7e59ba1..e06a2dd385f7f 100644 --- a/third_party/devtools/METADATA +++ b/third_party/devtools/METADATA @@ -7,7 +7,8 @@ third_party { type: GIT value: "https://chromium.googlesource.com/devtools/devtools-frontend" } - version: "757e0e1e1ffc4a0d36d005d120de5f73c1b910e0" + version: "0d4095e47ca0e972e04efecf7772a8d12b60c665" + # from https://chromium.googlesource.com/chromium/src/+/80.0.3987.162/DEPS#247 last_upgrade_date { year: 2019 month: 12 diff --git a/third_party/devtools/PRESUBMIT.py b/third_party/devtools/PRESUBMIT.py index f745a8ee814b9..044d37f25e33a 100644 --- a/third_party/devtools/PRESUBMIT.py +++ b/third_party/devtools/PRESUBMIT.py @@ -32,8 +32,6 @@ for more details about the presubmit API built into gcl. """ -# pylint: skip-file - import sys EXCLUSIVE_CHANGE_DIRECTORIES = [ @@ -216,33 +214,23 @@ def _CheckCSSViolations(input_api, output_api): def _CommonChecks(input_api, output_api): """Checks common to both upload and commit.""" results = [] - # Cobalt changes don't need DevTools owners to be involved - # results.extend(input_api.canned_checks.CheckOwnersFormat(input_api, - # output_api)) - # results.extend(input_api.canned_checks.CheckOwners(input_api, output_api)) + results.extend(input_api.canned_checks.CheckOwnersFormat(input_api, output_api)) + results.extend(input_api.canned_checks.CheckOwners(input_api, output_api)) results.extend(input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(input_api, output_api)) results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(input_api, output_api)) - # Cobalt's depot_tools doesn't include CheckGenderNeutral - # results.extend(input_api.canned_checks.CheckGenderNeutral(input_api, - # output_api)) + results.extend(input_api.canned_checks.CheckGenderNeutral(input_api, output_api)) return results def CheckChangeOnUpload(input_api, output_api): results = [] results.extend(_CommonChecks(input_api, output_api)) - - # Cobalt doesn't use GN to build. - # results.extend(_CheckBuildGN(input_api, output_api)) - - # Formatting & style checks use eslint from a Node install, which isn't - # part of the Cobalt dev environment. - # results.extend(_CheckFormat(input_api, output_api)) - # results.extend(_CheckDevtoolsStyle(input_api, output_api)) - + results.extend(_CheckBuildGN(input_api, output_api)) + results.extend(_CheckFormat(input_api, output_api)) + results.extend(_CheckDevtoolsStyle(input_api, output_api)) results.extend(_CheckOptimizeSVGHashes(input_api, output_api)) results.extend(_CheckCSSViolations(input_api, output_api)) - #results.extend(_CheckDevtoolsLocalization(input_api, output_api)) + results.extend(_CheckDevtoolsLocalization(input_api, output_api)) results.extend(_CheckChangesAreExclusiveToDirectory(input_api, output_api)) return results @@ -250,7 +238,7 @@ def CheckChangeOnUpload(input_api, output_api): def CheckChangeOnCommit(input_api, output_api): results = [] results.extend(_CommonChecks(input_api, output_api)) - #results.extend(_CheckDevtoolsLocalization(input_api, output_api, True)) + results.extend(_CheckDevtoolsLocalization(input_api, output_api, True)) results.extend(_CheckChangesAreExclusiveToDirectory(input_api, output_api)) results.extend(input_api.canned_checks.CheckChangeHasDescription(input_api, output_api)) return results diff --git a/third_party/devtools/README.md b/third_party/devtools/README.md index 6477976f9d4f6..ed0b6dac61398 100644 --- a/third_party/devtools/README.md +++ b/third_party/devtools/README.md @@ -163,7 +163,7 @@ cases please get in touch with hablich@chromium.org.* Step-by-step guide on how to merge: 1. Request and receive approval to merge 1. Backmerges are done to the chromium/xxxx (e.g. chromium/3979) branch respectively on the DevTools frontend repo - 1. Use [Omahaproxy](https://omahaproxy.appspot.com/) to find out what + 1. Use [Omahaproxy](https://https://omahaproxy.appspot.com/) to find out what branch a major Chromium version has (column true_branch). Open the to-be-merged commit in Gerrit e.g. [Example](https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/1928912) diff --git a/third_party/devtools/__init__.py b/third_party/devtools/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/third_party/devtools/front_end/Runtime.js b/third_party/devtools/front_end/Runtime.js index 7aafeb69cc00a..7f7bf4fc39db0 100644 --- a/third_party/devtools/front_end/Runtime.js +++ b/third_party/devtools/front_end/Runtime.js @@ -868,11 +868,8 @@ class Module { return Promise.resolve(); } - const legacyFileName = `${this._name}-legacy.js`; - const fileName = this._descriptor.modules.includes(legacyFileName) ? legacyFileName : `${this._name}.js`; - // TODO(crbug.com/1011811): Remove eval when we use TypeScript which does support dynamic imports - return eval(`import('./${this._name}/${fileName}')`); + return eval(`import('./${this._name}/${this._name}.js')`); } /** diff --git a/third_party/devtools/front_end/accessibility/accessibilityNode.css b/third_party/devtools/front_end/accessibility/accessibilityNode.css index 759f4f4c6838d..bcb8f75811263 100644 --- a/third_party/devtools/front_end/accessibility/accessibilityNode.css +++ b/third_party/devtools/front_end/accessibility/accessibilityNode.css @@ -5,67 +5,68 @@ */ .widget.ax-subpane { - overflow-x: hidden; - user-select: text; + overflow-x: hidden; + -webkit-user-select: text; } .ax-ignored-info { - padding: 6px; + padding: 6px; } .ax-ignored-node-pane { - flex: none; + flex: none; } .invalid { - text-decoration: line-through; + text-decoration: line-through; } span.ax-value-undefined { - font-style: italic; + font-style: italic; } .ax-value-source-unused { - opacity: 0.7; + opacity: 0.7; } .ax-value-source-superseded, .ax-value-source-invalid { - text-decoration: line-through; + text-decoration: line-through; } .tree-outline span[is=dt-icon-label] { - position: relative; - left: -11px; + position: relative; + left: -11px; } .tree-outline li { - display: block; - overflow-x: hidden; - align-items: baseline; + display: block; + overflow-x: hidden; + padding-left: 1px; + align-items: baseline; } .tree-outline li::before { - content: ""; - width: 14px; - display: inline-block; + content: ""; + width: 14px; + display: inline-block; } .tree-outline li.property { - color: rgb(33, 33, 33); + color: rgb(33, 33, 33); } .tree-outline li.invalid { - position: relative; - left: -2px; + position: relative; + left: -2px; } .tree-outline span[is=dt-icon-label] + .ax-name { - margin-left: -11px; + margin-left: -11px; } .tree-outline li span { - flex-shrink: 0; - text-overflow: ellipsis; - white-space: nowrap; + flex-shrink: 0; + text-overflow: ellipsis; + white-space: nowrap; } diff --git a/third_party/devtools/front_end/accessibility/accessibilityProperties.css b/third_party/devtools/front_end/accessibility/accessibilityProperties.css index f88e0684baf97..c193898eb6853 100644 --- a/third_party/devtools/front_end/accessibility/accessibilityProperties.css +++ b/third_party/devtools/front_end/accessibility/accessibilityProperties.css @@ -5,22 +5,23 @@ */ .ax-name { - color: rgb(153, 69, 0); - flex-shrink: 0; + color: rgb(153, 69, 0); + flex-shrink: 0; } .ax-readable-name { - flex-shrink: 0; + flex-shrink: 0; + padding-left: 2px; } .ax-readable-string { - font-style: italic; + font-style: italic; } .ax-value-string { - color: rgb(200, 0, 0); + color: rgb(200, 0, 0); } span.ax-internal-role { - font-style: italic; + font-style: italic; } diff --git a/third_party/devtools/front_end/audits/AuditsController.js b/third_party/devtools/front_end/audits/AuditsController.js index cf152107c1bf1..0ff5c19f647b6 100644 --- a/third_party/devtools/front_end/audits/AuditsController.js +++ b/third_party/devtools/front_end/audits/AuditsController.js @@ -69,7 +69,7 @@ class AuditController extends Common.Object { return false; } - const inspectedURL = Common.ParsedURL.fromString(mainTarget.inspectedURL()); + const inspectedURL = mainTarget.inspectedURL().asParsedURL(); const inspectedOrigin = inspectedURL && inspectedURL.securityOrigin(); for (const registration of this._manager.registrations().values()) { if (registration.securityOrigin !== inspectedOrigin) { diff --git a/third_party/devtools/front_end/audits/AuditsStatusView.js b/third_party/devtools/front_end/audits/AuditsStatusView.js index d5090b65ea6a4..f3b24542fed47 100644 --- a/third_party/devtools/front_end/audits/AuditsStatusView.js +++ b/third_party/devtools/front_end/audits/AuditsStatusView.js @@ -83,7 +83,7 @@ export default class StatusView { this._reset(); this.updateStatus(ls`Loading\u2026`); - const parsedURL = Common.ParsedURL.fromString(this._inspectedURL); + const parsedURL = this._inspectedURL.asParsedURL(); const pageHost = parsedURL && parsedURL.host; const statusHeader = pageHost ? ls`Auditing ${pageHost}` : ls`Auditing your web page`; this._renderStatusHeader(statusHeader); diff --git a/third_party/devtools/front_end/audits/module.json b/third_party/devtools/front_end/audits/module.json index 4b9d1238754ef..2b6bcb43bb472 100644 --- a/third_party/devtools/front_end/audits/module.json +++ b/third_party/devtools/front_end/audits/module.json @@ -39,7 +39,8 @@ "auditsStartView.css", "lighthouse/template.html", "lighthouse/templates.html", - "lighthouse/report.css" + "lighthouse/report.css", + "lighthouse/report.js" ], "skip_compilation": [ "lighthouse/report.js", diff --git a/third_party/devtools/front_end/audits_test_runner/AuditsTestRunner.js b/third_party/devtools/front_end/audits_test_runner/AuditsTestRunner.js index e0d83d794ce13..d595cf6903e33 100644 --- a/third_party/devtools/front_end/audits_test_runner/AuditsTestRunner.js +++ b/third_party/devtools/front_end/audits_test_runner/AuditsTestRunner.js @@ -109,7 +109,6 @@ AuditsTestRunner.dumpStartAuditState = function() { const containerElement = AuditsTestRunner.getContainerElement(); const checkboxes = [...containerElement.querySelectorAll('.checkbox')]; - checkboxes.forEach(element => { TestRunner.addResult(AuditsTestRunner._checkboxStateLabel(element)); }); diff --git a/third_party/devtools/front_end/bindings/ResourceUtils.js b/third_party/devtools/front_end/bindings/ResourceUtils.js index 1467d1f7148b6..d03c01b42767b 100644 --- a/third_party/devtools/front_end/bindings/ResourceUtils.js +++ b/third_party/devtools/front_end/bindings/ResourceUtils.js @@ -66,7 +66,7 @@ export function displayNameForURL(url) { return url.trimURL(''); } - const parsedURL = Common.ParsedURL.fromString(inspectedURL); + const parsedURL = inspectedURL.asParsedURL(); const lastPathComponent = parsedURL ? parsedURL.lastPathComponent : parsedURL; const index = inspectedURL.indexOf(lastPathComponent); if (index !== -1 && index + lastPathComponent.length === inspectedURL.length) { diff --git a/third_party/devtools/front_end/browser_debugger/DOMBreakpointsSidebarPane.js b/third_party/devtools/front_end/browser_debugger/DOMBreakpointsSidebarPane.js index 0a0d43f7bd771..e888440781e67 100644 --- a/third_party/devtools/front_end/browser_debugger/DOMBreakpointsSidebarPane.js +++ b/third_party/devtools/front_end/browser_debugger/DOMBreakpointsSidebarPane.js @@ -30,25 +30,18 @@ /** * @implements {UI.ContextFlavorListener} - * @implements {UI.ListDelegate} */ export class DOMBreakpointsSidebarPane extends UI.VBox { constructor() { super(true); this.registerRequiredCSS('browser_debugger/domBreakpointsSidebarPane.css'); + this._listElement = this.contentElement.createChild('div', 'breakpoint-list hidden'); this._emptyElement = this.contentElement.createChild('div', 'gray-info-message'); this._emptyElement.textContent = Common.UIString('No breakpoints'); - /** @type {!UI.ListModel.} */ - this._breakpoints = new UI.ListModel(); - /** @type {!UI.ListControl.} */ - this._list = new UI.ListControl(this._breakpoints, this, UI.ListMode.NonViewport); - this.contentElement.appendChild(this._list.element); - this._list.element.classList.add('breakpoint-list', 'hidden'); - UI.ARIAUtils.markAsList(this._list.element); - UI.ARIAUtils.setAccessibleName(this._list.element, ls`DOM Breakpoints list`); - this._emptyElement.tabIndex = -1; + /** @type {!Map} */ + this._items = new Map(); SDK.targetManager.addModelListener( SDK.DOMDebuggerModel, SDK.DOMDebuggerModel.Events.DOMBreakpointAdded, this._breakpointAdded, this); SDK.targetManager.addModelListener( @@ -63,114 +56,10 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { } } - this._highlightedBreakpoint = null; + this._highlightedElement = null; this._update(); } - /** - * @override - * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} item - * @return {!Element} - */ - createElementForItem(item) { - const element = createElementWithClass('div', 'breakpoint-entry'); - element.addEventListener('contextmenu', this._contextMenu.bind(this, item), true); - UI.ARIAUtils.markAsListitem(element); - element.tabIndex = this._list.selectedItem() === item ? 0 : -1; - - const checkboxLabel = UI.CheckboxLabel.create(/* title */ '', item.enabled); - const checkboxElement = checkboxLabel.checkboxElement; - checkboxElement.addEventListener('click', this._checkboxClicked.bind(this, item), false); - checkboxElement.tabIndex = -1; - UI.ARIAUtils.markAsHidden(checkboxLabel); - element.appendChild(checkboxLabel); - - const labelElement = createElementWithClass('div', 'dom-breakpoint'); - element.appendChild(labelElement); - element.addEventListener('keydown', event => { - if (event.key === ' ') { - checkboxElement.click(); - event.consume(true); - } - }); - - const description = createElement('div'); - const breakpointTypeLabel = BrowserDebugger.DOMBreakpointsSidebarPane.BreakpointTypeLabels.get(item.type); - description.textContent = breakpointTypeLabel; - const linkifiedNode = createElementWithClass('monospace'); - linkifiedNode.style.display = 'block'; - labelElement.appendChild(linkifiedNode); - Common.Linkifier.linkify(item.node, {preventKeyboardFocus: true}).then(linkified => { - linkifiedNode.appendChild(linkified); - UI.ARIAUtils.setAccessibleName(checkboxElement, ls`${breakpointTypeLabel}: ${linkified.deepTextContent()}`); - }); - - labelElement.appendChild(description); - - const checkedStateText = item.enabled ? ls`checked` : ls`unchecked`; - if (item === this._highlightedBreakpoint) { - element.classList.add('breakpoint-hit'); - UI.ARIAUtils.setDescription(element, ls`${checkedStateText} breakpoint hit`); - } else { - UI.ARIAUtils.setDescription(element, checkedStateText); - } - - - this._emptyElement.classList.add('hidden'); - this._list.element.classList.remove('hidden'); - - return element; - } - - /** - * @override - * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} item - * @return {number} - */ - heightForItem(item) { - return 0; - } - - /** - * @override - * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} item - * @return {boolean} - */ - isItemSelectable(item) { - return true; - } - - /** - * @override - * @param {?Element} fromElement - * @param {?Element} toElement - * @return {boolean} - */ - updateSelectedItemARIA(fromElement, toElement) { - return true; - } - - /** - * @override - * @param {?SDK.DOMDebuggerModel.DOMBreakpoint} from - * @param {?SDK.DOMDebuggerModel.DOMBreakpoint} to - * @param {?Element} fromElement - * @param {?Element} toElement - */ - selectedItemChanged(from, to, fromElement, toElement) { - if (fromElement) { - fromElement.tabIndex = -1; - } - - if (toElement) { - this.setDefaultFocusedElement(toElement); - toElement.tabIndex = 0; - if (this.hasFocus()) { - toElement.focus(); - } - } - } - /** * @param {!Common.Event} event */ @@ -182,11 +71,10 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { * @param {!Common.Event} event */ _breakpointToggled(event) { - const hadFocus = this.hasFocus(); const breakpoint = /** @type {!SDK.DOMDebuggerModel.DOMBreakpoint} */ (event.data); - this._list.refreshItem(breakpoint); - if (hadFocus) { - this.focus(); + const item = this._items.get(breakpoint); + if (item) { + item.checkbox.checked = breakpoint.enabled; } } @@ -194,28 +82,17 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { * @param {!Common.Event} event */ _breakpointsRemoved(event) { - const hadFocus = this.hasFocus(); const breakpoints = /** @type {!Array} */ (event.data); - let lastIndex = -1; for (const breakpoint of breakpoints) { - const index = this._breakpoints.indexOf(breakpoint); - if (index >= 0) { - this._breakpoints.remove(index); - lastIndex = index; + const item = this._items.get(breakpoint); + if (item) { + this._items.delete(breakpoint); + this._listElement.removeChild(item.element); } } - if (this._breakpoints.length === 0) { + if (!this._listElement.firstChild) { this._emptyElement.classList.remove('hidden'); - this.setDefaultFocusedElement(this._emptyElement); - this._list.element.classList.add('hidden'); - } else if (lastIndex >= 0) { - const breakpointToSelect = this._breakpoints.at(lastIndex); - if (breakpointToSelect) { - this._list.selectItem(breakpointToSelect); - } - } - if (hadFocus) { - this.focus(); + this._listElement.classList.add('hidden'); } } @@ -223,18 +100,43 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint */ _addBreakpoint(breakpoint) { - this._breakpoints.insertWithComparator(breakpoint, (breakpointA, breakpointB) => { - if (breakpointA.type > breakpointB.type) { - return -1; - } - if (breakpointA.type < breakpointB.type) { - return 1; - } - return 0; + const element = createElementWithClass('div', 'breakpoint-entry'); + element.addEventListener('contextmenu', this._contextMenu.bind(this, breakpoint), true); + + const checkboxLabel = UI.CheckboxLabel.create('', breakpoint.enabled); + const checkboxElement = checkboxLabel.checkboxElement; + checkboxElement.addEventListener('click', this._checkboxClicked.bind(this, breakpoint), false); + element.appendChild(checkboxLabel); + + const labelElement = createElementWithClass('div', 'dom-breakpoint'); + element.appendChild(labelElement); + + const description = createElement('div'); + const breakpointTypeLabel = BreakpointTypeLabels.get(breakpoint.type); + description.textContent = breakpointTypeLabel; + const linkifiedNode = createElementWithClass('monospace'); + linkifiedNode.style.display = 'block'; + labelElement.appendChild(linkifiedNode); + Common.Linkifier.linkify(breakpoint.node).then(linkified => { + linkifiedNode.appendChild(linkified); + UI.ARIAUtils.setAccessibleName(checkboxElement, ls`${breakpointTypeLabel}: ${linkified.deepTextContent()}`); }); - if (!this.hasFocus()) { - this._list.selectItem(this._breakpoints.at(0)); + labelElement.appendChild(description); + + const item = {breakpoint: breakpoint, element: element, checkbox: checkboxElement}; + element._item = item; + this._items.set(breakpoint, item); + + let currentElement = this._listElement.firstChild; + while (currentElement) { + if (currentElement._item && currentElement._item.breakpoint.type < breakpoint.type) { + break; + } + currentElement = currentElement.nextSibling; } + this._listElement.insertBefore(element, currentElement); + this._emptyElement.classList.add('hidden'); + this._listElement.classList.remove('hidden'); } /** @@ -243,8 +145,6 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { */ _contextMenu(breakpoint, event) { const contextMenu = new UI.ContextMenu(event); - contextMenu.defaultSection().appendItem( - ls`Reveal DOM node in Elements panel`, Common.Revealer.reveal.bind(null, breakpoint.node)); contextMenu.defaultSection().appendItem(Common.UIString('Remove breakpoint'), () => { breakpoint.domDebuggerModel.removeDOMBreakpoint(breakpoint.node, breakpoint.type); }); @@ -256,10 +156,13 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { /** * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint - * @param {!Event} event */ - _checkboxClicked(breakpoint, event) { - breakpoint.domDebuggerModel.toggleDOMBreakpoint(breakpoint, event.target.checked); + _checkboxClicked(breakpoint) { + const item = this._items.get(breakpoint); + if (!item) { + return; + } + breakpoint.domDebuggerModel.toggleDOMBreakpoint(breakpoint, item.checkbox.checked); } /** @@ -272,15 +175,13 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { _update() { const details = UI.context.flavor(SDK.DebuggerPausedDetails); - if (this._highlightedBreakpoint) { - const oldHighlightedBreakpoint = this._highlightedBreakpoint; - delete this._highlightedBreakpoint; - this._list.refreshItem(oldHighlightedBreakpoint); - } if (!details || !details.auxData || details.reason !== SDK.DebuggerModel.BreakReason.DOM) { + if (this._highlightedElement) { + this._highlightedElement.classList.remove('breakpoint-hit'); + delete this._highlightedElement; + } return; } - const domDebuggerModel = details.debuggerModel.target().model(SDK.DOMDebuggerModel); if (!domDebuggerModel) { return; @@ -290,15 +191,18 @@ export class DOMBreakpointsSidebarPane extends UI.VBox { return; } - for (const breakpoint of this._breakpoints) { - if (breakpoint.node === data.node && breakpoint.type === data.type) { - this._highlightedBreakpoint = breakpoint; + let element = null; + for (const item of this._items.values()) { + if (item.breakpoint.node === data.node && item.breakpoint.type === data.type) { + element = item.element; } } - if (this._highlightedBreakpoint) { - this._list.refreshItem(this._highlightedBreakpoint); + if (!element) { + return; } UI.viewManager.showView('sources.domBreakpoints'); + element.classList.add('breakpoint-hit'); + this._highlightedElement = element; } } diff --git a/third_party/devtools/front_end/browser_debugger/browser_debugger_strings.grdp b/third_party/devtools/front_end/browser_debugger/browser_debugger_strings.grdp index c4cf304f0a128..7cd1d3edd825e 100644 --- a/third_party/devtools/front_end/browser_debugger/browser_debugger_strings.grdp +++ b/third_party/devtools/front_end/browser_debugger/browser_debugger_strings.grdp @@ -15,9 +15,6 @@ breakpoint hit - - Reveal DOM node in Elements panel - Break on @@ -30,9 +27,6 @@ Refresh global listeners - - $1schecked breakpoint hit - Any XHR or fetch @@ -45,9 +39,6 @@ Global Listeners - - DOM Breakpoints list - Event Listener Breakpoints diff --git a/third_party/devtools/front_end/browser_debugger/domBreakpointsSidebarPane.css b/third_party/devtools/front_end/browser_debugger/domBreakpointsSidebarPane.css index f9a34b21e8ab5..d5622c2f12316 100644 --- a/third_party/devtools/front_end/browser_debugger/domBreakpointsSidebarPane.css +++ b/third_party/devtools/front_end/browser_debugger/domBreakpointsSidebarPane.css @@ -21,10 +21,6 @@ padding: 2px 0; } -.breakpoint-entry[data-keyboard-focus="true"] { - background-color: var(--focus-bg-color); -} - .breakpoint-list .breakpoint-entry:hover { background-color: #eee; } diff --git a/third_party/devtools/front_end/browser_debugger/eventListenerBreakpoints.css b/third_party/devtools/front_end/browser_debugger/eventListenerBreakpoints.css index fb0e1fe05efdc..abc51e44c1bf3 100644 --- a/third_party/devtools/front_end/browser_debugger/eventListenerBreakpoints.css +++ b/third_party/devtools/front_end/browser_debugger/eventListenerBreakpoints.css @@ -16,7 +16,7 @@ .tree-outline li { margin-left: 14px; - user-select: text; + -webkit-user-select: text; cursor: default; } @@ -51,3 +51,4 @@ :host-context(.-theme-with-dark-background) .breakpoint-hit .breakpoint-hit-marker { background-color: hsl(46, 98%, 22%); } + diff --git a/third_party/devtools/front_end/color_picker/spectrum.css b/third_party/devtools/front_end/color_picker/spectrum.css index 669861ca44a0e..603c754f2fc11 100644 --- a/third_party/devtools/front_end/color_picker/spectrum.css +++ b/third_party/devtools/front_end/color_picker/spectrum.css @@ -2,7 +2,7 @@ :host { width: 232px; height: 319px; - user-select: none; + -webkit-user-select: none; overflow: hidden; } @@ -60,7 +60,7 @@ .spectrum-dragger, .spectrum-slider { - user-select: none; + -webkit-user-select: none; } .spectrum-sat, diff --git a/third_party/devtools/front_end/common/App.js b/third_party/devtools/front_end/common/App.js index ead49ff98c893..e06a00b24561b 100644 --- a/third_party/devtools/front_end/common/App.js +++ b/third_party/devtools/front_end/common/App.js @@ -12,3 +12,12 @@ export class App { presentUI(document) { } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.App = App; diff --git a/third_party/devtools/front_end/common/AppProvider.js b/third_party/devtools/front_end/common/AppProvider.js index 8f2bd81317ff3..fa865e5fc6a0c 100644 --- a/third_party/devtools/front_end/common/AppProvider.js +++ b/third_party/devtools/front_end/common/AppProvider.js @@ -14,3 +14,12 @@ export class AppProvider { createApp() { } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.AppProvider = AppProvider; diff --git a/third_party/devtools/front_end/common/CharacterIdMap.js b/third_party/devtools/front_end/common/CharacterIdMap.js index 042f76429e280..b087c35ca309b 100644 --- a/third_party/devtools/front_end/common/CharacterIdMap.js +++ b/third_party/devtools/front_end/common/CharacterIdMap.js @@ -44,3 +44,12 @@ export class CharacterIdMap { return object; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.CharacterIdMap = CharacterIdMap; diff --git a/third_party/devtools/front_end/common/Color.js b/third_party/devtools/front_end/common/Color.js index f627288a222c0..e0d007147fc17 100644 --- a/third_party/devtools/front_end/common/Color.js +++ b/third_party/devtools/front_end/common/Color.js @@ -30,8 +30,6 @@ /** * @unrestricted */ -import {moduleSetting} from './Settings.js'; - export class Color { /** * @param {!Array.} rgba @@ -39,7 +37,6 @@ export class Color { * @param {string=} originalText */ constructor(rgba, format, originalText) { - this._hsla = undefined; this._rgba = rgba; this._originalText = originalText || null; this._originalTextIsValid = !!this._originalText; @@ -431,7 +428,7 @@ export class Color { static detectColorFormat(color) { const cf = Format; let format; - const formatSetting = moduleSetting('colorFormat').get(); + const formatSetting = Common.moduleSetting('colorFormat').get(); if (formatSetting === cf.Original) { format = cf.Original; } else if (formatSetting === cf.RGB) { @@ -493,7 +490,7 @@ export class Color { s = diff / (2 - add); } - this._hsla = /** @type {!Array.} */ ([h, s, l, this._rgba[3]]); + this._hsla = [h, s, l, this._rgba[3]]; return this._hsla; } @@ -988,3 +985,26 @@ export class Generator { Color.hsva2rgba._tmpHSLA = [0, 0, 0, 0]; Color.calculateContrastRatio._blendedFg = [0, 0, 0, 0]; + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.Color = Color; + +Common.Color.Regex = Regex; + +/** + * @enum {string} + */ +Common.Color.Format = Format; +Common.Color.Nicknames = Nicknames; +Common.Color.PageHighlight = PageHighlight; + +/** + * @constructor + */ +Common.Color.Generator = Generator; diff --git a/third_party/devtools/front_end/common/Console.js b/third_party/devtools/front_end/common/Console.js index dba8b01bc7dd1..c0f16c0b0b64a 100644 --- a/third_party/devtools/front_end/common/Console.js +++ b/third_party/devtools/front_end/common/Console.js @@ -3,7 +3,6 @@ // found in the LICENSE file. import {ObjectWrapper} from './Object.js'; -import {reveal} from './Revealer.js'; /** * @unrestricted @@ -62,7 +61,7 @@ export class Console extends ObjectWrapper { * @return {!Promise.} */ showPromise() { - return reveal(this); + return Common.Revealer.reveal(this); } } @@ -97,3 +96,27 @@ export class Message { this.show = show; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +Common.console = new Console(); + +/** + * @constructor + */ +Common.Console = Console; + +/** @enum {symbol} */ +Common.Console.Events = Events; + +/** + * @enum {string} + */ +Common.Console.MessageLevel = MessageLevel; + +/** + * @constructor + */ +Common.Console.Message = Message; diff --git a/third_party/devtools/front_end/common/ContentProvider.js b/third_party/devtools/front_end/common/ContentProvider.js index 19d0fa82e4f53..213ba7d02edb1 100644 --- a/third_party/devtools/front_end/common/ContentProvider.js +++ b/third_party/devtools/front_end/common/ContentProvider.js @@ -119,3 +119,30 @@ export const contentAsDataURL = function(content, mimeType, contentEncoded, char return 'data:' + mimeType + (charset ? ';charset=' + charset : '') + (contentEncoded ? ';base64' : '') + ',' + content; }; + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.ContentProvider = ContentProvider; + +/** + * @constructor + */ +Common.ContentProvider.SearchMatch = SearchMatch; +Common.ContentProvider.performSearchInContent = performSearchInContent; +Common.ContentProvider.contentAsDataURL = contentAsDataURL; + +/** + * @typedef {{ + * content: string, + * isEncoded: boolean, + * }|{ + * error: string, + * isEncoded: boolean, + * }} + */ +Common.DeferredContent; diff --git a/third_party/devtools/front_end/common/EventTarget.js b/third_party/devtools/front_end/common/EventTarget.js index bbafa2d50ad1a..0908cf1c77ef1 100644 --- a/third_party/devtools/front_end/common/EventTarget.js +++ b/third_party/devtools/front_end/common/EventTarget.js @@ -56,4 +56,23 @@ export class EventTarget { } } +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.EventTarget = EventTarget; + EventTarget.removeEventListeners = removeEventListeners; + +/** + * @typedef {!{eventTarget: !Common.EventTarget, eventType: (string|symbol), thisObject: (!Object|undefined), listener: function(!Common.Event)}} + */ +Common.EventTarget.EventDescriptor; + +/** + * @typedef {!{data: *}} + */ +Common.Event; diff --git a/third_party/devtools/front_end/common/JavaScriptMetaData.js b/third_party/devtools/front_end/common/JavaScriptMetaData.js index 8c38b49ab352f..86ab5b169dbc6 100644 --- a/third_party/devtools/front_end/common/JavaScriptMetaData.js +++ b/third_party/devtools/front_end/common/JavaScriptMetaData.js @@ -29,3 +29,12 @@ export class JavaScriptMetaData { signaturesForStaticMethod(name, receiverConstructorName) { } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.JavaScriptMetadata = JavaScriptMetaData; diff --git a/third_party/devtools/front_end/common/Linkifier.js b/third_party/devtools/front_end/common/Linkifier.js index 6342ae4373c8f..940cadaddd111 100644 --- a/third_party/devtools/front_end/common/Linkifier.js +++ b/third_party/devtools/front_end/common/Linkifier.js @@ -26,3 +26,15 @@ export class Linkifier { return self.runtime.extension(Linkifier, object).instance().then(linkifier => linkifier.linkify(object, options)); } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.Linkifier = Linkifier; + +/** @typedef {{tooltip: (string|undefined), preventKeyboardFocus: (boolean|undefined)}} */ +Common.Linkifier.Options; diff --git a/third_party/devtools/front_end/common/Object.js b/third_party/devtools/front_end/common/Object.js index c75d0653f30e6..2cb364f5ee2ca 100644 --- a/third_party/devtools/front_end/common/Object.js +++ b/third_party/devtools/front_end/common/Object.js @@ -125,3 +125,17 @@ export class ObjectWrapper { } } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.Object = ObjectWrapper; + +/** + * @typedef {!{thisObject: (!Object|undefined), listener: function(!Common.Event), disposed: (boolean|undefined)}} + */ +Common.Object._listenerCallbackTuple; diff --git a/third_party/devtools/front_end/common/ParsedURL.js b/third_party/devtools/front_end/common/ParsedURL.js index b52c4feacea9d..2aafe6dbbf485 100644 --- a/third_party/devtools/front_end/common/ParsedURL.js +++ b/third_party/devtools/front_end/common/ParsedURL.js @@ -88,18 +88,6 @@ export class ParsedURL { } } - /** - * @param {string} string - * @return {?ParsedURL} - */ - static fromString(string) { - const parsedURL = new ParsedURL(string.toString()); - if (parsedURL.isValid) { - return parsedURL; - } - return null; - } - /** * @param {string} fileSystemPath * @return {string} @@ -176,7 +164,7 @@ export class ParsedURL { * @return {string} */ static extractPath(url) { - const parsedURL = this.fromString(url); + const parsedURL = url.asParsedURL(); return parsedURL ? parsedURL.path : ''; } @@ -185,7 +173,7 @@ export class ParsedURL { * @return {string} */ static extractOrigin(url) { - const parsedURL = this.fromString(url); + const parsedURL = url.asParsedURL(); return parsedURL ? parsedURL.securityOrigin() : ''; } @@ -240,12 +228,12 @@ export class ParsedURL { } // Return absolute URLs as-is. - const parsedHref = this.fromString(trimmedHref); + const parsedHref = trimmedHref.asParsedURL(); if (parsedHref && parsedHref.scheme) { return trimmedHref; } - const parsedURL = this.fromString(baseURL); + const parsedURL = baseURL.asParsedURL(); if (!parsedURL) { return null; } @@ -427,3 +415,23 @@ export class ParsedURL { return this.url; } } + +/** + * @return {?ParsedURL} + */ +String.prototype.asParsedURL = function() { + const parsedURL = new ParsedURL(this.toString()); + if (parsedURL.isValid) { + return parsedURL; + } + return null; +}; + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.ParsedURL = ParsedURL; diff --git a/third_party/devtools/front_end/common/Progress.js b/third_party/devtools/front_end/common/Progress.js index e7075401a74d3..11972fb2118ee 100644 --- a/third_party/devtools/front_end/common/Progress.js +++ b/third_party/devtools/front_end/common/Progress.js @@ -260,3 +260,27 @@ export class ProgressProxy { } } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.Progress = Progress; + +/** + * @constructor + */ +Common.CompositeProgress = CompositeProgress; + +/** + * @constructor + */ +Common.SubProgress = SubProgress; + +/** + * @constructor + */ +Common.ProgressProxy = ProgressProxy; diff --git a/third_party/devtools/front_end/common/QueryParamHandler.js b/third_party/devtools/front_end/common/QueryParamHandler.js index 26a73bed8c595..736a5ea83094e 100644 --- a/third_party/devtools/front_end/common/QueryParamHandler.js +++ b/third_party/devtools/front_end/common/QueryParamHandler.js @@ -12,3 +12,12 @@ export class QueryParamHandler { handleQueryParam(value) { } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.QueryParamHandler = QueryParamHandler; diff --git a/third_party/devtools/front_end/common/ResourceType.js b/third_party/devtools/front_end/common/ResourceType.js index a87527679afbf..fe0bb51d86a13 100644 --- a/third_party/devtools/front_end/common/ResourceType.js +++ b/third_party/devtools/front_end/common/ResourceType.js @@ -89,7 +89,7 @@ export class ResourceType { * @return {?ResourceType} */ static fromURL(url) { - return _resourceTypeByExtension.get(ParsedURL.extractExtension(url)) || null; + return ResourceType._resourceTypeByExtension.get(ParsedURL.extractExtension(url)) || null; } /** @@ -112,12 +112,12 @@ export class ResourceType { */ static mimeFromURL(url) { const name = ParsedURL.extractName(url); - if (_mimeTypeByName.has(name)) { - return _mimeTypeByName.get(name); + if (ResourceType._mimeTypeByName.has(name)) { + return ResourceType._mimeTypeByName.get(name); } const ext = ParsedURL.extractExtension(url).toLowerCase(); - return _mimeTypeByExtension.get(ext); + return ResourceType._mimeTypeByExtension.get(ext); } /** @@ -125,7 +125,7 @@ export class ResourceType { * @return {string|undefined} */ static mimeFromExtension(ext) { - return _mimeTypeByExtension.get(ext); + return ResourceType._mimeTypeByExtension.get(ext); } /** @@ -366,3 +366,31 @@ export const _mimeTypeByExtension = new Map([ // Font ['ttf', 'font/opentype'], ['otf', 'font/opentype'], ['ttc', 'font/opentype'], ['woff', 'application/font-woff'] ]); + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @enum {!ResourceType} + */ +Common.resourceTypes = resourceTypes; + +/** + * @enum {!ResourceCategory} + */ +Common.resourceCategories = resourceCategories; + +/** + * @constructor + */ +Common.ResourceCategory = ResourceCategory; + +/** + * @constructor + */ +Common.ResourceType = ResourceType; + +Common.ResourceType._mimeTypeByName = _mimeTypeByName; +Common.ResourceType._resourceTypeByExtension = _resourceTypeByExtension; +Common.ResourceType._mimeTypeByExtension = _mimeTypeByExtension; diff --git a/third_party/devtools/front_end/common/Revealer.js b/third_party/devtools/front_end/common/Revealer.js index d04dfd87fe7d2..5bcece72cae89 100644 --- a/third_party/devtools/front_end/common/Revealer.js +++ b/third_party/devtools/front_end/common/Revealer.js @@ -50,3 +50,14 @@ export const revealDestination = function(revealable) { } return extension.descriptor()['destination']; }; + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.Revealer = Revealer; +Common.Revealer.reveal = reveal; +Common.Revealer.revealDestination = revealDestination; diff --git a/third_party/devtools/front_end/common/Runnable.js b/third_party/devtools/front_end/common/Runnable.js index 12dcc43623ee1..9efc73c23b89a 100644 --- a/third_party/devtools/front_end/common/Runnable.js +++ b/third_party/devtools/front_end/common/Runnable.js @@ -12,3 +12,12 @@ export class Runnable { run() { } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.Runnable = Runnable; diff --git a/third_party/devtools/front_end/common/SegmentedRange.js b/third_party/devtools/front_end/common/SegmentedRange.js index 62fa7a427f169..403d594cdf5fd 100644 --- a/third_party/devtools/front_end/common/SegmentedRange.js +++ b/third_party/devtools/front_end/common/SegmentedRange.js @@ -112,3 +112,17 @@ export class SegmentedRange { return merged; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.Segment = Segment; + +/** + * @constructor + */ +Common.SegmentedRange = SegmentedRange; diff --git a/third_party/devtools/front_end/common/Settings.js b/third_party/devtools/front_end/common/Settings.js index b64aa23f51959..4395d1bf0cb9e 100644 --- a/third_party/devtools/front_end/common/Settings.js +++ b/third_party/devtools/front_end/common/Settings.js @@ -520,7 +520,7 @@ export class VersionController { _updateVersionFrom3To4() { const advancedMode = Common.settings.createSetting('showHeaSnapshotObjectsHiddenProperties', false); - moduleSetting('showAdvancedHeapSnapshotProperties').set(advancedMode.get()); + Common.moduleSetting('showAdvancedHeapSnapshotProperties').set(advancedMode.get()); advancedMode.remove(); } @@ -948,3 +948,44 @@ export function moduleSetting(settingName) { export function settingForTest(settingName) { return Common.settings.settingForTest(settingName); } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.Settings = Settings; + +/** + * @constructor + */ +Common.SettingsStorage = SettingsStorage; + +/** + * @constructor + */ +Common.Setting = Setting; + +/** + * @constructor + */ +Common.RegExpSetting = RegExpSetting; +Common.settingForTest = settingForTest; + +/** + * @constructor + */ +Common.VersionController = VersionController; +Common.moduleSetting = moduleSetting; + +/** + * @enum {symbol} + */ +Common.SettingStorageType = SettingStorageType; + +/** + * @type {!Common.Settings} + */ +Common.settings; diff --git a/third_party/devtools/front_end/common/StaticContentProvider.js b/third_party/devtools/front_end/common/StaticContentProvider.js index cda11b992a462..b277ddcec38d0 100644 --- a/third_party/devtools/front_end/common/StaticContentProvider.js +++ b/third_party/devtools/front_end/common/StaticContentProvider.js @@ -76,3 +76,12 @@ export class StaticContentProvider { return content ? ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex) : []; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.StaticContentProvider = StaticContentProvider; diff --git a/third_party/devtools/front_end/common/StringOutputStream.js b/third_party/devtools/front_end/common/StringOutputStream.js index dafc269301a43..6c4379b22d505 100644 --- a/third_party/devtools/front_end/common/StringOutputStream.js +++ b/third_party/devtools/front_end/common/StringOutputStream.js @@ -50,3 +50,13 @@ export class StringOutputStream { return this._data; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @interface + */ +Common.OutputStream = OutputStream; +Common.StringOutputStream = StringOutputStream; diff --git a/third_party/devtools/front_end/common/TextDictionary.js b/third_party/devtools/front_end/common/TextDictionary.js index a220e3497046e..3c9a80f74b695 100644 --- a/third_party/devtools/front_end/common/TextDictionary.js +++ b/third_party/devtools/front_end/common/TextDictionary.js @@ -96,3 +96,9 @@ export class TextDictionary { this._index.clear(); } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +Common.TextDictionary = TextDictionary; diff --git a/third_party/devtools/front_end/common/Throttler.js b/third_party/devtools/front_end/common/Throttler.js index 8ca8e45d59304..0b3871541d0e1 100644 --- a/third_party/devtools/front_end/common/Throttler.js +++ b/third_party/devtools/front_end/common/Throttler.js @@ -114,3 +114,12 @@ export class Throttler { return window.performance.now(); } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +Common.Throttler = Throttler; + +/** @typedef {function(!Error=)} */ +Common.Throttler.FinishCallback; diff --git a/third_party/devtools/front_end/common/Trie.js b/third_party/devtools/front_end/common/Trie.js index 09dd9178c1c44..5afb1e097a750 100644 --- a/third_party/devtools/front_end/common/Trie.js +++ b/third_party/devtools/front_end/common/Trie.js @@ -141,3 +141,9 @@ export class Trie { this._freeNodes = []; } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +Common.Trie = Trie; diff --git a/third_party/devtools/front_end/common/UIString.js b/third_party/devtools/front_end/common/UIString.js index 90caed18684ed..f0d0baac5a34f 100644 --- a/third_party/devtools/front_end/common/UIString.js +++ b/third_party/devtools/front_end/common/UIString.js @@ -35,7 +35,7 @@ * @return {string} */ export function UIString(string, vararg) { - return String.vsprintf(localize(string), Array.prototype.slice.call(arguments, 1)); + return String.vsprintf(Common.localize(string), Array.prototype.slice.call(arguments, 1)); } /** @@ -123,3 +123,24 @@ export function ls(strings, vararg) { } return UIString(substitutionString, ...Array.prototype.slice.call(arguments, 1)); } + +/** + * @param {!Array|string} strings + * @param {...*} vararg + * @return {string} + */ +self.ls = ls; + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.UIStringFormat = UIStringFormat; + +Common.UIString = UIString; +Common.serializeUIString = serializeUIString; +Common.deserializeUIString = deserializeUIString; +Common.localize = localize; diff --git a/third_party/devtools/front_end/common/Worker.js b/third_party/devtools/front_end/common/Worker.js index 57bd86bc06c3b..50dd42d57bc1f 100644 --- a/third_party/devtools/front_end/common/Worker.js +++ b/third_party/devtools/front_end/common/Worker.js @@ -93,3 +93,12 @@ export class WorkerWrapper { this._workerPromise.then(worker => worker.onerror = listener); } } + +/* Legacy exported object */ +self.Common = self.Common || {}; +Common = Common || {}; + +/** + * @constructor + */ +Common.Worker = WorkerWrapper; diff --git a/third_party/devtools/front_end/common/common-legacy.js b/third_party/devtools/front_end/common/common-legacy.js index cda70e94c4368..daad79786bb60 100644 --- a/third_party/devtools/front_end/common/common-legacy.js +++ b/third_party/devtools/front_end/common/common-legacy.js @@ -2,273 +2,85 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import * as CommonModule from './common.js'; - -self.Common = self.Common || {}; -Common = Common || {}; - -/** - * @interface - */ -Common.App = CommonModule.App.App; - -/** - * @interface - */ -Common.AppProvider = CommonModule.AppProvider.AppProvider; - -/** - * @constructor - */ -Common.CharacterIdMap = CommonModule.CharacterIdMap.CharacterIdMap; - -/** - * @constructor - */ -Common.Color = CommonModule.Color.Color; - -Common.Color.Regex = CommonModule.Color.Regex; - -/** - * @enum {string} - */ -Common.Color.Format = CommonModule.Color.Format; -Common.Color.Nicknames = CommonModule.Color.Nicknames; -Common.Color.PageHighlight = CommonModule.Color.PageHighlight; - -/** - * @constructor - */ -Common.Color.Generator = CommonModule.Color.Generator; - -Common.console = new CommonModule.Console.Console(); - -/** - * @constructor - */ -Common.Console = CommonModule.Console.Console; - -/** @enum {symbol} */ -Common.Console.Events = CommonModule.Console.Events; - -/** - * @enum {string} - */ -Common.Console.MessageLevel = CommonModule.Console.MessageLevel; - -/** - * @constructor - */ -Common.Console.Message = CommonModule.Console.Message; - -/** - * @interface - */ -Common.ContentProvider = CommonModule.ContentProvider.ContentProvider; - -/** - * @constructor - */ -Common.ContentProvider.SearchMatch = CommonModule.ContentProvider.SearchMatch; -Common.ContentProvider.performSearchInContent = CommonModule.ContentProvider.performSearchInContent; -Common.ContentProvider.contentAsDataURL = CommonModule.ContentProvider.contentAsDataURL; - -/** - * @interface - */ -Common.EventTarget = CommonModule.EventTarget.EventTarget; - -/** - * @interface - */ -Common.JavaScriptMetadata = CommonModule.JavaScriptMetaData.JavaScriptMetaData; - -/** - * @interface - */ -Common.Linkifier = CommonModule.Linkifier.Linkifier; - -/** - * @constructor - */ -Common.Object = CommonModule.ObjectWrapper.ObjectWrapper; - -/** - * @constructor - */ -Common.ParsedURL = CommonModule.ParsedURL.ParsedURL; - -/** - * @interface - */ -Common.Progress = CommonModule.Progress.Progress; - -/** - * @constructor - */ -Common.CompositeProgress = CommonModule.Progress.CompositeProgress; - -/** - * @constructor - */ -Common.SubProgress = CommonModule.Progress.SubProgress; - -/** - * @constructor - */ -Common.ProgressProxy = CommonModule.Progress.ProgressProxy; - -/** - * @interface - */ -Common.QueryParamHandler = CommonModule.QueryParamHandler.QueryParamHandler; - -/** - * @enum {!ResourceType} - */ -Common.resourceTypes = CommonModule.ResourceType.resourceTypes; - -/** - * @enum {!ResourceCategory} - */ -Common.resourceCategories = CommonModule.ResourceType.resourceCategories; - -/** - * @constructor - */ -Common.ResourceCategory = CommonModule.ResourceType.ResourceCategory; - -/** - * @constructor - */ -Common.ResourceType = CommonModule.ResourceType.ResourceType; - -/** - * @interface - */ -Common.Revealer = CommonModule.Revealer.Revealer; -Common.Revealer.reveal = CommonModule.Revealer.reveal; -Common.Revealer.revealDestination = CommonModule.Revealer.revealDestination; - -/** - * @interface - */ -Common.Runnable = CommonModule.Runnable.Runnable; - -/** - * @constructor - */ -Common.Segment = CommonModule.SegmentedRange.Segment; - -/** - * @constructor - */ -Common.SegmentedRange = CommonModule.SegmentedRange.SegmentedRange; - -/** - * @constructor - */ -Common.Settings = CommonModule.Settings.Settings; - -/** - * @constructor - */ -Common.SettingsStorage = CommonModule.Settings.SettingsStorage; - -/** - * @constructor - */ -Common.Setting = CommonModule.Settings.Setting; - -/** - * @constructor - */ -Common.RegExpSetting = CommonModule.Settings.RegExpSetting; -Common.settingForTest = CommonModule.Settings.settingForTest; - -/** - * @constructor - */ -Common.VersionController = CommonModule.Settings.VersionController; -Common.moduleSetting = CommonModule.Settings.moduleSetting; - -/** - * @enum {symbol} - */ -Common.SettingStorageType = CommonModule.Settings.SettingStorageType; - -/** - * @constructor - */ -Common.StaticContentProvider = CommonModule.StaticContentProvider.StaticContentProvider; - -/** - * @interface - */ -Common.OutputStream = CommonModule.StringOutputStream.OutputStream; -Common.StringOutputStream = CommonModule.StringOutputStream.StringOutputStream; - -Common.TextDictionary = CommonModule.TextDictionary.TextDictionary; - -Common.Throttler = CommonModule.Throttler.Throttler; - -Common.Trie = CommonModule.Trie.Trie; - -/** - * @constructor - */ -Common.UIStringFormat = CommonModule.UIString.UIStringFormat; - -Common.UIString = CommonModule.UIString.UIString; -Common.serializeUIString = CommonModule.UIString.serializeUIString; -Common.deserializeUIString = CommonModule.UIString.deserializeUIString; -Common.localize = CommonModule.UIString.localize; - -/** - * @constructor - */ -Common.Worker = CommonModule.Worker.WorkerWrapper; - -/** - * @typedef {{ - * content: string, - * isEncoded: boolean, - * }|{ - * error: string, - * isEncoded: boolean, - * }} - */ -Common.DeferredContent; - -/** - * @typedef {!{eventTarget: !Common.EventTarget, eventType: (string|symbol), thisObject: (!Object|undefined), listener: function(!Common.Event)}} - */ -Common.EventTarget.EventDescriptor; - -/** - * @typedef {!{data: *}} - */ -Common.Event; - -/** @typedef {{tooltip: (string|undefined), preventKeyboardFocus: (boolean|undefined)}} */ -Common.Linkifier.Options; - -/** - * @typedef {!{thisObject: (!Object|undefined), listener: function(!Common.Event), disposed: (boolean|undefined)}} - */ -Common.Object._listenerCallbackTuple; - -/** - * @type {!Common.Settings} - */ -Common.settings; - -/** @typedef {function(!Error=)} */ -Common.Throttler.FinishCallback; - -/** - * @param {!Array|string} strings - * @param {...*} vararg - * @return {string} - */ -self.ls = CommonModule.UIString.ls; +import '../platform/platform.js'; + +import * as AppModule from './App.js'; +import * as AppProviderModule from './AppProvider.js'; +import * as CharacterIdMapModule from './CharacterIdMap.js'; +import * as ColorModule from './Color.js'; +import * as ConsoleModule from './Console.js'; +import * as ContentProviderModule from './ContentProvider.js'; +import * as EventTargetModule from './EventTarget.js'; +import * as JavaScriptMetaDataModule from './JavaScriptMetaData.js'; +import * as LinkifierModule from './Linkifier.js'; +import * as ObjectModule from './Object.js'; +import * as ParsedURLModule from './ParsedURL.js'; +import * as ProgressModule from './Progress.js'; +import * as QueryParamHandlerModule from './QueryParamHandler.js'; +import * as ResourceTypeModule from './ResourceType.js'; +import * as RevealerModule from './Revealer.js'; +import * as RunnableModule from './Runnable.js'; +import * as SegmentedRangeModule from './SegmentedRange.js'; +import * as SettingsModule from './Settings.js'; +import * as StaticContentProviderModule from './StaticContentProvider.js'; +import * as StringOutputStreamModule from './StringOutputStream.js'; +import * as TextDictionaryModule from './TextDictionary.js'; +import * as ThrottlerModule from './Throttler.js'; +import * as TrieModule from './Trie.js'; +import * as UIStringModule from './UIString.js'; +import * as WorkerModule from './Worker.js'; + +const App = Object.assign(AppModule.App, AppModule); +const AppProvider = Object.assign(AppProviderModule.AppProvider, AppProviderModule); +const CharacterIdMap = Object.assign(CharacterIdMapModule.CharacterIdMap, CharacterIdMapModule); +const Color = Object.assign(ColorModule.Color, ColorModule); +const Console = Object.assign(ConsoleModule.Console, ConsoleModule); +const ContentProvider = Object.assign(ContentProviderModule.ContentProvider, ContentProviderModule); +const EventTarget = Object.assign(EventTargetModule.EventTarget, EventTargetModule); +const JavaScriptMetaData = Object.assign(JavaScriptMetaDataModule.JavaScriptMetaData, JavaScriptMetaDataModule); +const Linkifier = Object.assign(LinkifierModule.Linkifier, LinkifierModule); +const ObjectWrapper = Object.assign(ObjectModule.ObjectWrapper, ObjectModule); +const ParsedURL = Object.assign(ParsedURLModule.ParsedURL, ParsedURLModule); +const Progress = Object.assign(ProgressModule.Progress, ProgressModule); +const QueryParamHandler = Object.assign(QueryParamHandlerModule.QueryParamHandler, QueryParamHandlerModule); +const ResourceType = Object.assign(ResourceTypeModule.ResourceType, ResourceTypeModule); +const Revealer = Object.assign(RevealerModule.Revealer, RevealerModule); +const Runnable = Object.assign(RunnableModule.Runnable, RunnableModule); +const SegmentedRange = Object.assign(SegmentedRangeModule.SegmentedRange, SegmentedRangeModule); +const Settings = Object.assign(SettingsModule.Settings, SettingsModule); +const StaticContentProvider = + Object.assign(StaticContentProviderModule.StaticContentProvider, StaticContentProviderModule); +const StringOutputStream = Object.assign(StringOutputStreamModule.StringOutputStream, StringOutputStreamModule); +const TextDictionary = Object.assign(TextDictionaryModule.TextDictionary, TextDictionaryModule); +const Throttler = Object.assign(ThrottlerModule.Throttler, ThrottlerModule); +const Trie = Object.assign(TrieModule.Trie, TrieModule); +const UIString = Object.assign(UIStringModule.UIString, UIStringModule); +const Worker = Object.assign(WorkerModule.WorkerWrapper, WorkerModule); + +export { + App, + AppProvider, + CharacterIdMap, + Color, + Console, + ContentProvider, + EventTarget, + JavaScriptMetaData, + Linkifier, + ObjectWrapper, + ParsedURL, + Progress, + QueryParamHandler, + ResourceType, + Revealer, + Runnable, + SegmentedRange, + Settings, + StaticContentProvider, + StringOutputStream, + TextDictionary, + Throttler, + Trie, + UIString, + Worker, +}; diff --git a/third_party/devtools/front_end/components/imagePreview.css b/third_party/devtools/front_end/components/imagePreview.css index e56c0140aab27..08020e5bdecd1 100644 --- a/third_party/devtools/front_end/components/imagePreview.css +++ b/third_party/devtools/front_end/components/imagePreview.css @@ -15,7 +15,7 @@ max-width: 100px; max-height: 100px; background-image: url(Images/checker.png); - user-select: text; + -webkit-user-select: text; -webkit-user-drag: auto; } diff --git a/third_party/devtools/front_end/console/ConsoleContextSelector.js b/third_party/devtools/front_end/console/ConsoleContextSelector.js index 43f6b3dd29c8a..ec2b4bf0338cd 100644 --- a/third_party/devtools/front_end/console/ConsoleContextSelector.js +++ b/third_party/devtools/front_end/console/ConsoleContextSelector.js @@ -250,7 +250,7 @@ export default class ConsoleContextSelector { return Common.UIString('Extension'); } if (!frame || !frame.parentFrame || frame.parentFrame.securityOrigin !== executionContext.origin) { - const url = Common.ParsedURL.fromString(executionContext.origin); + const url = executionContext.origin.asParsedURL(); if (url) { return url.domain(); } diff --git a/third_party/devtools/front_end/console/ConsolePrompt.js b/third_party/devtools/front_end/console/ConsolePrompt.js index bc7114d3671ae..836ca0587dd0c 100644 --- a/third_party/devtools/front_end/console/ConsolePrompt.js +++ b/third_party/devtools/front_end/console/ConsolePrompt.js @@ -310,10 +310,10 @@ export default class ConsolePrompt extends UI.Widget { if (currentExecutionContext) { const executionContext = currentExecutionContext; const message = SDK.consoleModel.addCommandMessage(executionContext, text); - const expression = ObjectUI.JavaScriptREPL.preprocessExpression(text); + const wrappedResult = await ObjectUI.JavaScriptREPL.preprocessExpression(text); SDK.consoleModel.evaluateCommandInConsole( - executionContext, message, expression, useCommandLineAPI, - /* awaitPromise */ false); + executionContext, message, wrappedResult.text, useCommandLineAPI, + /* awaitPromise */ wrappedResult.preprocessed); if (Console.ConsolePanel.instance().isShowing()) { Host.userMetrics.actionTaken(Host.UserMetrics.Action.CommandEvaluatedInConsolePanel); } diff --git a/third_party/devtools/front_end/console/ConsoleSidebar.js b/third_party/devtools/front_end/console/ConsoleSidebar.js index e126c23dffcdb..84b4e71adaf47 100644 --- a/third_party/devtools/front_end/console/ConsoleSidebar.js +++ b/third_party/devtools/front_end/console/ConsoleSidebar.js @@ -201,7 +201,7 @@ export class FilterTreeElement extends UI.TreeElement { } const filter = this._filter.clone(); - const parsedURL = urlValue ? Common.ParsedURL.fromString(urlValue) : null; + const parsedURL = urlValue ? urlValue.asParsedURL() : null; if (urlValue) { filter.name = parsedURL ? parsedURL.displayName : urlValue; } else { diff --git a/third_party/devtools/front_end/console/ConsoleView.js b/third_party/devtools/front_end/console/ConsoleView.js index 1fefa396fd742..455c32080a909 100644 --- a/third_party/devtools/front_end/console/ConsoleView.js +++ b/third_party/devtools/front_end/console/ConsoleView.js @@ -179,7 +179,6 @@ export default class ConsoleView extends UI.VBox { this._messagesElement.addEventListener('click', this._messagesClicked.bind(this), false); this._messagesElement.addEventListener('paste', this._messagesPasted.bind(this), true); this._messagesElement.addEventListener('clipboard-paste', this._messagesPasted.bind(this), true); - UI.ARIAUtils.markAsGroup(this._messagesElement); this._viewportThrottler = new Common.Throttler(50); this._pendingBatchResize = false; @@ -738,7 +737,7 @@ export default class ConsoleView extends UI.VBox { async _saveConsole() { const url = SDK.targetManager.mainTarget().inspectedURL(); - const parsedURL = Common.ParsedURL.fromString(url); + const parsedURL = url.asParsedURL(); const filename = String.sprintf('%s-%d.log', parsedURL ? parsedURL.host : 'console', Date.now()); const stream = new Bindings.FileOutputStream(); diff --git a/third_party/devtools/front_end/console/ConsoleViewMessage.js b/third_party/devtools/front_end/console/ConsoleViewMessage.js index 9e96df3276bdf..32fd9a8318085 100644 --- a/third_party/devtools/front_end/console/ConsoleViewMessage.js +++ b/third_party/devtools/front_end/console/ConsoleViewMessage.js @@ -376,12 +376,9 @@ export default class ConsoleViewMessage { this._selectableChildren.push({element: linkElement, forceSelect: () => linkElement.focus()}); } stackTraceElement.classList.add('hidden'); - UI.ARIAUtils.markAsTreeitem(this.element()); - UI.ARIAUtils.setExpanded(this.element(), false); this._expandTrace = expand => { icon.setIconType(expand ? 'smallicon-triangle-down' : 'smallicon-triangle-right'); stackTraceElement.classList.toggle('hidden', !expand); - UI.ARIAUtils.setExpanded(this.element(), expand); this._traceExpanded = expand; }; @@ -1558,7 +1555,7 @@ export default class ConsoleViewMessage { if (!url) { return null; } - const parsedURL = Common.ParsedURL.fromString(url); + const parsedURL = url.asParsedURL(); if (parsedURL) { return parsedURL.url; } diff --git a/third_party/devtools/front_end/console/consolePrompt.css b/third_party/devtools/front_end/console/consolePrompt.css index 9c4f82225f120..4f9f686ee7395 100644 --- a/third_party/devtools/front_end/console/consolePrompt.css +++ b/third_party/devtools/front_end/console/consolePrompt.css @@ -20,7 +20,7 @@ position: absolute; left: -13px; top: 5px; - user-select: none; + -webkit-user-select: none; } .console-eager-preview { diff --git a/third_party/devtools/front_end/console/consoleView.css b/third_party/devtools/front_end/console/consoleView.css index 06a59b930f977..a44d4895ec542 100644 --- a/third_party/devtools/front_end/console/consoleView.css +++ b/third_party/devtools/front_end/console/consoleView.css @@ -80,7 +80,7 @@ flex: 1 1; overflow-y: auto; word-wrap: break-word; - user-select: text; + -webkit-user-select: text; transform: translateZ(0); overflow-anchor: none; /* Chrome-specific scroll-anchoring opt-out */ } @@ -112,7 +112,7 @@ .console-timestamp { color: gray; - user-select: none; + -webkit-user-select: none; flex: none; margin-right: 5px; } @@ -121,7 +121,7 @@ position: absolute; left: -17px; top: 4px; - user-select: none; + -webkit-user-select: none; } .console-message-repeat-count { @@ -168,7 +168,7 @@ } .expand-group-icon { - user-select: none; + -webkit-user-select: none; flex: none; background-color: rgb(110, 110, 110); position: relative; diff --git a/third_party/devtools/front_end/cookie_table/CookiesTable.js b/third_party/devtools/front_end/cookie_table/CookiesTable.js index b66ea525d9eae..4cb6af448e491 100644 --- a/third_party/devtools/front_end/cookie_table/CookiesTable.js +++ b/third_party/devtools/front_end/cookie_table/CookiesTable.js @@ -513,7 +513,7 @@ export class CookiesTable extends UI.VBox { if (!domain) { return true; } - const parsedURL = Common.ParsedURL.fromString('http://' + domain); + const parsedURL = ('http://' + domain).asParsedURL(); return !!parsedURL && parsedURL.domain() === domain; } @@ -522,7 +522,7 @@ export class CookiesTable extends UI.VBox { * @returns {boolean} */ _isValidPath(path) { - const parsedURL = Common.ParsedURL.fromString('http://example.com' + path); + const parsedURL = ('http://example.com' + path).asParsedURL(); return !!parsedURL && parsedURL.path === path; } diff --git a/third_party/devtools/front_end/coverage/CoverageListView.js b/third_party/devtools/front_end/coverage/CoverageListView.js index d64cb7ebb17a6..595a0718f6ef4 100644 --- a/third_party/devtools/front_end/coverage/CoverageListView.js +++ b/third_party/devtools/front_end/coverage/CoverageListView.js @@ -139,9 +139,11 @@ export default class CoverageListView extends UI.VBox { if (!sourceCode) { return; } - - sourceCode = await sourceCode.getFormatted(); - + const content = (await sourceCode.requestContent()).content || ''; + if (TextUtils.isMinified(content)) { + const formatData = await Sources.sourceFormatter.format(sourceCode); + sourceCode = formatData.formattedSourceCode; + } if (this._dataGrid.selectedNode !== node) { return; } diff --git a/third_party/devtools/front_end/coverage/CoverageModel.js b/third_party/devtools/front_end/coverage/CoverageModel.js index 2ffb3345c9ac9..c36765b8ba21c 100644 --- a/third_party/devtools/front_end/coverage/CoverageModel.js +++ b/third_party/devtools/front_end/coverage/CoverageModel.js @@ -26,8 +26,7 @@ export const SuspensionState = { /** @enum {symbol} */ export const Events = { - CoverageUpdated: Symbol('CoverageUpdated'), - CoverageReset: Symbol('CoverageReset'), + CoverageUpdated: Symbol('CoverageUpdated') }; /** @type {number} */ @@ -108,7 +107,6 @@ export default class CoverageModel extends SDK.SDKModel { reset() { this._coverageByURL = new Map(); this._coverageByContentProvider = new Map(); - this.dispatchEventToListeners(CoverageModel.Events.CoverageReset); } /** @@ -227,15 +225,6 @@ export default class CoverageModel extends SDK.SDKModel { return Array.from(this._coverageByURL.values()); } - /** - * - * @param {string} url - * @return {?Coverage.URLCoverageInfo} - */ - getCoverageForUrl(url) { - return this._coverageByURL.get(url); - } - /** * @param {!Common.ContentProvider} contentProvider * @param {number} startOffset @@ -581,13 +570,11 @@ SDK.SDKModel.register(CoverageModel, SDK.Target.Capability.None, false); /** * @unrestricted */ -export class URLCoverageInfo extends Common.Object { +export class URLCoverageInfo { /** * @param {string} url */ constructor(url) { - super(); - this._url = url; /** @type {!Map} */ this._coverageInfoByLocation = new Map(); @@ -669,10 +656,6 @@ export class URLCoverageInfo extends Common.Object { _addToSizes(usedSize, size) { this._usedSize += usedSize; this._size += size; - - if (usedSize !== 0 || size !== 0) { - this.dispatchEventToListeners(Coverage.URLCoverageInfo.Events.SizesChanged); - } } /** @@ -709,11 +692,6 @@ export class URLCoverageInfo extends Common.Object { } } -/** @enum {symbol} */ -URLCoverageInfo.Events = { - SizesChanged: Symbol('SizesChanged') -}; - /** * @unrestricted */ diff --git a/third_party/devtools/front_end/coverage/module.json b/third_party/devtools/front_end/coverage/module.json index 096c3f0d93fad..05393ca3084e7 100644 --- a/third_party/devtools/front_end/coverage/module.json +++ b/third_party/devtools/front_end/coverage/module.json @@ -47,6 +47,7 @@ "sdk", "ui", "source_frame", + "sources", "data_grid" ], "scripts": [], diff --git a/third_party/devtools/front_end/data_grid/DataGrid.js b/third_party/devtools/front_end/data_grid/DataGrid.js index cf6acfe98099b..cd65e458dd81e 100644 --- a/third_party/devtools/front_end/data_grid/DataGrid.js +++ b/third_party/devtools/front_end/data_grid/DataGrid.js @@ -122,7 +122,7 @@ export default class DataGridImpl extends Common.Object { /** @type {!ResizeMethod} */ this._resizeMethod = ResizeMethod.Nearest; - /** @type {?function(!UI.ContextSubMenu)} */ + /** @type {?function(!UI.ContextMenu)} */ this._headerContextMenuCallback = null; /** @type {?function(!UI.ContextMenu, !NODE_TYPE)} */ this._rowContextMenuCallback = null; @@ -1145,7 +1145,7 @@ export default class DataGridImpl extends Common.Object { } /** - * @param {?function(!UI.ContextSubMenu)} callback + * @param {?function(!UI.ContextMenu)} callback */ setHeaderContextMenuCallback(callback) { this._headerContextMenuCallback = callback; @@ -1182,19 +1182,16 @@ export default class DataGridImpl extends Common.Object { } } - if (this._headerContextMenuCallback) { - if (target.isSelfOrDescendant(this._headerTableBody)) { + const isContextMenuKey = (event.button === 0); + if (!isContextMenuKey && target.isSelfOrDescendant(this._headerTableBody)) { + if (this._headerContextMenuCallback) { this._headerContextMenuCallback(contextMenu); - contextMenu.show(); - return; } else { - // Add header context menu to a subsection available from the body - const headerSubMenu = contextMenu.defaultSection().appendSubMenuItem(ls`Header Options`); - this._headerContextMenuCallback(headerSubMenu); + contextMenu.show(); } + return; } - const isContextMenuKey = (event.button === 0); const gridNode = isContextMenuKey ? this.selectedNode : this.dataGridNodeFromNode(target); if (isContextMenuKey && this.selectedNode) { const boundingRowRect = this.selectedNode.existingElement().getBoundingClientRect(); diff --git a/third_party/devtools/front_end/data_grid/dataGrid.css b/third_party/devtools/front_end/data_grid/dataGrid.css index 22f9b2f876a4f..26e5379e60b13 100644 --- a/third_party/devtools/front_end/data_grid/dataGrid.css +++ b/third_party/devtools/front_end/data_grid/dataGrid.css @@ -105,7 +105,7 @@ .data-grid td { vertical-align: top; - user-select: text; + -webkit-user-select: text; } .data-grid th { @@ -184,7 +184,7 @@ } .data-grid td.disclosure::before { - user-select: none; + -webkit-user-select: none; -webkit-mask-image: url(Images/treeoutlineTriangles.svg); -webkit-mask-position: 0 0; -webkit-mask-size: 32px 24px; diff --git a/third_party/devtools/front_end/data_grid/data_grid_strings.grdp b/third_party/devtools/front_end/data_grid/data_grid_strings.grdp index b52a809f3a9df..c99b4a867a3e0 100644 --- a/third_party/devtools/front_end/data_grid/data_grid_strings.grdp +++ b/third_party/devtools/front_end/data_grid/data_grid_strings.grdp @@ -3,9 +3,6 @@ Sort By - - Header Options - Show $1d5 after diff --git a/third_party/devtools/front_end/elements/ClassesPaneWidget.js b/third_party/devtools/front_end/elements/ClassesPaneWidget.js index 80719ab9c16fa..1be8862409f50 100644 --- a/third_party/devtools/front_end/elements/ClassesPaneWidget.js +++ b/third_party/devtools/front_end/elements/ClassesPaneWidget.js @@ -1,12 +1,10 @@ // Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ElementsPanel} from './ElementsPanel.js'; - /** * @unrestricted */ -export class ClassesPaneWidget extends UI.Widget { +export default class ClassesPaneWidget extends UI.Widget { constructor() { super(true); this.registerRequiredCSS('elements/classesPaneWidget.css'); @@ -263,7 +261,7 @@ export class ButtonProvider { } _clicked() { - ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null, this._button); + Elements.ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null, this._button); } /** @@ -348,3 +346,18 @@ export class ClassNamePrompt extends UI.TextPrompt { }); } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ClassesPaneWidget = ClassesPaneWidget; + +/** @constructor */ +Elements.ClassesPaneWidget.ButtonProvider = ButtonProvider; + +/** @constructor */ +Elements.ClassesPaneWidget.ClassNamePrompt = ClassNamePrompt; diff --git a/third_party/devtools/front_end/elements/ColorSwatchPopoverIcon.js b/third_party/devtools/front_end/elements/ColorSwatchPopoverIcon.js index 3a02041f75034..59799462c688a 100644 --- a/third_party/devtools/front_end/elements/ColorSwatchPopoverIcon.js +++ b/third_party/devtools/front_end/elements/ColorSwatchPopoverIcon.js @@ -1,14 +1,13 @@ // Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {StylePropertyTreeElement} from './StylePropertyTreeElement.js'; // eslint-disable-line no-unused-vars /** * @unrestricted */ export class BezierPopoverIcon { /** - * @param {!StylePropertyTreeElement} treeElement + * @param {!Elements.StylePropertyTreeElement} treeElement * @param {!InlineEditor.SwatchPopoverHelper} swatchPopoverHelper * @param {!InlineEditor.BezierSwatch} swatch */ @@ -93,9 +92,9 @@ export class BezierPopoverIcon { /** * @unrestricted */ -export class ColorSwatchPopoverIcon { +export default class ColorSwatchPopoverIcon { /** - * @param {!StylePropertyTreeElement} treeElement + * @param {!Elements.StylePropertyTreeElement} treeElement * @param {!InlineEditor.SwatchPopoverHelper} swatchPopoverHelper * @param {!InlineEditor.ColorSwatch} swatch */ @@ -143,7 +142,7 @@ export class ColorSwatchPopoverIcon { } /** - * @param {!StylePropertyTreeElement} treeElement + * @param {!Elements.StylePropertyTreeElement} treeElement * @return {?ColorSwatchPopoverIcon} */ static forTreeElement(treeElement) { @@ -252,7 +251,7 @@ ColorSwatchPopoverIcon._treeElementSymbol = Symbol('ColorSwatchPopoverIcon._tree */ export class ShadowSwatchPopoverHelper { /** - * @param {!StylePropertyTreeElement} treeElement + * @param {!Elements.StylePropertyTreeElement} treeElement * @param {!InlineEditor.SwatchPopoverHelper} swatchPopoverHelper * @param {!InlineEditor.CSSShadowSwatch} shadowSwatch */ @@ -272,7 +271,7 @@ export class ShadowSwatchPopoverHelper { } /** - * @param {!StylePropertyTreeElement} treeElement + * @param {!Elements.StylePropertyTreeElement} treeElement * @return {?ShadowSwatchPopoverHelper} */ static forTreeElement(treeElement) { @@ -345,3 +344,18 @@ export class ShadowSwatchPopoverHelper { } ShadowSwatchPopoverHelper._treeElementSymbol = Symbol('ShadowSwatchPopoverHelper._treeElementSymbol'); + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ColorSwatchPopoverIcon = ColorSwatchPopoverIcon; + +/** @constructor */ +Elements.BezierPopoverIcon = BezierPopoverIcon; + +/** @constructor */ +Elements.ShadowSwatchPopoverHelper = ShadowSwatchPopoverHelper; diff --git a/third_party/devtools/front_end/elements/ComputedStyleModel.js b/third_party/devtools/front_end/elements/ComputedStyleModel.js index 95f29a71c64f5..6804ccc4aa012 100644 --- a/third_party/devtools/front_end/elements/ComputedStyleModel.js +++ b/third_party/devtools/front_end/elements/ComputedStyleModel.js @@ -5,7 +5,7 @@ /** * @unrestricted */ -export class ComputedStyleModel extends Common.Object { +export default class ComputedStyleModel extends Common.Object { constructor() { super(); this._node = UI.context.flavor(SDK.DOMNode); @@ -158,3 +158,18 @@ export class ComputedStyle { this.computedStyle = computedStyle; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ComputedStyleModel = ComputedStyleModel; + +/** @enum {symbol} */ +Elements.ComputedStyleModel.Events = Events; + +/** @constructor */ +Elements.ComputedStyleModel.ComputedStyle = ComputedStyle; diff --git a/third_party/devtools/front_end/elements/ComputedStyleWidget.js b/third_party/devtools/front_end/elements/ComputedStyleWidget.js index 29dd513c0cdc2..ab6229ed46339 100644 --- a/third_party/devtools/front_end/elements/ComputedStyleWidget.js +++ b/third_party/devtools/front_end/elements/ComputedStyleWidget.js @@ -26,21 +26,19 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ComputedStyle, ComputedStyleModel, Events} from './ComputedStyleModel.js'; // eslint-disable-line no-unused-vars -import {PlatformFontsWidget} from './PlatformFontsWidget.js'; -import {StylePropertiesSection, StylesSidebarPane, StylesSidebarPropertyRenderer} from './StylesSidebarPane.js'; /** * @unrestricted */ -export class ComputedStyleWidget extends UI.ThrottledWidget { +export default class ComputedStyleWidget extends UI.ThrottledWidget { constructor() { super(true); this.registerRequiredCSS('elements/computedStyleSidebarPane.css'); this._alwaysShowComputedProperties = {'display': true, 'height': true, 'width': true}; - this._computedStyleModel = new ComputedStyleModel(); - this._computedStyleModel.addEventListener(Events.ComputedStyleChanged, this.update, this); + this._computedStyleModel = new Elements.ComputedStyleModel(); + this._computedStyleModel.addEventListener( + Elements.ComputedStyleModel.Events.ComputedStyleChanged, this.update, this); this._showInheritedComputedStylePropertiesSetting = Common.settings.createSetting('showInheritedComputedStyleProperties', false); @@ -49,7 +47,8 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { const hbox = this.contentElement.createChild('div', 'hbox styles-sidebar-pane-toolbar'); const filterContainerElement = hbox.createChild('div', 'styles-sidebar-pane-filter-box'); - const filterInput = StylesSidebarPane.createPropertyFilterElement(ls`Filter`, hbox, filterCallback.bind(this)); + const filterInput = + Elements.StylesSidebarPane.createPropertyFilterElement(ls`Filter`, hbox, filterCallback.bind(this)); UI.ARIAUtils.setAccessibleName(filterInput, Common.UIString('Filter Computed Styles')); filterContainerElement.appendChild(filterInput); this.setDefaultFocusedElement(filterInput); @@ -80,7 +79,7 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { this._updateFilter(regex); } - const fontsWidget = new PlatformFontsWidget(this._computedStyleModel); + const fontsWidget = new Elements.PlatformFontsWidget(this._computedStyleModel); fontsWidget.show(this.contentElement); } @@ -142,7 +141,7 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { } /** - * @param {?ComputedStyle} nodeStyle + * @param {?Elements.ComputedStyleModel.ComputedStyle} nodeStyle * @param {?SDK.CSSMatchedStyles} matchedStyles */ _innerRebuildUpdate(nodeStyle, matchedStyles) { @@ -188,8 +187,8 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { const propertyElement = createElement('div'); propertyElement.classList.add('computed-style-property'); propertyElement.classList.toggle('computed-style-property-inherited', inherited); - const renderer = - new StylesSidebarPropertyRenderer(null, nodeStyle.node, propertyName, /** @type {string} */ (propertyValue)); + const renderer = new Elements.StylesSidebarPropertyRenderer( + null, nodeStyle.node, propertyName, /** @type {string} */ (propertyValue)); renderer.setColorHandler(this._processColor.bind(this)); const propertyNameElement = renderer.renderName(); propertyNameElement.classList.add('property-name'); @@ -298,7 +297,7 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { } const renderer = - new StylesSidebarPropertyRenderer(null, node, property.name, /** @type {string} */ (property.value)); + new Elements.StylesSidebarPropertyRenderer(null, node, property.name, /** @type {string} */ (property.value)); renderer.setColorHandler(this._processColor.bind(this)); const valueElement = renderer.renderValue(); valueElement.classList.add('property-trace-value'); @@ -316,7 +315,8 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { if (rule) { const linkSpan = trace.createChild('span', 'trace-link'); - linkSpan.appendChild(StylePropertiesSection.createRuleOriginNode(matchedStyles, this._linkifier, rule)); + linkSpan.appendChild( + Elements.StylePropertiesSection.createRuleOriginNode(matchedStyles, this._linkifier, rule)); } const traceTreeElement = new UI.TreeElement(); @@ -342,7 +342,7 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { const header = rule.styleSheetId ? matchedStyles.cssModel().styleSheetHeaderForId(rule.styleSheetId) : null; if (header && !header.isAnonymousInlineStyleSheet()) { contextMenu.defaultSection().appendItem(ls`Navigate to selector source`, () => { - StylePropertiesSection.tryNavigateToRuleLocation(matchedStyles, rule); + Elements.StylePropertiesSection.tryNavigateToRuleLocation(matchedStyles, rule); }); } } @@ -405,6 +405,17 @@ export class ComputedStyleWidget extends UI.ThrottledWidget { } } -const _maxLinkLength = 30; -const _propertySymbol = Symbol('property'); -ComputedStyleWidget._propertySymbol = _propertySymbol; +export const _maxLinkLength = 30; +export const _propertySymbol = Symbol('property'); + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ComputedStyleWidget = ComputedStyleWidget; + +Elements.ComputedStyleWidget._maxLinkLength = _maxLinkLength; +Elements.ComputedStyleWidget._propertySymbol = _propertySymbol; diff --git a/third_party/devtools/front_end/elements/DOMLinkifier.js b/third_party/devtools/front_end/elements/DOMLinkifier.js index 752dfd6b09812..e1a140ad8717e 100644 --- a/third_party/devtools/front_end/elements/DOMLinkifier.js +++ b/third_party/devtools/front_end/elements/DOMLinkifier.js @@ -136,3 +136,18 @@ export class Linkifier { throw new Error('Can\'t linkify non-node'); } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +Elements.DOMLinkifier = {}; + +Elements.DOMLinkifier.decorateNodeLabel = decorateNodeLabel; +Elements.DOMLinkifier.linkifyNodeReference = linkifyNodeReference; +Elements.DOMLinkifier.linkifyDeferredNodeReference = linkifyDeferredNodeReference; + +/** @constructor */ +Elements.DOMLinkifier.Linkifier = Linkifier; diff --git a/third_party/devtools/front_end/elements/DOMPath.js b/third_party/devtools/front_end/elements/DOMPath.js index 15183e58a993b..ece4474b11963 100644 --- a/third_party/devtools/front_end/elements/DOMPath.js +++ b/third_party/devtools/front_end/elements/DOMPath.js @@ -347,3 +347,23 @@ export class Step { return this.value; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +Elements.DOMPath = {}; + +Elements.DOMPath.fullQualifiedSelector = fullQualifiedSelector; +Elements.DOMPath.cssPath = cssPath; +Elements.DOMPath.canGetJSPath = canGetJSPath; +Elements.DOMPath.jsPath = jsPath; +Elements.DOMPath._cssPathStep = _cssPathStep; +Elements.DOMPath.xPath = xPath; +Elements.DOMPath._xPathValue = _xPathValue; +Elements.DOMPath._xPathIndex = _xPathIndex; + +/** @constructor */ +Elements.DOMPath.Step = Step; diff --git a/third_party/devtools/front_end/elements/ElementStatePaneWidget.js b/third_party/devtools/front_end/elements/ElementStatePaneWidget.js index 6b510807bfbfc..62f7f1c5aaf6d 100644 --- a/third_party/devtools/front_end/elements/ElementStatePaneWidget.js +++ b/third_party/devtools/front_end/elements/ElementStatePaneWidget.js @@ -1,12 +1,11 @@ // Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ElementsPanel} from './ElementsPanel.js'; /** * @unrestricted */ -export class ElementStatePaneWidget extends UI.Widget { +export default class ElementStatePaneWidget extends UI.Widget { constructor() { super(true); this.registerRequiredCSS('elements/elementStatePaneWidget.css'); @@ -126,7 +125,7 @@ export class ButtonProvider { } _clicked() { - ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null, this._button); + Elements.ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null, this._button); } /** @@ -137,3 +136,15 @@ export class ButtonProvider { return this._button; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementStatePaneWidget = ElementStatePaneWidget; + +/** @constructor */ +Elements.ElementStatePaneWidget.ButtonProvider = ButtonProvider; diff --git a/third_party/devtools/front_end/elements/ElementsBreadcrumbs.js b/third_party/devtools/front_end/elements/ElementsBreadcrumbs.js index cc180be19227e..d73289d932069 100644 --- a/third_party/devtools/front_end/elements/ElementsBreadcrumbs.js +++ b/third_party/devtools/front_end/elements/ElementsBreadcrumbs.js @@ -1,12 +1,11 @@ // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {decorateNodeLabel} from './DOMLinkifier.js'; /** * @unrestricted */ -export class ElementsBreadcrumbs extends UI.HBox { +export default class ElementsBreadcrumbs extends UI.HBox { constructor() { super(true); this.registerRequiredCSS('elements/breadcrumbs.css'); @@ -171,7 +170,7 @@ export class ElementsBreadcrumbs extends UI.HBox { crumb.appendChild(nameElement); crumb.title = crumbTitle; } else { - decorateNodeLabel(current, crumb); + Elements.DOMLinkifier.decorateNodeLabel(current, crumb); } if (current === currentDOMNode) { @@ -473,3 +472,15 @@ export class ElementsBreadcrumbs extends UI.HBox { export const Events = { NodeSelected: Symbol('NodeSelected') }; + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsBreadcrumbs = ElementsBreadcrumbs; + +/** @enum {symbol} */ +Elements.ElementsBreadcrumbs.Events = Events; diff --git a/third_party/devtools/front_end/elements/ElementsPanel.js b/third_party/devtools/front_end/elements/ElementsPanel.js index c87f79f6c3ae7..9abfe9a8f633a 100644 --- a/third_party/devtools/front_end/elements/ElementsPanel.js +++ b/third_party/devtools/front_end/elements/ElementsPanel.js @@ -27,14 +27,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ComputedStyleWidget} from './ComputedStyleWidget.js'; -import {ElementsBreadcrumbs, Events} from './ElementsBreadcrumbs.js'; -import {ElementsTreeElement, HrefSymbol} from './ElementsTreeElement.js'; // eslint-disable-line no-unused-vars -import {ElementsTreeElementHighlighter} from './ElementsTreeElementHighlighter.js'; -import {ElementsTreeOutline} from './ElementsTreeOutline.js'; -import {MarkerDecorator} from './MarkerDecorator.js'; // eslint-disable-line no-unused-vars -import {MetricsSidebarPane} from './MetricsSidebarPane.js'; -import {StylesSidebarPane} from './StylesSidebarPane.js'; /** * @implements {UI.Searchable} @@ -42,7 +34,7 @@ import {StylesSidebarPane} from './StylesSidebarPane.js'; * @implements {UI.ViewLocationResolver} * @unrestricted */ -export class ElementsPanel extends UI.Panel { +export default class ElementsPanel extends UI.Panel { constructor() { super('elements'); this.registerRequiredCSS('elements/elementsPanel.css'); @@ -74,20 +66,20 @@ export class ElementsPanel extends UI.Panel { Common.moduleSetting('domWordWrap').addChangeListener(this._domWordWrapSettingChanged.bind(this)); crumbsContainer.id = 'elements-crumbs'; - this._breadcrumbs = new ElementsBreadcrumbs(); + this._breadcrumbs = new Elements.ElementsBreadcrumbs(); this._breadcrumbs.show(crumbsContainer); - this._breadcrumbs.addEventListener(Events.NodeSelected, this._crumbNodeSelected, this); + this._breadcrumbs.addEventListener(Elements.ElementsBreadcrumbs.Events.NodeSelected, this._crumbNodeSelected, this); - this._stylesWidget = new StylesSidebarPane(); - this._computedStyleWidget = new ComputedStyleWidget(); - this._metricsWidget = new MetricsSidebarPane(); + this._stylesWidget = new Elements.StylesSidebarPane(); + this._computedStyleWidget = new Elements.ComputedStyleWidget(); + this._metricsWidget = new Elements.MetricsSidebarPane(); Common.moduleSetting('sidebarPosition').addChangeListener(this._updateSidebarPosition.bind(this)); this._updateSidebarPosition(); - /** @type {!Array.} */ + /** @type {!Array.} */ this._treeOutlines = []; - /** @type {!Map} */ + /** @type {!Map} */ this._treeOutlineHeaders = new Map(); SDK.targetManager.observeModels(SDK.DOMModel, this); SDK.targetManager.addEventListener( @@ -145,14 +137,15 @@ export class ElementsPanel extends UI.Panel { */ modelAdded(domModel) { const parentModel = domModel.parentModel(); - let treeOutline = parentModel ? ElementsTreeOutline.forDOMModel(parentModel) : null; + let treeOutline = parentModel ? Elements.ElementsTreeOutline.forDOMModel(parentModel) : null; if (!treeOutline) { - treeOutline = new ElementsTreeOutline(true, true); + treeOutline = new Elements.ElementsTreeOutline(true, true); treeOutline.setWordWrap(Common.moduleSetting('domWordWrap').get()); - treeOutline.addEventListener(ElementsTreeOutline.Events.SelectedNodeChanged, this._selectedNodeChanged, this); treeOutline.addEventListener( - ElementsTreeOutline.Events.ElementsTreeUpdated, this._updateBreadcrumbIfNeeded, this); - new ElementsTreeElementHighlighter(treeOutline); + Elements.ElementsTreeOutline.Events.SelectedNodeChanged, this._selectedNodeChanged, this); + treeOutline.addEventListener( + Elements.ElementsTreeOutline.Events.ElementsTreeUpdated, this._updateBreadcrumbIfNeeded, this); + new Elements.ElementsTreeElementHighlighter(treeOutline); this._treeOutlines.push(treeOutline); if (domModel.target().parentTarget()) { this._treeOutlineHeaders.set(treeOutline, createElementWithClass('div', 'elements-tree-header')); @@ -172,7 +165,7 @@ export class ElementsPanel extends UI.Panel { * @param {!SDK.DOMModel} domModel */ modelRemoved(domModel) { - const treeOutline = ElementsTreeOutline.forDOMModel(domModel); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(domModel); treeOutline.unwireFromDOMModel(domModel); if (domModel.parentModel()) { return; @@ -194,7 +187,7 @@ export class ElementsPanel extends UI.Panel { if (!domModel) { return; } - const treeOutline = ElementsTreeOutline.forDOMModel(domModel); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(domModel); if (!treeOutline) { return; } @@ -265,7 +258,7 @@ export class ElementsPanel extends UI.Panel { if (domModel.parentModel()) { continue; } - const treeOutline = ElementsTreeOutline.forDOMModel(domModel); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(domModel); treeOutline.setVisible(true); if (!treeOutline.rootDOMNode) { @@ -316,7 +309,7 @@ export class ElementsPanel extends UI.Panel { const selectedNode = /** @type {?SDK.DOMNode} */ (event.data.node); const focus = /** @type {boolean} */ (event.data.focus); for (const treeOutline of this._treeOutlines) { - if (!selectedNode || ElementsTreeOutline.forDOMModel(selectedNode.domModel()) !== treeOutline) { + if (!selectedNode || Elements.ElementsTreeOutline.forDOMModel(selectedNode.domModel()) !== treeOutline) { treeOutline.selectDOMNode(null); } } @@ -407,7 +400,7 @@ export class ElementsPanel extends UI.Panel { if (!node || this._hasNonDefaultSelectedNode || this._pendingNodeReveal) { return; } - const treeOutline = ElementsTreeOutline.forDOMModel(node.domModel()); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(node.domModel()); if (!treeOutline) { return; } @@ -512,7 +505,7 @@ export class ElementsPanel extends UI.Panel { */ _getPopoverRequest(event) { let link = event.target; - while (link && !link[HrefSymbol]) { + while (link && !link[Elements.ElementsTreeElement.HrefSymbol]) { link = link.parentElementOrShadowHost(); } if (!link) { @@ -526,7 +519,8 @@ export class ElementsPanel extends UI.Panel { if (!node) { return false; } - const preview = await Components.ImagePreview.build(node.domModel().target(), link[HrefSymbol], true); + const preview = await Components.ImagePreview.build( + node.domModel().target(), link[Elements.ElementsTreeElement.HrefSymbol], true); if (preview) { popover.contentElement.appendChild(preview); } @@ -622,7 +616,7 @@ export class ElementsPanel extends UI.Panel { if (!searchResult.node) { return; } - const treeOutline = ElementsTreeOutline.forDOMModel(searchResult.node.domModel()); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(searchResult.node.domModel()); const treeElement = treeOutline.findTreeElement(searchResult.node); if (treeElement) { treeElement.hideSearchHighlights(); @@ -648,7 +642,7 @@ export class ElementsPanel extends UI.Panel { */ selectDOMNode(node, focus) { for (const treeOutline of this._treeOutlines) { - const outline = ElementsTreeOutline.forDOMModel(node.domModel()); + const outline = Elements.ElementsTreeOutline.forDOMModel(node.domModel()); if (outline === treeOutline) { treeOutline.selectDOMNode(node, focus); } else { @@ -675,22 +669,22 @@ export class ElementsPanel extends UI.Panel { /** * @param {?SDK.DOMNode} node - * @return {?ElementsTreeOutline} + * @return {?Elements.ElementsTreeOutline} */ _treeOutlineForNode(node) { if (!node) { return null; } - return ElementsTreeOutline.forDOMModel(node.domModel()); + return Elements.ElementsTreeOutline.forDOMModel(node.domModel()); } /** * @param {!SDK.DOMNode} node - * @return {?ElementsTreeElement} + * @return {?Elements.ElementsTreeElement} */ _treeElementForNode(node) { const treeOutline = this._treeOutlineForNode(node); - return /** @type {?ElementsTreeElement} */ (treeOutline.findTreeElement(node)); + return /** @type {?Elements.ElementsTreeElement} */ (treeOutline.findTreeElement(node)); } /** @@ -706,7 +700,6 @@ export class ElementsPanel extends UI.Panel { } /** - * @suppress {accessControls} * @param {!SDK.DOMNode} node * @param {boolean} focus * @param {boolean=} omitHighlight @@ -725,8 +718,8 @@ export class ElementsPanel extends UI.Panel { delete this._omitDefaultSelection; if (!this._notFirstInspectElement) { - ElementsPanel._firstInspectElementNodeNameForTest = node.nodeName(); - ElementsPanel._firstInspectElementCompletedForTest(); + Elements.ElementsPanel._firstInspectElementNodeNameForTest = node.nodeName(); + Elements.ElementsPanel._firstInspectElementCompletedForTest(); Host.InspectorFrontendHost.inspectElementCompleted(); } this._notFirstInspectElement = true; @@ -1065,7 +1058,7 @@ export class ElementsActionDelegate { if (!node) { return true; } - const treeOutline = ElementsTreeOutline.forDOMModel(node.domModel()); + const treeOutline = Elements.ElementsTreeOutline.forDOMModel(node.domModel()); if (!treeOutline) { return true; } @@ -1091,7 +1084,7 @@ export class ElementsActionDelegate { } /** - * @implements {MarkerDecorator} + * @implements {Elements.MarkerDecorator} * @unrestricted */ export class PseudoStateMarkerDecorator { @@ -1107,3 +1100,33 @@ export class PseudoStateMarkerDecorator { }; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsPanel = ElementsPanel; + +// Sniffed in tests. +Elements.ElementsPanel._firstInspectElementCompletedForTest = function() {}; + +/** @enum {symbol} */ +Elements.ElementsPanel._splitMode = _splitMode; + +/** @constructor */ +Elements.ElementsPanel.ContextMenuProvider = ContextMenuProvider; + +/** @constructor */ +Elements.ElementsPanel.DOMNodeRevealer = DOMNodeRevealer; + +/** @constructor */ +Elements.ElementsPanel.CSSPropertyRevealer = CSSPropertyRevealer; + +/** @constructor */ +Elements.ElementsActionDelegate = ElementsActionDelegate; + +/** @constructor */ +Elements.ElementsPanel.PseudoStateMarkerDecorator = PseudoStateMarkerDecorator; diff --git a/third_party/devtools/front_end/elements/ElementsSidebarPane.js b/third_party/devtools/front_end/elements/ElementsSidebarPane.js index 45df0e58df72d..3656ec6f0f862 100644 --- a/third_party/devtools/front_end/elements/ElementsSidebarPane.js +++ b/third_party/devtools/front_end/elements/ElementsSidebarPane.js @@ -1,20 +1,20 @@ // Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ComputedStyleModel, Events} from './ComputedStyleModel.js'; /** * @unrestricted */ -export class ElementsSidebarPane extends UI.VBox { +export default class ElementsSidebarPane extends UI.VBox { /** * @param {boolean=} delegatesFocus */ constructor(delegatesFocus) { super(true, delegatesFocus); this.element.classList.add('flex-none'); - this._computedStyleModel = new ComputedStyleModel(); - this._computedStyleModel.addEventListener(Events.ComputedStyleChanged, this.onCSSModelChanged, this); + this._computedStyleModel = new Elements.ComputedStyleModel(); + this._computedStyleModel.addEventListener( + Elements.ComputedStyleModel.Events.ComputedStyleChanged, this.onCSSModelChanged, this); this._updateThrottler = new Common.Throttler(100); this._updateWhenVisible = false; @@ -74,3 +74,12 @@ export class ElementsSidebarPane extends UI.VBox { onCSSModelChanged(event) { } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsSidebarPane = ElementsSidebarPane; diff --git a/third_party/devtools/front_end/elements/ElementsTreeElement.js b/third_party/devtools/front_end/elements/ElementsTreeElement.js index 85c05172b594e..71a50bdd6963f 100644 --- a/third_party/devtools/front_end/elements/ElementsTreeElement.js +++ b/third_party/devtools/front_end/elements/ElementsTreeElement.js @@ -27,14 +27,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {canGetJSPath, cssPath, jsPath, xPath} from './DOMPath.js'; -import {MappedCharToEntity, UpdateRecord} from './ElementsTreeOutline.js'; // eslint-disable-line no-unused-vars -import {MarkerDecorator} from './MarkerDecorator.js'; /** * @unrestricted */ -export class ElementsTreeElement extends UI.TreeElement { +export default class ElementsTreeElement extends UI.TreeElement { /** * @param {!SDK.DOMNode} node * @param {boolean=} elementCloseTag @@ -562,7 +559,8 @@ export class ElementsTreeElement extends UI.TreeElement { } if (this._node.nodeType() === Node.ELEMENT_NODE) { section.appendItem(Common.UIString('Copy selector'), this._copyCSSPath.bind(this)); - section.appendItem(Common.UIString('Copy JS path'), this._copyJSPath.bind(this), !canGetJSPath(this._node)); + section.appendItem( + Common.UIString('Copy JS path'), this._copyJSPath.bind(this), !Elements.DOMPath.canGetJSPath(this._node)); section.appendItem(ls`Copy styles`, this._copyStyles.bind(this)); } if (!isShadowRoot) { @@ -710,7 +708,7 @@ export class ElementsTreeElement extends UI.TreeElement { return ''; } - if (!Common.ParsedURL.fromString(attributeValueElement.textContent)) { + if (!attributeValueElement.textContent.asParsedURL()) { config.setPostKeydownFinishHandler(postKeyDownFinishHandler); } @@ -1123,7 +1121,7 @@ export class ElementsTreeElement extends UI.TreeElement { } /** - * @param {?UpdateRecord=} updateRecord + * @param {?Elements.ElementsTreeOutline.UpdateRecord=} updateRecord * @param {boolean=} onlySearchQueryChanged */ updateTitle(updateRecord, onlySearchQueryChanged) { @@ -1210,7 +1208,7 @@ export class ElementsTreeElement extends UI.TreeElement { const node = this._node; if (!this.treeOutline._decoratorExtensions) { - this.treeOutline._decoratorExtensions = self.runtime.extensions(MarkerDecorator); + this.treeOutline._decoratorExtensions = self.runtime.extensions(Elements.MarkerDecorator); } const markerToExtension = new Map(); @@ -1238,7 +1236,7 @@ export class ElementsTreeElement extends UI.TreeElement { /** * @param {!SDK.DOMNode} n - * @param {!MarkerDecorator} decorator + * @param {!Elements.MarkerDecorator} decorator */ function collectDecoration(n, decorator) { const decoration = decorator.decorate(n); @@ -1317,7 +1315,7 @@ export class ElementsTreeElement extends UI.TreeElement { * @param {!Node} parentElement * @param {string} name * @param {string} value - * @param {?UpdateRecord} updateRecord + * @param {?Elements.ElementsTreeOutline.UpdateRecord} updateRecord * @param {boolean=} forceValue * @param {!SDK.DOMNode=} node */ @@ -1483,7 +1481,7 @@ export class ElementsTreeElement extends UI.TreeElement { * @param {string} tagName * @param {boolean} isClosingTag * @param {boolean} isDistinctTreeElement - * @param {?UpdateRecord} updateRecord + * @param {?Elements.ElementsTreeOutline.UpdateRecord} updateRecord */ _buildTagDOM(parentElement, tagName, isClosingTag, isDistinctTreeElement, updateRecord) { const node = this._node; @@ -1526,7 +1524,7 @@ export class ElementsTreeElement extends UI.TreeElement { let result = ''; let lastIndexAfterEntity = 0; const entityRanges = []; - const charToEntity = MappedCharToEntity; + const charToEntity = Elements.ElementsTreeOutline.MappedCharToEntity; for (let i = 0, size = text.length; i < size; ++i) { const char = text.charAt(i); if (charToEntity[char]) { @@ -1544,7 +1542,7 @@ export class ElementsTreeElement extends UI.TreeElement { } /** - * @param {?UpdateRecord} updateRecord + * @param {?Elements.ElementsTreeOutline.UpdateRecord} updateRecord * @return {!DocumentFragment} result */ _nodeTitleInfo(updateRecord) { @@ -1738,19 +1736,19 @@ export class ElementsTreeElement extends UI.TreeElement { } _copyCSSPath() { - Host.InspectorFrontendHost.copyText(cssPath(this._node, true)); + Host.InspectorFrontendHost.copyText(Elements.DOMPath.cssPath(this._node, true)); } _copyJSPath() { - Host.InspectorFrontendHost.copyText(jsPath(this._node, true)); + Host.InspectorFrontendHost.copyText(Elements.DOMPath.jsPath(this._node, true)); } _copyXPath() { - Host.InspectorFrontendHost.copyText(xPath(this._node, true)); + Host.InspectorFrontendHost.copyText(Elements.DOMPath.xPath(this._node, true)); } _copyFullXPath() { - Host.InspectorFrontendHost.copyText(xPath(this._node, false)); + Host.InspectorFrontendHost.copyText(Elements.DOMPath.xPath(this._node, false)); } async _copyStyles() { @@ -1825,3 +1823,20 @@ export const ForbiddenClosingTagElements = new Set([ // These tags we do not allow editing their tag name. export const EditTagBlacklist = new Set(['html', 'head', 'body']); + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsTreeElement = ElementsTreeElement; + +Elements.ElementsTreeElement.HrefSymbol = HrefSymbol; +Elements.ElementsTreeElement.InitialChildrenLimit = InitialChildrenLimit; +Elements.ElementsTreeElement.ForbiddenClosingTagElements = ForbiddenClosingTagElements; +Elements.ElementsTreeElement.EditTagBlacklist = EditTagBlacklist; + +/** @typedef {{cancel: function(), commit: function(), resize: function(), editor:!UI.TextEditor}} */ +Elements.MultilineEditorController; diff --git a/third_party/devtools/front_end/elements/ElementsTreeElementHighlighter.js b/third_party/devtools/front_end/elements/ElementsTreeElementHighlighter.js index 9f920bb7d359a..c354e5788ec6a 100644 --- a/third_party/devtools/front_end/elements/ElementsTreeElementHighlighter.js +++ b/third_party/devtools/front_end/elements/ElementsTreeElementHighlighter.js @@ -1,21 +1,20 @@ // Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {ElementsTreeOutline} from './ElementsTreeOutline.js'; /** * @unrestricted */ -export class ElementsTreeElementHighlighter { +export default class ElementsTreeElementHighlighter { /** - * @param {!ElementsTreeOutline} treeOutline + * @param {!Elements.ElementsTreeOutline} treeOutline */ constructor(treeOutline) { this._throttler = new Common.Throttler(100); this._treeOutline = treeOutline; this._treeOutline.addEventListener(UI.TreeOutline.Events.ElementExpanded, this._clearState, this); this._treeOutline.addEventListener(UI.TreeOutline.Events.ElementCollapsed, this._clearState, this); - this._treeOutline.addEventListener(ElementsTreeOutline.Events.SelectedNodeChanged, this._clearState, this); + this._treeOutline.addEventListener(Elements.ElementsTreeOutline.Events.SelectedNodeChanged, this._clearState, this); SDK.targetManager.addModelListener( SDK.OverlayModel, SDK.OverlayModel.Events.HighlightNodeRequested, this._highlightNode, this); SDK.targetManager.addModelListener( @@ -34,7 +33,7 @@ export class ElementsTreeElementHighlighter { this._throttler.schedule(callback.bind(this)); this._pendingHighlightNode = - this._treeOutline === ElementsTreeOutline.forDOMModel(domNode.domModel()) ? domNode : null; + this._treeOutline === Elements.ElementsTreeOutline.forDOMModel(domNode.domModel()) ? domNode : null; /** * @this {ElementsTreeElementHighlighter} @@ -98,3 +97,12 @@ export class ElementsTreeElementHighlighter { delete this._pendingHighlightNode; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsTreeElementHighlighter = ElementsTreeElementHighlighter; diff --git a/third_party/devtools/front_end/elements/ElementsTreeOutline.js b/third_party/devtools/front_end/elements/ElementsTreeOutline.js index 38db84894ff29..dddb8ebf46886 100644 --- a/third_party/devtools/front_end/elements/ElementsTreeOutline.js +++ b/third_party/devtools/front_end/elements/ElementsTreeOutline.js @@ -27,13 +27,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {linkifyDeferredNodeReference} from './DOMLinkifier.js'; -import {ElementsTreeElement, HrefSymbol, InitialChildrenLimit} from './ElementsTreeElement.js'; /** * @unrestricted */ -export class ElementsTreeOutline extends UI.TreeOutline { +export default class ElementsTreeOutline extends UI.TreeOutline { /** * @param {boolean=} omitRootDOMNode * @param {boolean=} selectEnabled @@ -87,7 +85,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { /** @type {!Map} */ this._updateRecords = new Map(); - /** @type {!Set} */ + /** @type {!Set} */ this._treeElementsBeingUpdated = new Set(); this._showHTMLCommentsSetting = Common.moduleSetting('showHTMLComments'); @@ -435,7 +433,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { /** * @param {!SDK.DOMNode} node - * @return {?ElementsTreeElement} + * @return {?Elements.ElementsTreeElement} */ findTreeElement(node) { let treeElement = this._lookUpTreeElement(node); @@ -444,7 +442,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { treeElement = this._lookUpTreeElement(node.parentNode); } - return /** @type {?ElementsTreeElement} */ (treeElement); + return /** @type {?Elements.ElementsTreeElement} */ (treeElement); } /** @@ -493,7 +491,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { /** * @param {!SDK.DOMNode} node - * @return {?ElementsTreeElement} + * @return {?Elements.ElementsTreeElement} */ createTreeElementFor(node) { let treeElement = this.findTreeElement(node); @@ -573,7 +571,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { */ _getPopoverRequest(event) { let link = event.target; - while (link && !link[HrefSymbol]) { + while (link && !link[Elements.ElementsTreeElement.HrefSymbol]) { link = link.parentElementOrShadowHost(); } if (!link) { @@ -587,10 +585,10 @@ export class ElementsTreeOutline extends UI.TreeOutline { if (!listItem) { return false; } - const node = /** @type {!ElementsTreeElement} */ (listItem.treeElement).node(); + const node = /** @type {!Elements.ElementsTreeElement} */ (listItem.treeElement).node(); const precomputedFeatures = await Components.ImagePreview.loadDimensionsForNode(node); const preview = await Components.ImagePreview.build( - node.domModel().target(), link[HrefSymbol], true, {precomputedFeatures}); + node.domModel().target(), link[Elements.ElementsTreeElement.HrefSymbol], true, {precomputedFeatures}); if (preview) { popover.contentElement.appendChild(preview); } @@ -651,7 +649,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { * @param {boolean} showInfo */ _highlightTreeElement(element, showInfo) { - if (element instanceof ElementsTreeElement) { + if (element instanceof Elements.ElementsTreeElement) { element.node().domModel().overlayModel().highlightInOverlay({node: element.node()}, 'all', showInfo); return; } @@ -725,17 +723,17 @@ export class ElementsTreeOutline extends UI.TreeOutline { /** * @param {?UI.TreeElement} treeElement - * @return {?ElementsTreeElement} + * @return {?Elements.ElementsTreeElement} */ _validDragSourceOrTarget(treeElement) { if (!treeElement) { return null; } - if (!(treeElement instanceof ElementsTreeElement)) { + if (!(treeElement instanceof Elements.ElementsTreeElement)) { return null; } - const elementsTreeElement = /** @type {!ElementsTreeElement} */ (treeElement); + const elementsTreeElement = /** @type {!Elements.ElementsTreeElement} */ (treeElement); const node = elementsTreeElement.node(); if (!node.parentNode || node.parentNode.nodeType() !== Node.ELEMENT_NODE) { @@ -748,13 +746,13 @@ export class ElementsTreeOutline extends UI.TreeOutline { _ondrop(event) { event.preventDefault(); const treeElement = this._treeElementFromEvent(event); - if (treeElement instanceof ElementsTreeElement) { + if (treeElement instanceof Elements.ElementsTreeElement) { this._doMove(treeElement); } } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement */ _doMove(treeElement) { if (!this._treeElementBeingDragged) { @@ -795,13 +793,13 @@ export class ElementsTreeOutline extends UI.TreeOutline { _contextMenuEventFired(event) { const treeElement = this._treeElementFromEvent(event); - if (treeElement instanceof ElementsTreeElement) { + if (treeElement instanceof Elements.ElementsTreeElement) { this.showContextMenu(treeElement, event); } } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @param {!Event} event */ showContextMenu(treeElement, event) { @@ -933,7 +931,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { * @param {boolean} wasExpanded * @param {?Protocol.Error} error * @param {?SDK.DOMNode} newNode - * @return {?ElementsTreeElement} nodeId + * @return {?Elements.ElementsTreeElement} nodeId */ selectNodeAfterEdit(wasExpanded, error, newNode) { if (error) { @@ -1250,7 +1248,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @returns {!Promise} */ populateTreeElement(treeElement) { @@ -1270,10 +1268,10 @@ export class ElementsTreeOutline extends UI.TreeOutline { /** * @param {!SDK.DOMNode} node * @param {boolean=} closingTag - * @return {!ElementsTreeElement} + * @return {!Elements.ElementsTreeElement} */ _createElementTreeElement(node, closingTag) { - const treeElement = new ElementsTreeElement(node, closingTag); + const treeElement = new Elements.ElementsTreeElement(node, closingTag); treeElement.setExpandable(!closingTag && this._hasVisibleChildren(node)); if (node.nodeType() === Node.ELEMENT_NODE && node.parentNode && node.parentNode.nodeType() === Node.DOCUMENT_NODE && !node.parentNode.parentNode) { @@ -1284,7 +1282,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @param {!SDK.DOMNode} child * @return {?Elements.ElementsTreeElement} */ @@ -1301,7 +1299,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { if (index >= treeElement.expandedChildrenLimit()) { this.setExpandedChildrenLimit(treeElement, index + 1); } - return /** @type {!ElementsTreeElement} */ (treeElement.childAt(index)); + return /** @type {!Elements.ElementsTreeElement} */ (treeElement.childAt(index)); } /** @@ -1309,7 +1307,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { * @return {!Array.} visibleChildren */ _visibleChildren(node) { - let visibleChildren = ElementsTreeElement.visibleShadowRoots(node); + let visibleChildren = Elements.ElementsTreeElement.visibleShadowRoots(node); const contentDocument = node.contentDocument(); if (contentDocument) { @@ -1373,7 +1371,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { if (node.templateContent()) { return true; } - if (ElementsTreeElement.visibleShadowRoots(node).length) { + if (Elements.ElementsTreeElement.visibleShadowRoots(node).length) { return true; } if (node.hasPseudoElements()) { @@ -1382,11 +1380,11 @@ export class ElementsTreeOutline extends UI.TreeOutline { if (node.isInsertionPoint()) { return true; } - return !!node.childNodeCount() && !ElementsTreeElement.canShowInlineText(node); + return !!node.childNodeCount() && !Elements.ElementsTreeElement.canShowInlineText(node); } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement */ _createExpandAllButtonTreeElement(treeElement) { const button = UI.createTextButton('', handleLoadAllChildren.bind(this)); @@ -1404,13 +1402,15 @@ export class ElementsTreeOutline extends UI.TreeOutline { function handleLoadAllChildren(event) { const visibleChildCount = this._visibleChildren(treeElement.node()).length; this.setExpandedChildrenLimit( - treeElement, Math.max(visibleChildCount, treeElement.expandedChildrenLimit() + InitialChildrenLimit)); + treeElement, Math.max( + visibleChildCount, + treeElement.expandedChildrenLimit() + Elements.ElementsTreeElement.InitialChildrenLimit)); event.consume(); } } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @param {number} expandedChildrenLimit */ setExpandedChildrenLimit(treeElement, expandedChildrenLimit) { @@ -1425,7 +1425,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement */ _updateChildren(treeElement) { if (!treeElement.isExpandable()) { @@ -1443,7 +1443,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @param {!SDK.DOMNode} child * @param {number} index * @param {boolean=} closingTag @@ -1456,7 +1456,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement * @param {!Elements.ElementsTreeElement} child * @param {number} targetIndex */ @@ -1475,7 +1475,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { } /** - * @param {!ElementsTreeElement} treeElement + * @param {!Elements.ElementsTreeElement} treeElement */ _innerUpdateChildren(treeElement) { if (this._treeElementsBeingUpdated.has(treeElement)) { @@ -1493,12 +1493,12 @@ export class ElementsTreeOutline extends UI.TreeOutline { const existingTreeElements = new Map(); for (let i = treeElement.childCount() - 1; i >= 0; --i) { const existingTreeElement = treeElement.childAt(i); - if (!(existingTreeElement instanceof ElementsTreeElement)) { + if (!(existingTreeElement instanceof Elements.ElementsTreeElement)) { // Remove expand all button and shadow host toolbar. treeElement.removeChildAtIndex(i); continue; } - const elementsTreeElement = /** @type {!ElementsTreeElement} */ (existingTreeElement); + const elementsTreeElement = /** @type {!Elements.ElementsTreeElement} */ (existingTreeElement); const existingNode = elementsTreeElement.node(); if (visibleChildrenSet.has(existingNode)) { @@ -1519,7 +1519,7 @@ export class ElementsTreeOutline extends UI.TreeOutline { // No existing element found, insert a new element. const newElement = this.insertChildElement(treeElement, child, i); if (this._updateRecordForHighlight(node) && treeElement.expanded) { - ElementsTreeElement.animateOnDOMUpdate(newElement); + Elements.ElementsTreeElement.animateOnDOMUpdate(newElement); } // If a node was inserted in the middle of existing list dynamically we might need to increase the limit. if (treeElement.childCount() > treeElement.expandedChildrenLimit()) { @@ -1743,7 +1743,7 @@ export class ShortcutTreeElement extends UI.TreeElement { } title.textContent = '\u21AA ' + text; - const link = linkifyDeferredNodeReference(nodeShortcut.deferredNode); + const link = Elements.DOMLinkifier.linkifyDeferredNodeReference(nodeShortcut.deferredNode); this.listItemElement.createTextChild(' '); link.classList.add('elements-tree-shortcut-link'); link.textContent = Common.UIString('reveal'); @@ -1807,3 +1807,26 @@ export class ShortcutTreeElement extends UI.TreeElement { return true; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.ElementsTreeOutline = ElementsTreeOutline; + +Elements.ElementsTreeOutline.MappedCharToEntity = MappedCharToEntity; + +/** @constructor */ +Elements.ElementsTreeOutline.UpdateRecord = UpdateRecord; + +/** @constructor */ +Elements.ElementsTreeOutline.Renderer = Renderer; + +/** @constructor */ +Elements.ElementsTreeOutline.ShortcutTreeElement = ShortcutTreeElement; + +/** @typedef {{node: !SDK.DOMNode, isCut: boolean}} */ +Elements.ElementsTreeOutline.ClipboardData; diff --git a/third_party/devtools/front_end/elements/EventListenersWidget.js b/third_party/devtools/front_end/elements/EventListenersWidget.js index ed6416fa2bd11..0dcba06883086 100644 --- a/third_party/devtools/front_end/elements/EventListenersWidget.js +++ b/third_party/devtools/front_end/elements/EventListenersWidget.js @@ -31,7 +31,7 @@ * @implements {UI.ToolbarItem.ItemsProvider} * @unrestricted */ -export class EventListenersWidget extends UI.ThrottledWidget { +export default class EventListenersWidget extends UI.ThrottledWidget { constructor() { super(); this._toolbarItems = []; @@ -180,3 +180,15 @@ export const DispatchFilterBy = { }; export const _objectGroupName = 'event-listeners-panel'; + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.EventListenersWidget = EventListenersWidget; + +Elements.EventListenersWidget.DispatchFilterBy = DispatchFilterBy; +Elements.EventListenersWidget._objectGroupName = _objectGroupName; diff --git a/third_party/devtools/front_end/elements/InspectElementModeController.js b/third_party/devtools/front_end/elements/InspectElementModeController.js index 48495ea3dc869..2b57de06f740e 100644 --- a/third_party/devtools/front_end/elements/InspectElementModeController.js +++ b/third_party/devtools/front_end/elements/InspectElementModeController.js @@ -25,13 +25,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ElementsPanel} from './ElementsPanel.js'; /** * @implements {SDK.SDKModelObserver} * @unrestricted */ -export class InspectElementModeController { +export default class InspectElementModeController { /** * @suppressGlobalPropertiesCheck */ @@ -129,7 +128,7 @@ export class InspectElementModeController { * @param {!SDK.DOMNode} node */ async _inspectNode(node) { - ElementsPanel.instance().revealAndSelectNode(node, true, true); + Elements.ElementsPanel.instance().revealAndSelectNode(node, true, true); } _showDetailedInspectTooltipChanged() { @@ -164,3 +163,17 @@ export class ToggleSearchActionDelegate { /** @type {?InspectElementModeController} */ export const inspectElementModeController = Root.Runtime.queryParam('isSharedWorker') ? null : new InspectElementModeController(); + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.InspectElementModeController = InspectElementModeController; + +/** @constructor */ +Elements.InspectElementModeController.ToggleSearchActionDelegate = ToggleSearchActionDelegate; + +Elements.inspectElementModeController = inspectElementModeController; diff --git a/third_party/devtools/front_end/elements/MarkerDecorator.js b/third_party/devtools/front_end/elements/MarkerDecorator.js index 79f7d6b7fcfdb..8632af270ca06 100644 --- a/third_party/devtools/front_end/elements/MarkerDecorator.js +++ b/third_party/devtools/front_end/elements/MarkerDecorator.js @@ -5,7 +5,7 @@ /** * @interface */ -export class MarkerDecorator { +export default class MarkerDecorator { /** * @param {!SDK.DOMNode} node * @return {?{title: string, color: string}} @@ -35,3 +35,14 @@ export class GenericDecorator { return {title: this._title, color: this._color}; } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @interface */ +Elements.MarkerDecorator = MarkerDecorator; + +Elements.GenericDecorator = GenericDecorator; diff --git a/third_party/devtools/front_end/elements/MetricsSidebarPane.js b/third_party/devtools/front_end/elements/MetricsSidebarPane.js index d2813acf54142..0d2d18f75ac89 100644 --- a/third_party/devtools/front_end/elements/MetricsSidebarPane.js +++ b/third_party/devtools/front_end/elements/MetricsSidebarPane.js @@ -25,12 +25,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ElementsSidebarPane} from './ElementsSidebarPane.js'; /** * @unrestricted */ -export class MetricsSidebarPane extends ElementsSidebarPane { +export default class MetricsSidebarPane extends Elements.ElementsSidebarPane { constructor() { super(); this.registerRequiredCSS('elements/metricsSidebarPane.css'); @@ -480,3 +479,12 @@ export class MetricsSidebarPane extends ElementsSidebarPane { this._applyUserInput(element, userInput, previousContent, context, true); } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.MetricsSidebarPane = MetricsSidebarPane; diff --git a/third_party/devtools/front_end/elements/NodeStackTraceWidget.js b/third_party/devtools/front_end/elements/NodeStackTraceWidget.js index 3076fbe10405a..d220c380507a6 100644 --- a/third_party/devtools/front_end/elements/NodeStackTraceWidget.js +++ b/third_party/devtools/front_end/elements/NodeStackTraceWidget.js @@ -5,7 +5,7 @@ /** * @unrestricted */ -export class NodeStackTraceWidget extends UI.ThrottledWidget { +export default class NodeStackTraceWidget extends UI.ThrottledWidget { constructor() { super(true /* isWebComponent */); this.registerRequiredCSS('elements/nodeStackTraceWidget.css'); @@ -67,3 +67,14 @@ export class NodeStackTraceWidget extends UI.ThrottledWidget { * @type {number} */ export const MaxLengthForLinks = 40; + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.NodeStackTraceWidget = NodeStackTraceWidget; + +Elements.NodeStackTraceWidget.MaxLengthForLinks = MaxLengthForLinks; diff --git a/third_party/devtools/front_end/elements/PlatformFontsWidget.js b/third_party/devtools/front_end/elements/PlatformFontsWidget.js index b4a25a1cad427..d71d852343565 100644 --- a/third_party/devtools/front_end/elements/PlatformFontsWidget.js +++ b/third_party/devtools/front_end/elements/PlatformFontsWidget.js @@ -27,21 +27,20 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ComputedStyleModel, Events} from './ComputedStyleModel.js'; // eslint-disable-line no-unused-vars /** * @unrestricted */ -export class PlatformFontsWidget extends UI.ThrottledWidget { +export default class PlatformFontsWidget extends UI.ThrottledWidget { /** - * @param {!ComputedStyleModel} sharedModel + * @param {!Elements.ComputedStyleModel} sharedModel */ constructor(sharedModel) { super(true); this.registerRequiredCSS('elements/platformFontsWidget.css'); this._sharedModel = sharedModel; - this._sharedModel.addEventListener(Events.ComputedStyleChanged, this.update, this); + this._sharedModel.addEventListener(Elements.ComputedStyleModel.Events.ComputedStyleChanged, this.update, this); this._sectionTitle = createElementWithClass('div', 'title'); this.contentElement.classList.add('platform-fonts'); @@ -105,3 +104,12 @@ export class PlatformFontsWidget extends UI.ThrottledWidget { } } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.PlatformFontsWidget = PlatformFontsWidget; diff --git a/third_party/devtools/front_end/elements/PropertiesWidget.js b/third_party/devtools/front_end/elements/PropertiesWidget.js index 9b604c2001dd2..3d23c6618101f 100644 --- a/third_party/devtools/front_end/elements/PropertiesWidget.js +++ b/third_party/devtools/front_end/elements/PropertiesWidget.js @@ -30,7 +30,7 @@ /** * @unrestricted */ -export class PropertiesWidget extends UI.ThrottledWidget { +export default class PropertiesWidget extends UI.ThrottledWidget { constructor() { super(true /* isWebComponent */); this.registerRequiredCSS('elements/propertiesWidget.css'); @@ -170,3 +170,14 @@ export class PropertiesWidget extends UI.ThrottledWidget { } export const _objectGroupName = 'properties-sidebar-pane'; + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.PropertiesWidget = PropertiesWidget; + +Elements.PropertiesWidget._objectGroupName = _objectGroupName; diff --git a/third_party/devtools/front_end/elements/StylePropertyHighlighter.js b/third_party/devtools/front_end/elements/StylePropertyHighlighter.js index a2d72e295c864..a94cb017391ac 100644 --- a/third_party/devtools/front_end/elements/StylePropertyHighlighter.js +++ b/third_party/devtools/front_end/elements/StylePropertyHighlighter.js @@ -1,14 +1,13 @@ // Copyright (c) 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {StylesSidebarPane} from './StylesSidebarPane.js'; // eslint-disable-line no-unused-vars /** * @unrestricted */ -export class StylePropertyHighlighter { +export default class StylePropertyHighlighter { /** - * @param {!StylesSidebarPane} ssp + * @param {!Elements.StylesSidebarPane} ssp * @param {!SDK.CSSProperty} cssProperty */ constructor(ssp, cssProperty) { @@ -53,3 +52,12 @@ export class StylePropertyHighlighter { {duration: 2000, easing: 'cubic-bezier(0, 0, 0.2, 1)'}); } } + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.StylePropertyHighlighter = StylePropertyHighlighter; diff --git a/third_party/devtools/front_end/elements/StylePropertyTreeElement.js b/third_party/devtools/front_end/elements/StylePropertyTreeElement.js index 4e0c703df54ec..7c5736fc153be 100644 --- a/third_party/devtools/front_end/elements/StylePropertyTreeElement.js +++ b/third_party/devtools/front_end/elements/StylePropertyTreeElement.js @@ -1,12 +1,10 @@ // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {BezierPopoverIcon, ColorSwatchPopoverIcon, ShadowSwatchPopoverHelper} from './ColorSwatchPopoverIcon.js'; -import {CSSPropertyPrompt, StylePropertiesSection, StylesSidebarPane, StylesSidebarPropertyRenderer,} from './StylesSidebarPane.js'; // eslint-disable-line no-unused-vars -export class StylePropertyTreeElement extends UI.TreeElement { +export default class StylePropertyTreeElement extends UI.TreeElement { /** - * @param {!StylesSidebarPane} stylesPane + * @param {!Elements.StylesSidebarPane} stylesPane * @param {!SDK.CSSMatchedStyles} matchedStyles * @param {!SDK.CSSProperty} property * @param {boolean} isShorthand @@ -179,7 +177,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { */ async _addColorContrastInfo(swatch) { const swatchPopoverHelper = this._parentPane.swatchPopoverHelper(); - const swatchIcon = new ColorSwatchPopoverIcon(this, swatchPopoverHelper, swatch); + const swatchIcon = new Elements.ColorSwatchPopoverIcon(this, swatchPopoverHelper, swatch); if (this.property.name !== 'color' || !this._parentPane.cssModel() || !this.node()) { return; } @@ -206,7 +204,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { const swatchPopoverHelper = this._parentPane.swatchPopoverHelper(); const swatch = InlineEditor.BezierSwatch.create(); swatch.setBezierText(text); - new BezierPopoverIcon(this, swatchPopoverHelper, swatch); + new Elements.BezierPopoverIcon(this, swatchPopoverHelper, swatch); return swatch; } @@ -237,10 +235,10 @@ export class StylePropertyTreeElement extends UI.TreeElement { // TODO(flandy): editing the property value should use the original value with all spaces. const cssShadowSwatch = InlineEditor.CSSShadowSwatch.create(); cssShadowSwatch.setCSSShadow(shadows[i]); - new ShadowSwatchPopoverHelper(this, swatchPopoverHelper, cssShadowSwatch); + new Elements.ShadowSwatchPopoverHelper(this, swatchPopoverHelper, cssShadowSwatch); const colorSwatch = cssShadowSwatch.colorSwatch(); if (colorSwatch) { - new ColorSwatchPopoverIcon(this, swatchPopoverHelper, colorSwatch); + new Elements.ColorSwatchPopoverIcon(this, swatchPopoverHelper, colorSwatch); } container.appendChild(cssShadowSwatch); } @@ -279,7 +277,8 @@ export class StylePropertyTreeElement extends UI.TreeElement { this.listItemElement.classList.remove('implicit'); } - const hasIgnorableError = !this.property.parsedOk && StylesSidebarPane.ignoreErrorsForProperty(this.property); + const hasIgnorableError = + !this.property.parsedOk && Elements.StylesSidebarPane.ignoreErrorsForProperty(this.property); if (hasIgnorableError) { this.listItemElement.classList.add('has-ignorable-error'); } else { @@ -313,14 +312,14 @@ export class StylePropertyTreeElement extends UI.TreeElement { } /** - * @return {!StylesSidebarPane} + * @return {!Elements.StylesSidebarPane} */ parentPane() { return this._parentPane; } /** - * @return {?StylePropertiesSection} + * @return {?Elements.StylePropertiesSection} */ section() { return this.treeOutline && this.treeOutline.section; @@ -450,7 +449,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { } const propertyRenderer = - new StylesSidebarPropertyRenderer(this._style.parentRule, this.node(), this.name, this.value); + new Elements.StylesSidebarPropertyRenderer(this._style.parentRule, this.node(), this.name, this.value); if (this.property.parsedOk) { propertyRenderer.setVarHandler(this._processVar.bind(this)); propertyRenderer.setColorHandler(this._processColor.bind(this)); @@ -491,7 +490,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { // Add a separate exclamation mark IMG element with a tooltip. this.listItemElement.insertBefore( - StylesSidebarPane.createExclamationMark(this.property), this.listItemElement.firstChild); + Elements.StylesSidebarPane.createExclamationMark(this.property), this.listItemElement.firstChild); } if (!this.property.activeInStyle()) { this.listItemElement.classList.add('inactive'); @@ -717,7 +716,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { selectElement.parentElement.scrollIntoViewIfNeeded(false); } - this._prompt = new CSSPropertyPrompt(this, isEditingName); + this._prompt = new Elements.StylesSidebarPane.CSSPropertyPrompt(this, isEditingName); this._prompt.setAutocompletionTimeout(0); this._prompt.addEventListener( @@ -964,7 +963,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { const shouldCommitNewProperty = this._newProperty && (isPropertySplitPaste || moveToOther || (!moveDirection && !isEditingName) || (isEditingName && blankInput) || nameValueEntered); - const section = /** @type {!StylePropertiesSection} */ (this.section()); + const section = /** @type {!Elements.StylePropertiesSection} */ (this.section()); if (((userInput !== context.previousContent || isDirtyViaPaste) && !this._newProperty) || shouldCommitNewProperty) { let propertyText; if (nameValueEntered) { @@ -996,7 +995,7 @@ export class StylePropertyTreeElement extends UI.TreeElement { * The Callback to start editing the next/previous property/selector. * @param {boolean} alreadyNew * @param {boolean} valueChanged - * @param {!StylePropertiesSection} section + * @param {!Elements.StylePropertiesSection} section * @this {StylePropertyTreeElement} */ function moveToNextCallback(alreadyNew, valueChanged, section) { @@ -1174,3 +1173,26 @@ export class StylePropertyTreeElement extends UI.TreeElement { } export const ActiveSymbol = Symbol('ActiveSymbol'); + +/* Legacy exported object */ +self.Elements = self.Elements || {}; + +/* Legacy exported object */ +Elements = Elements || {}; + +/** @constructor */ +Elements.StylePropertyTreeElement = StylePropertyTreeElement; + +Elements.StylePropertyTreeElement.ActiveSymbol = ActiveSymbol; + +/** @typedef {{ + * expanded: boolean, + * hasChildren: boolean, + * isEditingName: boolean, + * originalProperty: (!SDK.CSSProperty|undefined), + * originalName: (string|undefined), + * originalValue: (string|undefined), + * previousContent: string + * }} + */ +Elements.StylePropertyTreeElement.Context; diff --git a/third_party/devtools/front_end/elements/StylesSidebarPane.js b/third_party/devtools/front_end/elements/StylesSidebarPane.js index 4be0fd887d5d8..215109bb29798 100644 --- a/third_party/devtools/front_end/elements/StylesSidebarPane.js +++ b/third_party/devtools/front_end/elements/StylesSidebarPane.js @@ -26,13 +26,8 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import {ColorSwatchPopoverIcon, ShadowSwatchPopoverHelper} from './ColorSwatchPopoverIcon.js'; -import {linkifyDeferredNodeReference} from './DOMLinkifier.js'; -import {ElementsSidebarPane} from './ElementsSidebarPane.js'; -import {StylePropertyHighlighter} from './StylePropertyHighlighter.js'; -import {StylePropertyTreeElement} from './StylePropertyTreeElement.js'; -export class StylesSidebarPane extends ElementsSidebarPane { +export default class StylesSidebarPane extends Elements.ElementsSidebarPane { constructor() { super(true /* delegatesFocus */); this.setMinimumSize(96, 26); @@ -62,7 +57,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { this._swatchPopoverHelper = new InlineEditor.SwatchPopoverHelper(); this._linkifier = new Components.Linkifier(_maxLinkLength, /* useLinkDecorator */ true); - /** @type {?StylePropertyHighlighter} */ + /** @type {?Elements.StylePropertyHighlighter} */ this._decorator = null; this._userOperation = false; this._isEditingStyle = false; @@ -203,7 +198,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { * @param {!SDK.CSSProperty} cssProperty */ revealProperty(cssProperty) { - this._decorator = new StylePropertyHighlighter(this, cssProperty); + this._decorator = new Elements.StylePropertyHighlighter(this, cssProperty); this._decorator.perform(); this.update(); } @@ -322,7 +317,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { /** * @param {!StylePropertiesSection} editedSection - * @param {!StylePropertyTreeElement=} editedTreeElement + * @param {!Elements.StylePropertyTreeElement=} editedTreeElement */ _refreshUpdate(editedSection, editedTreeElement) { if (editedTreeElement) { @@ -408,7 +403,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { /** * @param {boolean} editing - * @param {!StylePropertyTreeElement=} treeElement + * @param {!Elements.StylePropertyTreeElement=} treeElement */ setEditingStyle(editing, treeElement) { if (this._isEditingStyle === editing) { @@ -420,7 +415,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { } /** - * @param {?StylePropertyTreeElement} treeElement + * @param {?Elements.StylePropertyTreeElement} treeElement */ _setActiveProperty(treeElement) { if (this._isActivePropertyHighlighted) { @@ -502,7 +497,7 @@ export class StylesSidebarPane extends ElementsSidebarPane { * @return {!Promise} */ async _innerRebuildUpdate(matchedStyles) { - // ElementsSidebarPane's throttler schedules this method. Usually, + // Elements.ElementsSidebarPane's throttler schedules this method. Usually, // rebuild is suppressed while editing (see onCSSModelChanged()), but we need a // 'force' flag since the currently running throttler process cannot be canceled. if (this._needsForceUpdate) { @@ -1004,7 +999,7 @@ export class StylePropertiesSection { } if (header && header.ownerNode) { - const link = linkifyDeferredNodeReference(header.ownerNode, {preventKeyboardFocus: true}); + const link = Elements.DOMLinkifier.linkifyDeferredNodeReference(header.ownerNode, {preventKeyboardFocus: true}); link.textContent = '