From 7071456c6f28f003daac11d9e49b5a51937849cc Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Tue, 14 Dec 2021 05:47:35 +0000 Subject: [PATCH 01/45] Roll Open Screen from 040084e9d194 to 8620ec89411d (1 revision) https://chromium.googlesource.com/openscreen.git/+log/040084e9d194..8620ec89411d 2021-12-14 jophba@chromium.org [Infra] Update Mac OSX version If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/openscreen-chromium Please CC jophba@chromium.org on the revert to ensure that a human is aware of the problem. To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Bug: chromium:1085650,chromium:1269913 Tbr: jophba@chromium.org Change-Id: I12f8aaec93a67f8f58447e7764793e2e076d7555 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337090 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#951374} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 38e06b6a8d0c1d..9a0321dba58495 100644 --- a/DEPS +++ b/DEPS @@ -1404,7 +1404,7 @@ deps = { Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b52786888ddce9d6bc06b7825ba9bffc65924e0c', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '040084e9d194e43a59831fb0192b63929182aef4', + Var('chromium_git') + '/openscreen' + '@' + '8620ec89411da06662dfd920ba4e45b999269a77', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245', From a535562fad3f33f419c3e245953706f5a1a309fc Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 14 Dec 2021 05:48:14 +0000 Subject: [PATCH 02/45] Reland "Enable C++17 on linux (including in CFI builds)" This is a reland of c8494f8d3f327d82bf142b216a1a196a7df57191 The reland updates the lacros toolchain to https://reviews.llvm.org/D115015 so that CFI works with C++17 there too now. Original change's description: > Enable C++17 on linux (including in CFI builds) > > The prerequisite rolled in in > https://chromium-review.googlesource.com/c/chromium/src/+/3315436 > > With this, all platforms use -std=c++17. > Please don't rely on that yet though: > - it's not yet clear that this is going to stick > - we'll send out guidelines on how we'll adopt C++17 features > > Bug: 1273966,752720 > Cq-Include-Trybots: luci.chromium.try:linux_chromium_cfi_rel_ng > Change-Id: Icda9a95b159b8ae6fd1f74095fea7913343d210a > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3308459 > Commit-Queue: Nico Weber > Auto-Submit: Nico Weber > Reviewed-by: Hans Wennborg > Cr-Commit-Position: refs/heads/main@{#948345} Bug: 1273966,752720,1276731 Change-Id: Iaf61c355a0a183905c34d14dfb22d034b01807ea Cq-Include-Trybots: luci.chromium.try:linux_chromium_cfi_rel_ng Cq-Include-Trybots: luci.chrome.try:lacros-amd64-generic-chrome Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3316556 Auto-Submit: Nico Weber Reviewed-by: Yuke Liao Commit-Queue: Yuke Liao Commit-Queue: Nico Weber Cr-Commit-Position: refs/heads/main@{#951375} --- DEPS | 2 +- base/strings/string_util.cc | 6 +----- base/template_util.h | 6 ------ build/config/compiler/BUILD.gn | 5 +---- components/omnibox/browser/autocomplete_result.cc | 5 ----- 5 files changed, 3 insertions(+), 21 deletions(-) diff --git a/DEPS b/DEPS index 9a0321dba58495..515a46fa6dea83 100644 --- a/DEPS +++ b/DEPS @@ -195,7 +195,7 @@ vars = { # By default, do not check out versions of toolschains and sdks that are # specifically only needed by Lacros. 'checkout_lacros_sdk': False, - 'lacros_sdk_version': '14385.0.0', + 'lacros_sdk_version': '14395.0.0', # Generate location tag metadata to include in tests result data uploaded # to ResultDB. This isn't needed on some configs and the tool that generates diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc index 35ae9126e73b86..2bbe59b4e3d78c 100644 --- a/base/strings/string_util.cc +++ b/base/strings/string_util.cc @@ -21,7 +21,6 @@ #include #include -#include "base/cfi_buildflags.h" #include "base/check_op.h" #include "base/cxx17_backports.h" #include "base/no_destructor.h" @@ -35,12 +34,9 @@ namespace base { bool IsWprintfFormatPortable(const wchar_t* format) { // This snippet of code checks that we can build C++17 code. - // TODO(thakis): Enable this on all platforms, and then remove it again. -#if !defined(OS_LINUX) && !BUILDFLAG(CFI_ICALL_CHECK) && \ - !BUILDFLAG(CFI_CAST_CHECK) + // TODO(thakis): Remove this again in a bit. if constexpr (constexpr int i = 0; i > 0) { } -#endif for (const wchar_t* position = format; *position != '\0'; ++position) { if (*position == '%') { diff --git a/base/template_util.h b/base/template_util.h index 8305b5d63a302f..e298a92db2ae10 100644 --- a/base/template_util.h +++ b/base/template_util.h @@ -247,13 +247,7 @@ struct negation : bool_constant(B::value)> {}; // [1] https://en.cppreference.com/w/cpp/types/result_of // [2] https://wg21.link/meta.trans.other#lib:invoke_result template -#if __cplusplus >= 201703 -// result_of is deprecated in c++17, so don't use it there. using invoke_result = std::invoke_result; -#else -// TODO(thakis): Remove this branch once all platforms use C++17. -using invoke_result = std::result_of; -#endif // Implementation of C++17's std::invoke_result_t. // diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 8048ec5e84c96d..7a1825e1db1db4 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn @@ -586,10 +586,7 @@ config("compiler") { } cflags_c += [ "-std=${standard_prefix}11" ] - - # TODO(https://crbug.com/1273966): Use C++17 with is_cfi and is_linux once - # CFI works with -std=c++17. - if ((is_nacl && !is_nacl_saigo) || is_cfi || is_linux) { + if (is_nacl && !is_nacl_saigo) { # This is for the pnacl_newlib toolchain. It's only used to build # a few independent ppapi test files that don't pull in any other # dependencies. diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index fb50ad994791a5..1ff3b86d380c1b 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc @@ -974,12 +974,7 @@ void AutocompleteResult::MaybeCullTailSuggestions( // as a default match (and that's a non-tail suggestion). // 1) above. if (default_tail != matches->end() && default_non_tail == matches->end()) { - // TODO(thakis): Remove this branch once CFI builds use C++17. -#if __cplusplus >= 201703L base::EraseIf(*matches, std::not_fn(is_tail)); -#else - base::EraseIf(*matches, std::not1(is_tail)); -#endif return; } // 2) above. From 142baf526d45dca0170a7851fff10240ecea91be Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Tue, 14 Dec 2021 05:56:34 +0000 Subject: [PATCH 03/45] Roll ANGLE from 1fc9b7c6e0e4 to 42bd4fc29aea (1 revision) https://chromium.googlesource.com/angle/angle.git/+log/1fc9b7c6e0e4..42bd4fc29aea 2021-12-14 johncunningham@apple.com Metal: add ANGLE_metal_create_context_ownership_identity. If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/angle-chromium-autoroll Please CC timvp@google.com on the revert to ensure that a human is aware of the problem. To file a bug in ANGLE: https://bugs.chromium.org/p/angleproject/issues/entry To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel;luci.chromium.try:linux-swangle-try-x64;luci.chromium.try:win-swangle-try-x86 Bug: None Tbr: timvp@google.com Change-Id: I8d5b1cb66dfaf55672719f5ae1dd91cbf6d24ec8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337360 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#951376} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 515a46fa6dea83..9a886f2de6d43f 100644 --- a/DEPS +++ b/DEPS @@ -247,7 +247,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '1fc9b7c6e0e4be4e6ebdc1bd8ccca58fa0fdecfd', + 'angle_revision': '42bd4fc29aea6c0c1722d3604b0eadf7fb1e9aca', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. From e09bfa3d5c3078e3ae189fe9ce5bef6a4d70831c Mon Sep 17 00:00:00 2001 From: David Bertoni Date: Tue, 14 Dec 2021 05:58:20 +0000 Subject: [PATCH 04/45] [Extensions] Move ContentSettingsService to extensions/browser. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This also moves the CustomExtensionProvider. There are no functional changes in this CL. This CL is part of the effort to disentangle the chrome/browser/extension/api directories. Bug: 883570 Change-Id: I4e575f07d3052eb188aac405f8bc4d5b54c829e7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3315108 Reviewed-by: Istiaque Ahmed Reviewed-by: Martin Šrámek Commit-Queue: David Bertoni Cr-Commit-Position: refs/heads/main@{#951377} --- .../content_settings/host_content_settings_map_factory.cc | 4 ++-- chrome/browser/extensions/BUILD.gn | 4 ---- .../extensions/api/content_settings/content_settings_api.cc | 2 +- chrome/browser/extensions/api/preference/preference_api.cc | 2 +- .../api/preference/preference_api_prefs_unittest.cc | 2 +- .../extensions/browser_context_keyed_service_factories.cc | 2 -- .../browser/extensions/chrome_extensions_browser_client.cc | 2 +- extensions/browser/BUILD.gn | 4 ++++ .../content_settings_custom_extension_provider.cc | 2 +- .../content_settings_custom_extension_provider.h | 6 +++--- .../api/content_settings/content_settings_service.cc | 2 +- .../api/content_settings/content_settings_service.h | 6 +++--- .../browser/browser_context_keyed_service_factories.cc | 2 ++ 13 files changed, 20 insertions(+), 20 deletions(-) rename {chrome/browser/extensions => extensions/browser}/api/content_settings/content_settings_custom_extension_provider.cc (94%) rename {chrome/browser/extensions => extensions/browser}/api/content_settings/content_settings_custom_extension_provider.h (87%) rename {chrome/browser/extensions => extensions/browser}/api/content_settings/content_settings_service.cc (97%) rename {chrome/browser/extensions => extensions/browser}/api/content_settings/content_settings_service.h (91%) diff --git a/chrome/browser/content_settings/host_content_settings_map_factory.cc b/chrome/browser/content_settings/host_content_settings_map_factory.cc index 22fdc95ba9c3f3..d1aa648858a6ee 100644 --- a/chrome/browser/content_settings/host_content_settings_map_factory.cc +++ b/chrome/browser/content_settings/host_content_settings_map_factory.cc @@ -25,8 +25,8 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) #include "base/trace_event/trace_event.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" +#include "extensions/browser/api/content_settings/content_settings_custom_extension_provider.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #endif #if BUILDFLAG(ENABLE_SUPERVISED_USERS) diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 57c18bc22b3d7a..e6dccdf5ca075a 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn @@ -80,10 +80,6 @@ static_library("extensions") { "api/commands/commands.h", "api/content_settings/content_settings_api.cc", "api/content_settings/content_settings_api.h", - "api/content_settings/content_settings_custom_extension_provider.cc", - "api/content_settings/content_settings_custom_extension_provider.h", - "api/content_settings/content_settings_service.cc", - "api/content_settings/content_settings_service.h", "api/context_menus/context_menus_api.cc", "api/context_menus/context_menus_api.h", "api/context_menus/context_menus_api_helpers.cc", diff --git a/chrome/browser/extensions/api/content_settings/content_settings_api.cc b/chrome/browser/extensions/api/content_settings/content_settings_api.cc index a8259961a8234e..6043813a59be67 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_api.cc +++ b/chrome/browser/extensions/api/content_settings/content_settings_api.cc @@ -17,7 +17,6 @@ #include "base/values.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" #include "chrome/browser/extensions/api/preference/preference_api_constants.h" #include "chrome/browser/extensions/api/preference/preference_helpers.h" #include "chrome/browser/profiles/profile.h" @@ -33,6 +32,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/common/webplugininfo.h" #include "extensions/browser/api/content_settings/content_settings_helpers.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "extensions/browser/api/content_settings/content_settings_store.h" #include "extensions/browser/extension_prefs_scope.h" #include "extensions/browser/extension_util.h" diff --git a/chrome/browser/extensions/api/preference/preference_api.cc b/chrome/browser/extensions/api/preference/preference_api.cc index c8b55db1c95779..9d4dcd9e6a751a 100644 --- a/chrome/browser/extensions/api/preference/preference_api.cc +++ b/chrome/browser/extensions/api/preference/preference_api.cc @@ -18,7 +18,6 @@ #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" #include "chrome/browser/extensions/api/preference/preference_api_constants.h" #include "chrome/browser/extensions/api/preference/preference_helpers.h" #include "chrome/browser/extensions/api/proxy/proxy_api.h" @@ -39,6 +38,7 @@ #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/spellcheck/browser/pref_names.h" #include "components/translate/core/browser/translate_pref_names.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "extensions/browser/extension_pref_value_map.h" #include "extensions/browser/extension_pref_value_map_factory.h" #include "extensions/browser/extension_prefs.h" diff --git a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc index 195944828860f2..e6eaaca30553f7 100644 --- a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc +++ b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc @@ -9,12 +9,12 @@ #include "base/memory/raw_ptr.h" #include "base/values.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" #include "chrome/browser/extensions/api/preference/preference_api.h" #include "chrome/browser/extensions/extension_prefs_unittest.h" #include "chrome/test/base/testing_profile.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/mock_pref_change_callback.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "extensions/browser/extension_prefs.h" #include "extensions/common/extension.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/chrome/browser/extensions/browser_context_keyed_service_factories.cc b/chrome/browser/extensions/browser_context_keyed_service_factories.cc index aa391e2c1f2da2..26eb87265034d1 100644 --- a/chrome/browser/extensions/browser_context_keyed_service_factories.cc +++ b/chrome/browser/extensions/browser_context_keyed_service_factories.cc @@ -13,7 +13,6 @@ #include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h" #include "chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h" #include "chrome/browser/extensions/api/commands/command_service.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" #include "chrome/browser/extensions/api/cookies/cookies_api.h" #include "chrome/browser/extensions/api/developer_private/developer_private_api.h" #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" @@ -82,7 +81,6 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() { extensions::BookmarkManagerPrivateAPI::GetFactoryInstance(); extensions::BrailleDisplayPrivateAPI::GetFactoryInstance(); extensions::CommandService::GetFactoryInstance(); - extensions::ContentSettingsService::GetFactoryInstance(); extensions::CookiesAPI::GetFactoryInstance(); extensions::ChromeExtensionCookiesFactory::GetInstance(); extensions::DeveloperPrivateAPI::GetFactoryInstance(); diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index 603373b7ddf5db..b71b8b6f89e9d0 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc @@ -18,7 +18,6 @@ #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/extensions/activity_log/activity_log.h" #include "chrome/browser/extensions/api/chrome_extensions_api_client.h" -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" #include "chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.h" #include "chrome/browser/extensions/api/tabs/tabs_util.h" #include "chrome/browser/extensions/chrome_component_extension_resource_manager.h" @@ -59,6 +58,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_switches.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "extensions/browser/core_extensions_browser_api_provider.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_system.h" diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index 25b1a08a92b9c5..520b8564f13021 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn @@ -58,8 +58,12 @@ source_set("browser_sources") { "api/api_resource.cc", "api/api_resource.h", "api/api_resource_manager.h", + "api/content_settings/content_settings_custom_extension_provider.cc", + "api/content_settings/content_settings_custom_extension_provider.h", "api/content_settings/content_settings_helpers.cc", "api/content_settings/content_settings_helpers.h", + "api/content_settings/content_settings_service.cc", + "api/content_settings/content_settings_service.h", "api/content_settings/content_settings_store.cc", "api/content_settings/content_settings_store.h", "api/declarative/declarative_api.cc", diff --git a/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc b/extensions/browser/api/content_settings/content_settings_custom_extension_provider.cc similarity index 94% rename from chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc rename to extensions/browser/api/content_settings/content_settings_custom_extension_provider.cc index f68ca52037d4b7..88bedc6cbffaa0 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.cc +++ b/extensions/browser/api/content_settings/content_settings_custom_extension_provider.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h" +#include "extensions/browser/api/content_settings/content_settings_custom_extension_provider.h" #include diff --git a/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h b/extensions/browser/api/content_settings/content_settings_custom_extension_provider.h similarity index 87% rename from chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h rename to extensions/browser/api/content_settings/content_settings_custom_extension_provider.h index 7cdfcf2583a0a7..81b4694702ef96 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_custom_extension_provider.h +++ b/extensions/browser/api/content_settings/content_settings_custom_extension_provider.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ -#define CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ +#ifndef EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ +#define EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ #include @@ -58,4 +58,4 @@ class CustomExtensionProvider : public ObservableProvider, } // namespace content_settings -#endif // CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ +#endif // EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_CUSTOM_EXTENSION_PROVIDER_H_ diff --git a/chrome/browser/extensions/api/content_settings/content_settings_service.cc b/extensions/browser/api/content_settings/content_settings_service.cc similarity index 97% rename from chrome/browser/extensions/api/content_settings/content_settings_service.cc rename to extensions/browser/api/content_settings/content_settings_service.cc index 5b497ee8b4856f..e99b3628da94ea 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_service.cc +++ b/extensions/browser/api/content_settings/content_settings_service.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/api/content_settings/content_settings_service.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "base/lazy_instance.h" #include "base/memory/scoped_refptr.h" diff --git a/chrome/browser/extensions/api/content_settings/content_settings_service.h b/extensions/browser/api/content_settings/content_settings_service.h similarity index 91% rename from chrome/browser/extensions/api/content_settings/content_settings_service.h rename to extensions/browser/api/content_settings/content_settings_service.h index 47f886e33752b3..afd99dd0eb2672 100644 --- a/chrome/browser/extensions/api/content_settings/content_settings_service.h +++ b/extensions/browser/api/content_settings/content_settings_service.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ -#define CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ +#ifndef EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ +#define EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ #include "base/memory/ref_counted.h" #include "base/scoped_observation.h" @@ -68,4 +68,4 @@ class ContentSettingsService : public BrowserContextKeyedAPI, } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ +#endif // EXTENSIONS_BROWSER_API_CONTENT_SETTINGS_CONTENT_SETTINGS_SERVICE_H_ diff --git a/extensions/browser/browser_context_keyed_service_factories.cc b/extensions/browser/browser_context_keyed_service_factories.cc index a40cf06cfc9dcd..cd319b2e3613fa 100644 --- a/extensions/browser/browser_context_keyed_service_factories.cc +++ b/extensions/browser/browser_context_keyed_service_factories.cc @@ -12,6 +12,7 @@ #include "extensions/browser/api/bluetooth/bluetooth_api.h" #include "extensions/browser/api/bluetooth/bluetooth_private_api.h" #include "extensions/browser/api/bluetooth_socket/bluetooth_socket_event_dispatcher.h" +#include "extensions/browser/api/content_settings/content_settings_service.h" #include "extensions/browser/api/declarative_net_request/rules_monitor_service.h" #include "extensions/browser/api/feedback_private/feedback_private_api.h" #include "extensions/browser/api/hid/hid_device_manager.h" @@ -76,6 +77,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() { api::TCPServerSocketEventDispatcher::GetFactoryInstance(); api::TCPSocketEventDispatcher::GetFactoryInstance(); api::UDPSocketEventDispatcher::GetFactoryInstance(); + ContentSettingsService::GetFactoryInstance(); declarative_net_request::RulesMonitorService::GetFactoryInstance(); EnsureExtensionURLLoaderFactoryShutdownNotifierFactoryBuilt(); EventRouterFactory::GetInstance(); From 637713d5ab98c864488a56e0fc097f6661279bcc Mon Sep 17 00:00:00 2001 From: Shuhai Peng Date: Tue, 14 Dec 2021 05:59:18 +0000 Subject: [PATCH 05/45] Optimization: Parse the stream to assign temporalID. On Windows, we should parse the temporal SVC stream to get temproalID, instead of relying on an external state machine. This CL aims to increase code robustness. Bug: 1203743 Change-Id: I6925a71f4a4b3d27db2d14082918446cdf1114a7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3314901 Reviewed-by: Eugene Zemtsov Commit-Queue: Eugene Zemtsov Cr-Commit-Position: refs/heads/main@{#951378} --- ...foundation_video_encode_accelerator_win.cc | 52 +++++++++++++++++-- ..._foundation_video_encode_accelerator_win.h | 13 ++++- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index bb7c7f13d26bc4..d3edbddac44a2b 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc @@ -52,6 +52,7 @@ const size_t kNumInputBuffers = 3; // Media Foundation uses 100 nanosecond units for time, see // https://msdn.microsoft.com/en-us/library/windows/desktop/ms697282(v=vs.85).aspx. const size_t kOneMicrosecondInMFSampleTimeUnits = 10; +const size_t kPrefixNALLocatedBytePos = 3; constexpr const wchar_t* const kMediaFoundationVideoEncoderDLLs[] = { L"mf.dll", @@ -1157,7 +1158,8 @@ HRESULT MediaFoundationVideoEncodeAccelerator::PopulateInputSampleBufferGpu( return S_OK; } -int MediaFoundationVideoEncodeAccelerator::AssignTemporalId(bool keyframe) { +int MediaFoundationVideoEncodeAccelerator::AssignTemporalIdBySvcSpec( + bool keyframe) { int result = 0; if (keyframe) @@ -1183,6 +1185,46 @@ int MediaFoundationVideoEncodeAccelerator::AssignTemporalId(bool keyframe) { return result; } +bool MediaFoundationVideoEncodeAccelerator::AssignTemporalId( + Microsoft::WRL::ComPtr output_buffer, + size_t size, + int* temporal_id, + bool keyframe) { + *temporal_id = 0; + + // H264, VP9 and AV1 have hardware SVC support on windows. H264 can parse the + // information from Nalu(7.3.1 NAL unit syntax); AV1 can parse the OBU(5.3.3. + // OBU extension header syntax), it's future work. Unfortunately, VP9 spec + // doesn't provide the temporal information, we can only assign it based on + // spec. + if (codec_ == VideoCodec::kH264) { + // See the 7.3.1 NAL unit syntax in H264 spec. + // https://www.itu.int/rec/T-REC-H.264 + MediaBufferScopedPointer scoped_buffer(output_buffer.Get()); + h264_parser_.SetStream(scoped_buffer.get(), size); + H264NALU nalu; + H264Parser::Result result; + while ((result = h264_parser_.AdvanceToNextNALU(&nalu)) != + H264Parser::kEOStream) { + // Fallback to software when the stream is invalid. + if (result == H264Parser::Result::kInvalidStream) + return false; + + if (nalu.nal_unit_type == H264NALU::kPrefix) { + *temporal_id = (nalu.data[kPrefixNALLocatedBytePos] & 0b1110'0000) >> 5; + return true; + } + } + } + + // If we run to this point, it means that we have not assigned temporalId + // through parsing stream, we always return true once we parse out temporalId. + // Now we will assign the ID based on spec. + *temporal_id = AssignTemporalIdBySvcSpec(keyframe); + + return true; +} + void MediaFoundationVideoEncodeAccelerator::ProcessOutput() { DVLOG(3) << __func__; DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); @@ -1229,8 +1271,12 @@ void MediaFoundationVideoEncodeAccelerator::ProcessOutput() { const bool keyframe = MFGetAttributeUINT32( output_data_buffer.pSample, MFSampleExtension_CleanPoint, false); - - int temporal_id = AssignTemporalId(keyframe); + int temporal_id = 0; + if (!AssignTemporalId(output_buffer, size, &temporal_id, keyframe)) { + DLOG(ERROR) << "Parse temporalId failed."; + NotifyError(media::VideoEncodeAccelerator::Error::kPlatformFailureError); + return; + } DVLOG(3) << "Encoded data with size:" << size << " keyframe " << keyframe; // If no bit stream buffer presents, queue the output first. diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h index a2fa0357e6cf1a..803c189e58238c 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h @@ -111,7 +111,15 @@ class MEDIA_GPU_EXPORT MediaFoundationVideoEncodeAccelerator HRESULT PopulateInputSampleBuffer(scoped_refptr frame); HRESULT PopulateInputSampleBufferGpu(scoped_refptr frame); - int AssignTemporalId(bool keyframe); + // Assign TemporalID by bitstream or external state machine(based on SVC + // Spec). + bool AssignTemporalId(Microsoft::WRL::ComPtr output_buffer, + size_t size, + int* temporal_id, + bool keyframe); + + int AssignTemporalIdBySvcSpec(bool keyframe); + bool temporalScalableCoding() { return num_temporal_layers_ > 1; } // Checks for and copies encoded output on |encoder_thread_|. @@ -160,6 +168,9 @@ class MEDIA_GPU_EXPORT MediaFoundationVideoEncodeAccelerator // according to the corresponding layer pattern. Reset for every key frame. uint32_t outputs_since_keyframe_count_ = 0; + // This parser is used to assign temporalId. + H264Parser h264_parser_; + gfx::Size input_visible_size_; size_t bitstream_buffer_size_; uint32_t frame_rate_; From 5313ec425bfcdd5b938a4e89a0e9af06a11c526b Mon Sep 17 00:00:00 2001 From: Pi-Hsun Shih Date: Tue, 14 Dec 2021 06:04:11 +0000 Subject: [PATCH 06/45] CCA: Migrate i18n_string.js and views/crop_document.js to TypeScript Bug: b:172340451 Test: tsc compiles Test: tast run camera.CCAUISmoke* camera.CCAUIStress* camera.CCAUIDocumentScanning* Change-Id: Ic5a6735f86405fe5a5ca84f73ea463404f59c331 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3295290 Reviewed-by: Shik Chen Commit-Queue: Pi-Hsun Shih Cr-Commit-Position: refs/heads/main@{#951379} --- .../camera_app_ui/resources/js/i18n_string.js | 161 -------- .../camera_app_ui/resources/js/i18n_string.ts | 160 +++++++ ash/webui/camera_app_ui/resources/js/js.gni | 4 +- .../{crop_document.js => crop_document.ts} | 391 +++++++----------- 4 files changed, 317 insertions(+), 399 deletions(-) delete mode 100644 ash/webui/camera_app_ui/resources/js/i18n_string.js create mode 100644 ash/webui/camera_app_ui/resources/js/i18n_string.ts rename ash/webui/camera_app_ui/resources/js/views/{crop_document.js => crop_document.ts} (62%) diff --git a/ash/webui/camera_app_ui/resources/js/i18n_string.js b/ash/webui/camera_app_ui/resources/js/i18n_string.js deleted file mode 100644 index 68c91499bd7adc..00000000000000 --- a/ash/webui/camera_app_ui/resources/js/i18n_string.js +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2021 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. - -/** - * All string resources in resources.h - * @enum {string} - */ -export const I18nString = { - ARIA_CAMERA_MODE_GROUP: 'aria_camera_mode_group', - ARIA_GRID_3X3: 'aria_grid_3x3', - ARIA_GRID_4X4: 'aria_grid_4x4', - ARIA_RECORD_TYPE_GROUP: 'aria_record_type_group', - ARIA_SCAN_TYPE_GROUP: 'aria_scan_type_group', - BACK_BUTTON: 'back_button', - BARCODE_COPY_LINK_BUTTON: 'barcode_copy_link_button', - BARCODE_COPY_TEXT_BUTTON: 'barcode_copy_text_button', - BARCODE_LINK_DETECTED: 'barcode_link_detected', - BARCODE_TEXT_DETECTED: 'barcode_text_detected', - CAMERA_RESOLUTION_BUTTON: 'camera_resolution_button', - CANCEL_REVIEW_BUTTON: 'cancel_review_button', - CONFIRM_REVIEW_BUTTON: 'confirm_review_button', - DELETE_BUTTON: 'delete_button', - DELETE_CONFIRMATION_MSG: 'delete_confirmation_msg', - DELETE_MULTI_CONFIRMATION_MSG: 'delete_multi_confirmation_msg', - DESCRIPTION: 'description', - DIALOG_CANCEL_BUTTON: 'dialog_cancel_button', - DIALOG_OK_BUTTON: 'dialog_ok_button', - DOCUMENT_CORNER_MOVE_DESC: 'document_corner_move_desc', - DOCUMENT_MODE_DIALOG_GOT_IT: 'document_mode_dialog_got_it', - DOCUMENT_MODE_DIALOG_MSG: 'document_mode_dialog_msg', - DOCUMENT_MODE_DIALOG_INTRO_TITLE: 'document_mode_dialog_intro_title', - DOCUMENT_MODE_DIALOG_NOT_DETECTED_TITLE: - 'document_mode_dialog_not_detected_title', - ERROR_MSG_CAMERA_PAUSED: 'error_msg_camera_paused', - ERROR_MSG_EMPTY_RECORDING: 'error_msg_empty_recording', - ERROR_MSG_FILE_SYSTEM_FAILED: 'error_msg_file_system_failed', - ERROR_MSG_GALLERY_EXPORT_FAILED: 'error_msg_gallery_export_failed', - ERROR_MSG_NO_CAMERA: 'error_msg_no_camera', - ERROR_MSG_RECORD_START_FAILED: 'error_msg_record_start_failed', - ERROR_MSG_SAVE_FILE_FAILED: 'error_msg_save_file_failed', - ERROR_MSG_TAKE_PHOTO_FAILED: 'error_msg_take_photo_failed', - ERROR_MSG_TAKE_PORTRAIT_BOKEH_PHOTO_FAILED: - 'error_msg_take_portrait_bokeh_photo_failed', - ERROR_MSG_VIDEO_TOO_SHORT: 'error_msg_video_too_short', - EXPERT_CUSTOM_VIDEO_PARAMETERS: 'expert_custom_video_parameters', - EXPERT_ENABLE_EXPERT_MODE: 'expert_enable_expert_mode', - EXPERT_ENABLE_FULL_SIZED_VIDEO_SNAPSHOT: - 'expert_enable_full_sized_video_snapshot', - EXPERT_MODE_BUTTON: 'expert_mode_button', - EXPERT_PREVIEW_METADATA: 'expert_preview_metadata', - EXPERT_PRINT_PERFORMANCE_LOGS: 'expert_print_performance_logs', - EXPERT_SAVE_METADATA: 'expert_save_metadata', - EXPERT_SCAN_BARCODE: 'expert_scan_barcode', - EXPERT_SHOW_GIF_RECORDING_OPTION: 'expert_show_gif_recording_option', - EXPORT_BUTTON: 'export_button', - FEEDBACK_BUTTON: 'feedback_button', - FEEDBACK_DESCRIPTION_PLACEHOLDER: 'feedback_description_placeholder', - GALLERY_BUTTON: 'gallery_button', - GALLERY_IMAGES: 'gallery_images', - GRID_TYPE_BUTTON: 'grid_type_button', - HELP_BUTTON: 'help_button', - LABEL_30FPS: 'label_30fps', - LABEL_60FPS: 'label_60fps', - LABEL_BACK_CAMERA: 'label_back_camera', - LABEL_CROP_DONE: 'label_crop_done', - LABEL_CURRENT_AND_MAXIMAL_RECORD_TIME: - 'label_current_and_maximal_record_time', - LABEL_DETAIL_PHOTO_RESOLUTION: 'label_detail_photo_resolution', - LABEL_DOCUMENT_BOTTOM_LEFT_CORNER: 'label_document_bottom_left_corner', - LABEL_DOCUMENT_BOTTOM_RIGHT_CORNER: 'label_document_bottom_right_corner', - LABEL_DOCUMENT_TOP_LEFT_CORNER: 'label_document_top_left_corner', - LABEL_DOCUMENT_TOP_RIGHT_CORNER: 'label_document_top_right_corner', - LABEL_EXTERNAL_CAMERA: 'label_external_camera', - LABEL_FIX_DOCUMENT: 'label_fix_document', - LABEL_FRONT_CAMERA: 'label_front_camera', - LABEL_GRID_3X3: 'label_grid_3x3', - LABEL_GRID_4X4: 'label_grid_4x4', - LABEL_GRID_GOLDEN: 'label_grid_golden', - LABEL_PHOTO_RESOLUTION: 'label_photo_resolution', - LABEL_RECORD_GIF_VIDEO_OPTION: 'label_record_gif_video_option', - LABEL_RECORD_NORMAL_VIDEO_OPTION: 'label_record_normal_video_option', - LABEL_RETAKE: 'label_retake', - LABEL_SAVE: 'label_save', - LABEL_SAVE_PDF_DOCUMENT: 'label_save_pdf_document', - LABEL_SAVE_PHOTO_DOCUMENT: 'label_save_photo_document', - LABEL_SCAN_DOCUMENT_OPTION: 'label_scan_document_option', - LABEL_SCAN_QRCODE_OPTION: 'label_scan_qrcode_option', - LABEL_SHARE: 'label_share', - LABEL_SWITCH_RECORD_VIDEO_BUTTON: 'label_switch_record_video_button', - LABEL_SWITCH_SCAN_MODE_BUTTON: 'label_switch_scan_mode_button', - LABEL_SWITCH_TAKE_PHOTO_BUTTON: 'label_switch_take_photo_button', - LABEL_SWITCH_TAKE_PORTRAIT_BOKEH_PHOTO_BUTTON: - 'label_switch_take_portrait_bokeh_photo_button', - LABEL_SWITCH_TAKE_SQUARE_PHOTO_BUTTON: - 'label_switch_take_square_photo_button', - LABEL_TIMER_10S: 'label_timer_10s', - LABEL_TIMER_3S: 'label_timer_3s', - LABEL_VIDEO_RESOLUTION: 'label_video_resolution', - MIGRATE_PICTURES_MSG: 'migrate_pictures_msg', - MOVING_IN_BOTTOM_DIRECTION: 'moving_in_bottom_direction', - MOVING_IN_BOTTOM_LEFT_DIRECTION: 'moving_in_bottom_left_direction', - MOVING_IN_BOTTOM_RIGHT_DIRECTION: 'moving_in_bottom_right_direction', - MOVING_IN_LEFT_DIRECTION: 'moving_in_left_direction', - MOVING_IN_RIGHT_DIRECTION: 'moving_in_right_direction', - MOVING_IN_TOP_DIRECTION: 'moving_in_top_direction', - MOVING_IN_TOP_LEFT_DIRECTION: 'moving_in_top_left_direction', - MOVING_IN_TOP_RIGHT_DIRECTION: 'moving_in_top_right_direction', - MSG_DOCUMENT_DETECTED: 'msg_document_detected', - MSG_PROCESSING_IMAGE: 'msg_processing_image', - NAME: 'name', - NEW_CONTROL_NAVIGATION: 'new_control_navigation', - NEW_CONTROL_TOAST: 'new_control_toast', - NEW_DOCUMENT_SCAN_TOAST: 'new_document_scan_toast', - OPEN_PTZ_PANEL_BUTTON: 'open_ptz_panel_button', - PAN_LEFT_BUTTON: 'pan_left_button', - PAN_RIGHT_BUTTON: 'pan_right_button', - PHOTO_RESOLUTION_BUTTON: 'photo_resolution_button', - PLAY_RESULT_VIDEO_BUTTON: 'play_result_video_button', - PRINT_BUTTON: 'print_button', - PTZ_RESET_ALL_BUTTON: 'ptz_reset_all_button', - RECORD_GIF_VIDEO_OPTION: 'record_gif_video_option', - RECORD_NORMAL_VIDEO_OPTION: 'record_normal_video_option', - RECORD_VIDEO_PAUSE_BUTTON: 'record_video_pause_button', - RECORD_VIDEO_PAUSED_MSG: 'record_video_paused_msg', - RECORD_VIDEO_RESUME_BUTTON: 'record_video_resume_button', - RECORD_VIDEO_START_BUTTON: 'record_video_start_button', - RECORD_VIDEO_STOP_BUTTON: 'record_video_stop_button', - SCAN_DOCUMENT_OPTION: 'scan_document_option', - SCAN_QRCODE_OPTION: 'scan_qrcode_option', - SETTINGS_BUTTON: 'settings_button', - SNACKBAR_LINK_COPIED: 'snackbar_link_copied', - SNACKBAR_TEXT_COPIED: 'snackbar_text_copied', - STATUS_MSG_CAMERA_PLUGGED: 'status_msg_camera_plugged', - STATUS_MSG_CAMERA_SWITCHED: 'status_msg_camera_switched', - STATUS_MSG_CAMERA_UNPLUGGED: 'status_msg_camera_unplugged', - STATUS_MSG_RECORDING_STOPPED: 'status_msg_recording_stopped', - SWITCH_CAMERA_BUTTON: 'switch_camera_button', - SWITCH_RECORD_VIDEO_BUTTON: 'switch_record_video_button', - SWITCH_SCAN_MODE_BUTTON: 'switch_scan_mode_button', - SWITCH_TAKE_PHOTO_BUTTON: 'switch_take_photo_button', - SWITCH_TAKE_PORTRAIT_BOKEH_PHOTO_BUTTON: - 'switch_take_portrait_bokeh_photo_button', - SWITCH_TAKE_SQUARE_PHOTO_BUTTON: 'switch_take_square_photo_button', - TAKE_PHOTO_BUTTON: 'take_photo_button', - TAKE_PHOTO_CANCEL_BUTTON: 'take_photo_cancel_button', - TAKE_VIDEO_SNAPSHOT_BUTTON: 'take_video_snapshot_button', - TILT_DOWN_BUTTON: 'tilt_down_button', - TILT_UP_BUTTON: 'tilt_up_button', - TIMER_DURATION_BUTTON: 'timer_duration_button', - TOGGLE_60FPS_BUTTON: 'toggle_60fps_button', - TOGGLE_BARCODE_BUTTON: 'toggle_barcode_button', - TOGGLE_GRID_BUTTON: 'toggle_grid_button', - TOGGLE_MIC_BUTTON: 'toggle_mic_button', - TOGGLE_MIRROR_BUTTON: 'toggle_mirror_button', - TOGGLE_TIMER_10S_BUTTON: 'toggle_timer_10s_button', - TOGGLE_TIMER_3S_BUTTON: 'toggle_timer_3s_button', - VIDEO_RESOLUTION_BUTTON: 'video_resolution_button', - ZOOM_IN_BUTTON: 'zoom_in_button', - ZOOM_OUT_BUTTON: 'zoom_out_button', -}; diff --git a/ash/webui/camera_app_ui/resources/js/i18n_string.ts b/ash/webui/camera_app_ui/resources/js/i18n_string.ts new file mode 100644 index 00000000000000..4dc3ddb9f56496 --- /dev/null +++ b/ash/webui/camera_app_ui/resources/js/i18n_string.ts @@ -0,0 +1,160 @@ +// Copyright 2021 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. + +/** + * All string resources in resources.h + */ +export enum I18nString { + ARIA_CAMERA_MODE_GROUP = 'aria_camera_mode_group', + ARIA_GRID_3X3 = 'aria_grid_3x3', + ARIA_GRID_4X4 = 'aria_grid_4x4', + ARIA_RECORD_TYPE_GROUP = 'aria_record_type_group', + ARIA_SCAN_TYPE_GROUP = 'aria_scan_type_group', + BACK_BUTTON = 'back_button', + BARCODE_COPY_LINK_BUTTON = 'barcode_copy_link_button', + BARCODE_COPY_TEXT_BUTTON = 'barcode_copy_text_button', + BARCODE_LINK_DETECTED = 'barcode_link_detected', + BARCODE_TEXT_DETECTED = 'barcode_text_detected', + CAMERA_RESOLUTION_BUTTON = 'camera_resolution_button', + CANCEL_REVIEW_BUTTON = 'cancel_review_button', + CONFIRM_REVIEW_BUTTON = 'confirm_review_button', + DELETE_BUTTON = 'delete_button', + DELETE_CONFIRMATION_MSG = 'delete_confirmation_msg', + DELETE_MULTI_CONFIRMATION_MSG = 'delete_multi_confirmation_msg', + DESCRIPTION = 'description', + DIALOG_CANCEL_BUTTON = 'dialog_cancel_button', + DIALOG_OK_BUTTON = 'dialog_ok_button', + DOCUMENT_CORNER_MOVE_DESC = 'document_corner_move_desc', + DOCUMENT_MODE_DIALOG_GOT_IT = 'document_mode_dialog_got_it', + DOCUMENT_MODE_DIALOG_MSG = 'document_mode_dialog_msg', + DOCUMENT_MODE_DIALOG_INTRO_TITLE = 'document_mode_dialog_intro_title', + DOCUMENT_MODE_DIALOG_NOT_DETECTED_TITLE = + 'document_mode_dialog_not_detected_title', + ERROR_MSG_CAMERA_PAUSED = 'error_msg_camera_paused', + ERROR_MSG_EMPTY_RECORDING = 'error_msg_empty_recording', + ERROR_MSG_FILE_SYSTEM_FAILED = 'error_msg_file_system_failed', + ERROR_MSG_GALLERY_EXPORT_FAILED = 'error_msg_gallery_export_failed', + ERROR_MSG_NO_CAMERA = 'error_msg_no_camera', + ERROR_MSG_RECORD_START_FAILED = 'error_msg_record_start_failed', + ERROR_MSG_SAVE_FILE_FAILED = 'error_msg_save_file_failed', + ERROR_MSG_TAKE_PHOTO_FAILED = 'error_msg_take_photo_failed', + ERROR_MSG_TAKE_PORTRAIT_BOKEH_PHOTO_FAILED = + 'error_msg_take_portrait_bokeh_photo_failed', + ERROR_MSG_VIDEO_TOO_SHORT = 'error_msg_video_too_short', + EXPERT_CUSTOM_VIDEO_PARAMETERS = 'expert_custom_video_parameters', + EXPERT_ENABLE_EXPERT_MODE = 'expert_enable_expert_mode', + EXPERT_ENABLE_FULL_SIZED_VIDEO_SNAPSHOT = + 'expert_enable_full_sized_video_snapshot', + EXPERT_MODE_BUTTON = 'expert_mode_button', + EXPERT_PREVIEW_METADATA = 'expert_preview_metadata', + EXPERT_PRINT_PERFORMANCE_LOGS = 'expert_print_performance_logs', + EXPERT_SAVE_METADATA = 'expert_save_metadata', + EXPERT_SCAN_BARCODE = 'expert_scan_barcode', + EXPERT_SHOW_GIF_RECORDING_OPTION = 'expert_show_gif_recording_option', + EXPORT_BUTTON = 'export_button', + FEEDBACK_BUTTON = 'feedback_button', + FEEDBACK_DESCRIPTION_PLACEHOLDER = 'feedback_description_placeholder', + GALLERY_BUTTON = 'gallery_button', + GALLERY_IMAGES = 'gallery_images', + GRID_TYPE_BUTTON = 'grid_type_button', + HELP_BUTTON = 'help_button', + LABEL_30FPS = 'label_30fps', + LABEL_60FPS = 'label_60fps', + LABEL_BACK_CAMERA = 'label_back_camera', + LABEL_CROP_DONE = 'label_crop_done', + LABEL_CURRENT_AND_MAXIMAL_RECORD_TIME = + 'label_current_and_maximal_record_time', + LABEL_DETAIL_PHOTO_RESOLUTION = 'label_detail_photo_resolution', + LABEL_DOCUMENT_BOTTOM_LEFT_CORNER = 'label_document_bottom_left_corner', + LABEL_DOCUMENT_BOTTOM_RIGHT_CORNER = 'label_document_bottom_right_corner', + LABEL_DOCUMENT_TOP_LEFT_CORNER = 'label_document_top_left_corner', + LABEL_DOCUMENT_TOP_RIGHT_CORNER = 'label_document_top_right_corner', + LABEL_EXTERNAL_CAMERA = 'label_external_camera', + LABEL_FIX_DOCUMENT = 'label_fix_document', + LABEL_FRONT_CAMERA = 'label_front_camera', + LABEL_GRID_3X3 = 'label_grid_3x3', + LABEL_GRID_4X4 = 'label_grid_4x4', + LABEL_GRID_GOLDEN = 'label_grid_golden', + LABEL_PHOTO_RESOLUTION = 'label_photo_resolution', + LABEL_RECORD_GIF_VIDEO_OPTION = 'label_record_gif_video_option', + LABEL_RECORD_NORMAL_VIDEO_OPTION = 'label_record_normal_video_option', + LABEL_RETAKE = 'label_retake', + LABEL_SAVE = 'label_save', + LABEL_SAVE_PDF_DOCUMENT = 'label_save_pdf_document', + LABEL_SAVE_PHOTO_DOCUMENT = 'label_save_photo_document', + LABEL_SCAN_DOCUMENT_OPTION = 'label_scan_document_option', + LABEL_SCAN_QRCODE_OPTION = 'label_scan_qrcode_option', + LABEL_SHARE = 'label_share', + LABEL_SWITCH_RECORD_VIDEO_BUTTON = 'label_switch_record_video_button', + LABEL_SWITCH_SCAN_MODE_BUTTON = 'label_switch_scan_mode_button', + LABEL_SWITCH_TAKE_PHOTO_BUTTON = 'label_switch_take_photo_button', + LABEL_SWITCH_TAKE_PORTRAIT_BOKEH_PHOTO_BUTTON = + 'label_switch_take_portrait_bokeh_photo_button', + LABEL_SWITCH_TAKE_SQUARE_PHOTO_BUTTON = + 'label_switch_take_square_photo_button', + LABEL_TIMER_10S = 'label_timer_10s', + LABEL_TIMER_3S = 'label_timer_3s', + LABEL_VIDEO_RESOLUTION = 'label_video_resolution', + MIGRATE_PICTURES_MSG = 'migrate_pictures_msg', + MOVING_IN_BOTTOM_DIRECTION = 'moving_in_bottom_direction', + MOVING_IN_BOTTOM_LEFT_DIRECTION = 'moving_in_bottom_left_direction', + MOVING_IN_BOTTOM_RIGHT_DIRECTION = 'moving_in_bottom_right_direction', + MOVING_IN_LEFT_DIRECTION = 'moving_in_left_direction', + MOVING_IN_RIGHT_DIRECTION = 'moving_in_right_direction', + MOVING_IN_TOP_DIRECTION = 'moving_in_top_direction', + MOVING_IN_TOP_LEFT_DIRECTION = 'moving_in_top_left_direction', + MOVING_IN_TOP_RIGHT_DIRECTION = 'moving_in_top_right_direction', + MSG_DOCUMENT_DETECTED = 'msg_document_detected', + MSG_PROCESSING_IMAGE = 'msg_processing_image', + NAME = 'name', + NEW_CONTROL_NAVIGATION = 'new_control_navigation', + NEW_CONTROL_TOAST = 'new_control_toast', + NEW_DOCUMENT_SCAN_TOAST = 'new_document_scan_toast', + OPEN_PTZ_PANEL_BUTTON = 'open_ptz_panel_button', + PAN_LEFT_BUTTON = 'pan_left_button', + PAN_RIGHT_BUTTON = 'pan_right_button', + PHOTO_RESOLUTION_BUTTON = 'photo_resolution_button', + PLAY_RESULT_VIDEO_BUTTON = 'play_result_video_button', + PRINT_BUTTON = 'print_button', + PTZ_RESET_ALL_BUTTON = 'ptz_reset_all_button', + RECORD_GIF_VIDEO_OPTION = 'record_gif_video_option', + RECORD_NORMAL_VIDEO_OPTION = 'record_normal_video_option', + RECORD_VIDEO_PAUSE_BUTTON = 'record_video_pause_button', + RECORD_VIDEO_PAUSED_MSG = 'record_video_paused_msg', + RECORD_VIDEO_RESUME_BUTTON = 'record_video_resume_button', + RECORD_VIDEO_START_BUTTON = 'record_video_start_button', + RECORD_VIDEO_STOP_BUTTON = 'record_video_stop_button', + SCAN_DOCUMENT_OPTION = 'scan_document_option', + SCAN_QRCODE_OPTION = 'scan_qrcode_option', + SETTINGS_BUTTON = 'settings_button', + SNACKBAR_LINK_COPIED = 'snackbar_link_copied', + SNACKBAR_TEXT_COPIED = 'snackbar_text_copied', + STATUS_MSG_CAMERA_PLUGGED = 'status_msg_camera_plugged', + STATUS_MSG_CAMERA_SWITCHED = 'status_msg_camera_switched', + STATUS_MSG_CAMERA_UNPLUGGED = 'status_msg_camera_unplugged', + STATUS_MSG_RECORDING_STOPPED = 'status_msg_recording_stopped', + SWITCH_CAMERA_BUTTON = 'switch_camera_button', + SWITCH_RECORD_VIDEO_BUTTON = 'switch_record_video_button', + SWITCH_SCAN_MODE_BUTTON = 'switch_scan_mode_button', + SWITCH_TAKE_PHOTO_BUTTON = 'switch_take_photo_button', + SWITCH_TAKE_PORTRAIT_BOKEH_PHOTO_BUTTON = + 'switch_take_portrait_bokeh_photo_button', + SWITCH_TAKE_SQUARE_PHOTO_BUTTON = 'switch_take_square_photo_button', + TAKE_PHOTO_BUTTON = 'take_photo_button', + TAKE_PHOTO_CANCEL_BUTTON = 'take_photo_cancel_button', + TAKE_VIDEO_SNAPSHOT_BUTTON = 'take_video_snapshot_button', + TILT_DOWN_BUTTON = 'tilt_down_button', + TILT_UP_BUTTON = 'tilt_up_button', + TIMER_DURATION_BUTTON = 'timer_duration_button', + TOGGLE_60FPS_BUTTON = 'toggle_60fps_button', + TOGGLE_BARCODE_BUTTON = 'toggle_barcode_button', + TOGGLE_GRID_BUTTON = 'toggle_grid_button', + TOGGLE_MIC_BUTTON = 'toggle_mic_button', + TOGGLE_MIRROR_BUTTON = 'toggle_mirror_button', + TOGGLE_TIMER_10S_BUTTON = 'toggle_timer_10s_button', + TOGGLE_TIMER_3S_BUTTON = 'toggle_timer_3s_button', + VIDEO_RESOLUTION_BUTTON = 'video_resolution_button', + ZOOM_IN_BUTTON = 'zoom_in_button', + ZOOM_OUT_BUTTON = 'zoom_out_button', +} diff --git a/ash/webui/camera_app_ui/resources/js/js.gni b/ash/webui/camera_app_ui/resources/js/js.gni index 653f21980daf10..fcdb99fda1c90e 100644 --- a/ash/webui/camera_app_ui/resources/js/js.gni +++ b/ash/webui/camera_app_ui/resources/js/js.gni @@ -23,7 +23,7 @@ compile_js_files = [ "gallerybutton.js", "geometry.js", "h264.js", - "i18n_string.js", + "i18n_string.ts", "init.ts", "intent.js", "lib/comlink.ts", @@ -89,7 +89,7 @@ compile_js_files = [ "views/camera/scan_options.js", "views/camera/timertick.js", "views/camera/video_encoder_options.js", - "views/crop_document.js", + "views/crop_document.ts", "views/dialog.js", "views/ptz_panel.js", "views/review.ts", diff --git a/ash/webui/camera_app_ui/resources/js/views/crop_document.js b/ash/webui/camera_app_ui/resources/js/views/crop_document.ts similarity index 62% rename from ash/webui/camera_app_ui/resources/js/views/crop_document.js rename to ash/webui/camera_app_ui/resources/js/views/crop_document.ts index a3d730eb436965..c016058c68a07c 100644 --- a/ash/webui/camera_app_ui/resources/js/views/crop_document.js +++ b/ash/webui/camera_app_ui/resources/js/views/crop_document.ts @@ -25,12 +25,11 @@ const MOVEMENT_ANNOUNCER_INTERVAL_MS = 2000; /** * Maps from sign of x, y movement to corresponding i18n labels to be announced. - * @type {!Map>} */ const MOVEMENT_ANNOUNCE_LABELS = new Map([ [ -1, - new Map([ + new Map([ [-1, I18nString.MOVING_IN_TOP_LEFT_DIRECTION], [0, I18nString.MOVING_IN_LEFT_DIRECTION], [1, I18nString.MOVING_IN_BOTTOM_LEFT_DIRECTION], @@ -38,14 +37,14 @@ const MOVEMENT_ANNOUNCE_LABELS = new Map([ ], [ 0, - new Map([ + new Map([ [-1, I18nString.MOVING_IN_TOP_DIRECTION], [1, I18nString.MOVING_IN_BOTTOM_DIRECTION], ]), ], [ 1, - new Map([ + new Map([ [-1, I18nString.MOVING_IN_TOP_RIGHT_DIRECTION], [0, I18nString.MOVING_IN_RIGHT_DIRECTION], [1, I18nString.MOVING_IN_BOTTOM_RIGHT_DIRECTION], @@ -58,58 +57,40 @@ const MOVEMENT_ANNOUNCE_LABELS = new Map([ */ class MovementAnnouncer { /** - * @public + * Interval to throttle the consecutive announcement. */ - constructor() { - /** - * Interval to throttle the consecutive announcement. - * @type {?util.DelayInterval} - * @private - */ - this.announceInterval_ = null; + private announceInterval: util.DelayInterval|null = null; - /** - * X component of last not announced movement. - * @type {number} - * @private - */ - this.lastXMovement_ = 0; - - /** - * Y component of last not announced movement. - * @type {number} - * @private - */ - this.lastYMovement_ = 0; - } + /** + * X component of last not announced movement. + */ + private lastXMovement = 0; /** - * @param {number} dx - * @param {number} dy + * Y component of last not announced movement. */ - updateMovement(dx, dy) { - this.lastXMovement_ = dx; - this.lastYMovement_ = dy; - if (this.announceInterval_ === null) { - this.announceInterval_ = new util.DelayInterval(() => { - this.announce_(); + private lastYMovement = 0; + + updateMovement(dx: number, dy: number) { + this.lastXMovement = dx; + this.lastYMovement = dy; + if (this.announceInterval === null) { + this.announceInterval = new util.DelayInterval(() => { + this.announce(); }, MOVEMENT_ANNOUNCER_START_DELAY_MS, MOVEMENT_ANNOUNCER_INTERVAL_MS); } } - /** - * @private - */ - announce_() { - if (this.lastXMovement_ === 0 && this.lastYMovement_ === 0) { - this.announceInterval_.stop(); - this.announceInterval_ = null; + private announce() { + if (this.lastXMovement === 0 && this.lastYMovement === 0) { + this.announceInterval.stop(); + this.announceInterval = null; return; } - const signX = Math.sign(this.lastXMovement_); - const signY = Math.sign(this.lastYMovement_); + const signX = Math.sign(this.lastXMovement); + const signY = Math.sign(this.lastYMovement); speak(MOVEMENT_ANNOUNCE_LABELS.get(signX).get(signY)); - this.lastXMovement_ = this.lastYMovement_ = 0; + this.lastXMovement = this.lastYMovement = 0; } } @@ -127,85 +108,59 @@ const ROTATIONS = [ Rotation.ANGLE_270, ]; -/** - * @typedef {{ - * el: !HTMLDivElement, - * pt: !Point, - * pointerId: ?number, - * }} - */ -let Corner; // eslint-disable-line no-unused-vars +interface Corner { + el: HTMLDivElement; + pt: Point; + pointerId: number|null; +} /** * View controller for review document crop area page. */ export class CropDocument extends Review { + private imageFrame: HTMLDivElement; + /** - * @public + * Size of image frame. */ - constructor() { - super(ViewName.CROP_DOCUMENT); + private frameSize = new Size(0, 0); - /** - * @const {!HTMLDivElement} - * @private - */ - this.imageFrame_ = dom.getFrom(this.root, '.review-frame', HTMLDivElement); + /** + * The original size of the image to be cropped. + */ + private imageOriginalSize: Size|null = null; - /** - * Size of image frame. - * @type {?Size} - * @private - */ - this.frameSize_ = new Size(0, 0); + /** + * Space size coordinates in |this.corners_|. Will change when image client + * area resized. + */ + private cornerSpaceSize: Size|null = null; - /** - * The original size of the image to be cropped. - * @type {?Size} - * @private - */ - this.imageOriginalSize_ = null; + private cropAreaContainer: SVGElement; + private cropArea: SVGPolygonElement; - /** - * Space size coordinates in |this.corners_|. Will change when image client - * area resized. - * @type {?Size} - * @private - */ - this.cornerSpaceSize_ = null; + /** + * Index of |ROTATION| as current photo rotation. + */ + private rotation = 0; - /** - * @const {!SVGElement} - * @private - */ - this.cropAreaContainer_ = - dom.getFrom(this.root, '.crop-area-container', SVGElement); + private initialCorners: Point[]|null = null; + private corners: Corner[]; - /** - * @const {!SVGPolygonElement} - * @private - */ - this.cropArea_ = dom.getFrom(this.image, '.crop-area', SVGPolygonElement); + constructor() { + super(ViewName.CROP_DOCUMENT); - /** - * Index of |ROTATION| as current photo rotation. - * @type {number} - * @private - */ - this.rotation_ = 0; + this.imageFrame = dom.getFrom(this.root, '.review-frame', HTMLDivElement); - /** - * @type {?Array} - * @private - */ - this.initialCorners_ = null; + this.cropAreaContainer = + dom.getFrom(this.root, '.crop-area-container', SVGElement); + + this.cropArea = dom.getFrom(this.image, '.crop-area', SVGPolygonElement); /** * Coordinates of document with respect to |this.cornerSpaceSize_|. - * @type {!Array} - * @private */ - this.corners_ = (() => { + this.corners = (() => { const ret = []; for (let i = 0; i < 4; i++) { const tpl = util.instantiateTemplate('#document-drag-point-template'); @@ -220,39 +175,38 @@ export class CropDocument extends Review { })(); const updateRotation = (newRotation) => { - this.rotation_ = newRotation; - this.updateImage_(); - this.updateCornerElAriaLabel_(); + this.rotation = newRotation; + this.updateImage(); + this.updateCornerElAriaLabel(); }; const clockwiseBtn = dom.getFrom( this.root, 'button[i18n-aria=rotate_clockwise_button]', HTMLButtonElement); clockwiseBtn.addEventListener('click', () => { - updateRotation((this.rotation_ + 1) % ROTATIONS.length); + updateRotation((this.rotation + 1) % ROTATIONS.length); }); const counterclockwiseBtn = dom.getFrom( this.root, 'button[i18n-aria=rotate_counterclockwise_button]', HTMLButtonElement); counterclockwiseBtn.addEventListener('click', () => { - updateRotation( - (this.rotation_ + ROTATIONS.length - 1) % ROTATIONS.length); + updateRotation((this.rotation + ROTATIONS.length - 1) % ROTATIONS.length); }); const cornerSize = (() => { - const style = this.corners_[0].el.computedStyleMap(); + const style = this.corners[0].el.computedStyleMap(); const width = util.getStyleValueInPx(style, 'width'); const height = util.getStyleValueInPx(style, 'height'); return new Size(width, height); })(); - this.corners_.forEach((corn) => { + this.corners.forEach((corn) => { // Start dragging on one corner. corn.el.addEventListener('pointerdown', (e) => { e.preventDefault(); assert(e.target === corn.el); - this.setDragging_(corn, assertInstanceof(e, PointerEvent).pointerId); + this.setDragging(corn, assertInstanceof(e, PointerEvent).pointerId); }); // Use arrow key to move corner. @@ -265,7 +219,7 @@ export class CropDocument extends Review { new Vector(0, 1), new Vector(1, 0), ]; - const pressedKeyIndices = new Set(); + const pressedKeyIndices = new Set(); let keyInterval = null; const clearKeydown = () => { if (keyInterval !== null) { @@ -276,7 +230,7 @@ export class CropDocument extends Review { }; const announcer = new MovementAnnouncer(); - corn.el.addEventListener('blur', (e) => { + corn.el.addEventListener('blur', () => { clearKeydown(); }); @@ -294,19 +248,19 @@ export class CropDocument extends Review { const announceMoveXY = KEY_MOVEMENTS[keyIdx]; announceMoveX += announceMoveXY.x; announceMoveY += announceMoveXY.y; - const moveXY = KEY_MOVEMENTS[(keyIdx + this.rotation_) % 4]; + const moveXY = KEY_MOVEMENTS[(keyIdx + this.rotation) % 4]; moveX += moveXY.x; moveY += moveXY.y; } announcer.updateMovement(announceMoveX, announceMoveY); const {x: curX, y: curY} = corn.pt; const nextPt = new Point(curX + moveX, curY + moveY); - const validPt = this.mapToValidArea_(corn, nextPt); + const validPt = this.mapToValidArea(corn, nextPt); if (validPt === null) { return; } corn.pt = validPt; - this.updateCornerEl_(); + this.updateCornerEl(); }; pressedKeyIndices.add(keyIdx); move(); @@ -336,7 +290,7 @@ export class CropDocument extends Review { for (const eventName of ['pointerup', 'pointerleave', 'pointercancel']) { this.image.addEventListener(eventName, (e) => { e.preventDefault(); - this.clearDragging_(assertInstanceof(e, PointerEvent).pointerId); + this.clearDragging(assertInstanceof(e, PointerEvent).pointerId); }); } @@ -345,7 +299,7 @@ export class CropDocument extends Review { e.preventDefault(); const pointerId = assertInstanceof(e, PointerEvent).pointerId; - const corn = this.findDragging_(pointerId); + const corn = this.findDragging(pointerId); if (corn === null) { return; } @@ -356,18 +310,18 @@ export class CropDocument extends Review { const target = assertInstanceof(e.target, HTMLElement); // The offsetX, offsetY of corners.el are measured from their own left, // top. - if (this.corners_.find(({el}) => el === target) !== undefined) { + if (this.corners.find(({el}) => el === target) !== undefined) { const style = target.attributeStyleMap; dragX += util.getStyleValueInPx(style, 'left') - cornerSize.width / 2; dragY += util.getStyleValueInPx(style, 'top') - cornerSize.height / 2; } - const validPt = this.mapToValidArea_(corn, new Point(dragX, dragY)); + const validPt = this.mapToValidArea(corn, new Point(dragX, dragY)); if (validPt === null) { return; } corn.pt = validPt; - this.updateCornerEl_(); + this.updateCornerEl(); }); // Prevent contextmenu popup triggered by long touch. @@ -379,49 +333,36 @@ export class CropDocument extends Review { } /** - * @param {!Array} corners Initial guess from corner detector. - * @return {!Promise<{corners: !Array, rotation: !Rotation}>} Returns - * new selected corners to be cropped and its rotation. + * @param corners Initial guess from corner detector. + * @return Returns new selected corners to be cropped and its rotation. */ - async reviewCropArea(corners) { - this.initialCorners_ = corners; - this.cornerSpaceSize_ = null; + async reviewCropArea(corners: Point[]): + Promise<{corners: Point[], rotation: Rotation}> { + this.initialCorners = corners; + this.cornerSpaceSize = null; await super.startReview({ positive: new Options( new Option(I18nString.LABEL_CROP_DONE, {exitValue: true}), ), negative: new Options(), }); - const newCorners = this.corners_.map( + const newCorners = this.corners.map( ({pt: {x, y}}) => new Point( - x / this.cornerSpaceSize_.width, y / this.cornerSpaceSize_.height)); - return {corners: newCorners, rotation: ROTATIONS[this.rotation_]}; + x / this.cornerSpaceSize.width, y / this.cornerSpaceSize.height)); + return {corners: newCorners, rotation: ROTATIONS[this.rotation]}; } - /** - * @param {!Corner} corn - * @param {number} pointerId - * @private - */ - setDragging_(corn, pointerId) { + private setDragging(corn: Corner, pointerId: number) { corn.el.classList.add('dragging'); corn.pointerId = pointerId; } - /** - * @param {number} pointerId - * @return {?Corner} - */ - findDragging_(pointerId) { - return this.corners_.find(({pointerId: id}) => id === pointerId) || null; + private findDragging(pointerId: number): Corner|null { + return this.corners.find(({pointerId: id}) => id === pointerId) || null; } - /** - * @param {number} pointerId - * @private - */ - clearDragging_(pointerId) { - const corn = this.findDragging_(pointerId); + private clearDragging(pointerId: number) { + const corn = this.findDragging(pointerId); if (corn === null) { return; } @@ -429,24 +370,18 @@ export class CropDocument extends Review { corn.pointerId = null; } - /** - * @param {!Corner} corn - * @param {!Point} pt - * @return {?Point} - * @private - */ - mapToValidArea_(corn, pt) { + private mapToValidArea(corn: Corner, pt: Point): Point|null { pt = new Point( - Math.max(Math.min(pt.x, this.cornerSpaceSize_.width), 0), - Math.max(Math.min(pt.y, this.cornerSpaceSize_.height), 0)); + Math.max(Math.min(pt.x, this.cornerSpaceSize.width), 0), + Math.max(Math.min(pt.y, this.cornerSpaceSize.height), 0)); - const idx = this.corners_.findIndex((c) => c === corn); + const idx = this.corners.findIndex((c) => c === corn); assert(idx !== -1); - const prevPt = this.corners_[(idx + 3) % 4].pt; - const nextPt = this.corners_[(idx + 1) % 4].pt; - const restPt = this.corners_[(idx + 2) % 4].pt; + const prevPt = this.corners[(idx + 3) % 4].pt; + const nextPt = this.corners[(idx + 1) % 4].pt; + const restPt = this.corners[(idx + 2) % 4].pt; const closestDist = - Math.min(this.cornerSpaceSize_.width, this.cornerSpaceSize_.height) * + Math.min(this.cornerSpaceSize.width, this.cornerSpaceSize.height) * CLOSEST_DISTANCE_RATIO; const prevDir = vectorFromPoints(restPt, prevPt).direction(); const prevBorder = (new Line(prevPt, prevDir)).moveParallel(closestDist); @@ -470,7 +405,7 @@ export class CropDocument extends Review { // May completely overlapped. return null; } - const box = new Box(assertInstanceof(this.cornerSpaceSize_, Size)); + const box = new Box(assertInstanceof(this.cornerSpaceSize, Size)); // Find boundary points of valid area by cases of whether |prevBorderPt| and // |nextBorderPt| are inside/outside the box. @@ -505,31 +440,28 @@ export class CropDocument extends Review { } /** - * @param {!Point} pt1 - * @param {!Point} pt2 - * @param {!Point} pt3 - * @return {{dist2: number, nearest: !Point}} Square distance of |pt3| to - * segment formed by |pt1| and |pt2| and the corresponding nearest - * point on the segment. + * @return Square distance of |pt3| to segment formed by |pt1| and |pt2| + * and the corresponding nearest point on the segment. */ - const distToSegment = (pt1, pt2, pt3) => { - // Minimum Distance between a Point and a Line: - // http://paulbourke.net/geometry/pointlineplane/ - const v12 = vectorFromPoints(pt2, pt1); - const v13 = vectorFromPoints(pt3, pt1); - const u = (v12.x * v13.x + v12.y * v13.y) / v12.length2(); - if (u <= 0) { - return {dist2: v13.length2(), nearest: pt1}; - } - if (u >= 1) { - return {dist2: vectorFromPoints(pt3, pt2).length2(), nearest: pt2}; - } - const projection = vectorFromPoints(pt1).add(v12.multiply(u)).point(); - return { - dist2: vectorFromPoints(projection, pt3).length2(), - nearest: projection, - }; - }; + const distToSegment = (pt1: Point, pt2: Point, pt3: Point): + {dist2: number, nearest: Point} => { + // Minimum Distance between a Point and a Line: + // http://paulbourke.net/geometry/pointlineplane/ + const v12 = vectorFromPoints(pt2, pt1); + const v13 = vectorFromPoints(pt3, pt1); + const u = (v12.x * v13.x + v12.y * v13.y) / v12.length2(); + if (u <= 0) { + return {dist2: v13.length2(), nearest: pt1}; + } + if (u >= 1) { + return {dist2: vectorFromPoints(pt3, pt2).length2(), nearest: pt2}; + } + const projection = vectorFromPoints(pt1).add(v12.multiply(u)).point(); + return { + dist2: vectorFromPoints(projection, pt3).length2(), + nearest: projection, + }; + }; // Project |pt| to nearest point on boundary. let mn = Infinity; @@ -545,30 +477,24 @@ export class CropDocument extends Review { return assertInstanceof(mnPt, Point); } - /** - * @private - */ - updateCornerEl_() { - const cords = this.corners_.map(({pt: {x, y}}) => `${x},${y}`).join(' '); - this.cropArea_.setAttribute('points', cords); - this.corners_.forEach((corn) => { + private updateCornerEl() { + const cords = this.corners.map(({pt: {x, y}}) => `${x},${y}`).join(' '); + this.cropArea.setAttribute('points', cords); + this.corners.forEach((corn) => { const style = corn.el.attributeStyleMap; style.set('left', CSS.px(corn.pt.x)); style.set('top', CSS.px(corn.pt.y)); }); } - /** - * @private - */ - updateCornerElAriaLabel_() { + private updateCornerElAriaLabel() { [I18nString.LABEL_DOCUMENT_TOP_LEFT_CORNER, I18nString.LABEL_DOCUMENT_BOTTOM_LEFT_CORNER, I18nString.LABEL_DOCUMENT_BOTTOM_RIGHT_CORNER, I18nString.LABEL_DOCUMENT_TOP_RIGHT_CORNER, ].forEach((label, index) => { const cornEl = - this.corners_[(this.rotation_ + index) % this.corners_.length].el; + this.corners[(this.rotation + index) % this.corners.length].el; cornEl.setAttribute('i18n-aria', label); }); util.setupI18nElements(this.root); @@ -577,17 +503,16 @@ export class CropDocument extends Review { /** * Updates image position/size with respect to |this.rotation_|, * |this.frameSize_| and |this.imageOriginalSize_|. - * @private */ - updateImage_() { - const {width: frameW, height: frameH} = this.frameSize_; - const {width: rawImageW, height: rawImageH} = this.imageOriginalSize_; + private updateImage() { + const {width: frameW, height: frameH} = this.frameSize; + const {width: rawImageW, height: rawImageH} = this.imageOriginalSize; const style = this.image.attributeStyleMap; let rotatedW = rawImageW; let rotatedH = rawImageH; - if (ROTATIONS[this.rotation_] === Rotation.ANGLE_90 || - ROTATIONS[this.rotation_] === Rotation.ANGLE_270) { + if (ROTATIONS[this.rotation] === Rotation.ANGLE_90 || + ROTATIONS[this.rotation] === Rotation.ANGLE_270) { [rotatedW, rotatedH] = [rotatedH, rotatedW]; } const scale = Math.min(1, frameW / rotatedW, frameH / rotatedH); @@ -595,47 +520,44 @@ export class CropDocument extends Review { const newImageH = scale * rawImageH; style.set('width', CSS.px(newImageW)); style.set('height', CSS.px(newImageH)); - this.cropAreaContainer_.setAttribute( + this.cropAreaContainer.setAttribute( 'viewBox', `0 0 ${newImageW} ${newImageH}`); // Update corner space. - if (this.cornerSpaceSize_ === null) { - this.initialCorners_.forEach(({x, y}, idx) => { - this.corners_[idx].pt = new Point(x * newImageW, y * newImageH); + if (this.cornerSpaceSize === null) { + this.initialCorners.forEach(({x, y}, idx) => { + this.corners[idx].pt = new Point(x * newImageW, y * newImageH); }); - this.initialCorners_ = null; + this.initialCorners = null; } else { - const oldImageW = this.cornerSpaceSize_?.width || newImageW; - const oldImageH = this.cornerSpaceSize_?.height || newImageH; - this.corners_.forEach((corn) => { + const oldImageW = this.cornerSpaceSize?.width || newImageW; + const oldImageH = this.cornerSpaceSize?.height || newImageH; + this.corners.forEach((corn) => { corn.pt = new Point( corn.pt.x / oldImageW * newImageW, corn.pt.y / oldImageH * newImageH); }); } - this.cornerSpaceSize_ = new Size(newImageW, newImageH); + this.cornerSpaceSize = new Size(newImageW, newImageH); const originX = - frameW / 2 + rotatedW * scale / 2 * [-1, 1, 1, -1][this.rotation_]; + frameW / 2 + rotatedW * scale / 2 * [-1, 1, 1, -1][this.rotation]; const originY = - frameH / 2 + rotatedH * scale / 2 * [-1, -1, 1, 1][this.rotation_]; + frameH / 2 + rotatedH * scale / 2 * [-1, -1, 1, 1][this.rotation]; style.set('left', CSS.px(originX)); style.set('top', CSS.px(originY)); - const deg = ROTATIONS[this.rotation_]; + const deg = ROTATIONS[this.rotation]; style.set( 'transform', new CSSTransformValue([new CSSRotate(CSS.deg(deg))])); - this.updateCornerEl_(); + this.updateCornerEl(); } - /** - * @override - */ - async setReviewPhoto(blob) { + async setReviewPhoto(blob: Blob): Promise { const image = new Image(); await this.loadImage(image, blob); - this.imageOriginalSize_ = new Size(image.width, image.height); + this.imageOriginalSize = new Size(image.width, image.height); const style = this.image.attributeStyleMap; if (style.has('background-image')) { const oldUrl = style.get('background-image') @@ -645,23 +567,20 @@ export class CropDocument extends Review { } style.set('background-image', `url('${image.src}')`); - this.rotation_ = 0; - this.updateCornerElAriaLabel_(); + this.rotation = 0; + this.updateCornerElAriaLabel(); } - /** - * @override - */ - layout() { + layout(): void { super.layout(); - const rect = this.imageFrame_.getBoundingClientRect(); - this.frameSize_ = new Size(rect.width, rect.height); - this.updateImage_(); + const rect = this.imageFrame.getBoundingClientRect(); + this.frameSize = new Size(rect.width, rect.height); + this.updateImage(); // Clear all dragging corners. - for (const corn of this.corners_) { + for (const corn of this.corners) { if (corn.pointerId !== null) { - this.clearDragging_(corn.pointerId); + this.clearDragging(corn.pointerId); } } } From 05fa1a340d777992609b451ace8d7e82a5cd6d18 Mon Sep 17 00:00:00 2001 From: Bo Majewski Date: Tue, 14 Dec 2021 06:05:12 +0000 Subject: [PATCH 07/45] Code Health: Replace RegisterDeprecatedMessageCallback This CL replaces deprecated RegisterDeprecatedMessageCallback method with RegisterMessageCallback. In order to comply with the signature it replaces base::ListValue* parameter with base::ConstListView. Bug: 1243386 Change-Id: I64907ce9bca60874c1e79c166a9af60252da9a9a Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3327847 Reviewed-by: Kyle Horimoto Commit-Queue: Bo Majewski Cr-Commit-Position: refs/heads/main@{#951380} --- chrome/browser/ui/webui/local_state/local_state_ui.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chrome/browser/ui/webui/local_state/local_state_ui.cc b/chrome/browser/ui/webui/local_state/local_state_ui.cc index d098906298cd79..c2d9ca52a8b9cb 100644 --- a/chrome/browser/ui/webui/local_state/local_state_ui.cc +++ b/chrome/browser/ui/webui/local_state/local_state_ui.cc @@ -49,7 +49,7 @@ class LocalStateUIHandler : public content::WebUIMessageHandler { private: // Called from JS when the page has loaded. Serializes local state prefs and // sends them to the page. - void HandleRequestJson(const base::ListValue* args); + void HandleRequestJson(base::Value::ConstListView args); }; LocalStateUIHandler::LocalStateUIHandler() { @@ -59,13 +59,13 @@ LocalStateUIHandler::~LocalStateUIHandler() { } void LocalStateUIHandler::RegisterMessages() { - web_ui()->RegisterDeprecatedMessageCallback( + web_ui()->RegisterMessageCallback( "requestJson", base::BindRepeating(&LocalStateUIHandler::HandleRequestJson, base::Unretained(this))); } -void LocalStateUIHandler::HandleRequestJson(const base::ListValue* args) { +void LocalStateUIHandler::HandleRequestJson(base::Value::ConstListView args) { AllowJavascript(); base::Value local_state_values = g_browser_process->local_state()->GetPreferenceValues( @@ -82,7 +82,7 @@ void LocalStateUIHandler::HandleRequestJson(const base::ListValue* args) { if (!result) json = "Error loading Local State file."; - const base::Value& callback_id = args->GetList()[0]; + const base::Value& callback_id = args[0]; ResolveJavascriptCallback(callback_id, base::Value(json)); } From 5bdcc78381d6ac5c1f7c89a225b5be6b677b7bcb Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Tue, 14 Dec 2021 06:06:44 +0000 Subject: [PATCH 08/45] Roll SwiftShader from 1eee6cbcf034 to f354daff5a2b (2 revisions) https://swiftshader.googlesource.com/SwiftShader.git/+log/1eee6cbcf034..f354daff5a2b 2021-12-14 swiftshader.regress@gmail.com Regres: Update test lists @ 1eee6cbc 2021-12-13 srisser@google.com Regres updates deqp.json before updating testlists If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/swiftshader-chromium-autoroll Please CC swiftshader-eng+autoroll@google.com on the revert to ensure that a human is aware of the problem. To file a bug in SwiftShader: https://bugs.chromium.org/p/swiftshader/issues/entry To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_chromium_msan_rel_ng;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel;luci.chromium.try:linux-swangle-try-x64;luci.chromium.try:win-swangle-try-x86 Bug: chromium:201453797 Tbr: swiftshader-eng+autoroll@google.com Change-Id: I3262882ba0d76d1040d245bd3c46278c387c24e3 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337091 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#951381} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 9a886f2de6d43f..02534129f30094 100644 --- a/DEPS +++ b/DEPS @@ -251,7 +251,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '1eee6cbcf034ec237e6916612f86b83861459d5e', + 'swiftshader_revision': 'f354daff5a2b882fc182c8377c826aa99b30f989', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. From 6542b83cc202c82004c526d1eefb31ca5667230e Mon Sep 17 00:00:00 2001 From: Jameson Thies Date: Tue, 14 Dec 2021 06:08:22 +0000 Subject: [PATCH 09/45] Roll src/third_party/cros_system_api/ 48bb7e747..725259a4b (12 commits) https://chromium.googlesource.com/chromiumos/platform2/system_api.git/+log/48bb7e7474f0..738cc02fc3be $ git log 48bb7e747..738cc02fc --date=short --no-merges --format='%ad %ae %s' 2021-11-30 jthies typecd: Send notification on invalid dp cable 2021-11-18 genechang system_api: rmad: Add proto for state transition in sensor calibration 2021-11-21 charleszhao hps: Add average filter and tristate. Created with: roll-dep src/third_party/cros_system_api Bug: 206145370 Change-Id: I8c8263ddc8ea0527f1af698eda5a34ade9e71778 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3331438 Reviewed-by: Jimmy Gong Auto-Submit: Jameson Thies Commit-Queue: Jameson Thies Cr-Commit-Position: refs/heads/main@{#951382} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 02534129f30094..53bf897cbcd49b 100644 --- a/DEPS +++ b/DEPS @@ -1033,7 +1033,7 @@ deps = { # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '48bb7e7474f066964e314a2c2e110912ce99a05b', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '738cc02fc3beb133d085f871e2534416baf5afc7', 'condition': 'checkout_linux', }, From 7835bf007a24e68481189528b8429a01784aab9c Mon Sep 17 00:00:00 2001 From: Yuki Shiino Date: Tue, 14 Dec 2021 06:08:52 +0000 Subject: [PATCH 10/45] Revert "Reland "desk_templates: Add a browsertest for launching ARC apps."" This reverts commit 1bc19c7f0d75f13b011a751986030ac0d52e69f5. Reason for revert: Causing test failures of: DesksTemplatesClientArcTest.NativeUILaunchTemplateWithArcApp https://ci.chromium.org/ui/p/chromium/builders/ci/linux-chromeos-dbg/26838/overview Original change's description: > Reland "desk_templates: Add a browsertest for launching ARC apps." > > This is a reland of 1e466192efdeb65fe0e888da60c1691c01165c64 > > Original change's description: > > desk_templates: Add a browsertest for launching ARC apps. > > > > While adding, saw two crashses, one regarding the app icon size and the > > other with the cpu usage. > > > > I cleared the first one by adding test resources for 28 and 56 dp. In > > desks templates, we show a preview that consists of app icons of size > > 28, so the test tries to fetch those sizes. > > > > The second one was handled by clearing the probe service when stopping > > CPU usage count. > > > > Test: added > > Change-Id: Ib60961913e992df8f08be0311099c20e88e745ee > > Fixed: 1251403 > > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3319378 > > Reviewed-by: Nancy Wang > > Reviewed-by: Jeremy Chinsen > > Reviewed-by: Yury Khmel > > Commit-Queue: Sammie Quon > > Cr-Commit-Position: refs/heads/main@{#950300} > > Change-Id: I446bf159aeb345588dde2b681104a70ac239385b > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3331655 > Reviewed-by: Jeremy Chinsen > Reviewed-by: Nancy Wang > Commit-Queue: Sammie Quon > Cr-Commit-Position: refs/heads/main@{#951287} Change-Id: I03569dcd47c9248e2bc23d13747d56764eb489ed No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3336810 Auto-Submit: Yuki Shiino Bot-Commit: Rubber Stamper Commit-Queue: Yuki Shiino Owners-Override: Yuki Shiino Cr-Commit-Position: refs/heads/main@{#951383} --- .../ash/app_restore/arc_app_launch_handler.cc | 4 - .../desks_templates_client_browsertest.cc | 134 +----------------- components/test/data/arc/icon_app_28.png | Bin 14609 -> 0 bytes components/test/data/arc/icon_app_56.png | Bin 15323 -> 0 bytes 4 files changed, 5 insertions(+), 133 deletions(-) delete mode 100644 components/test/data/arc/icon_app_28.png delete mode 100644 components/test/data/arc/icon_app_56.png diff --git a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc index aa8c253be48214..4f052b3d3dcb5a 100644 --- a/chrome/browser/ash/app_restore/arc_app_launch_handler.cc +++ b/chrome/browser/ash/app_restore/arc_app_launch_handler.cc @@ -762,7 +762,6 @@ void ArcAppLaunchHandler::StartCpuUsageCount() { } void ArcAppLaunchHandler::StopCpuUsageCount() { - probe_service_.reset(); cpu_tick_count_timer_.Stop(); } @@ -777,9 +776,6 @@ void ArcAppLaunchHandler::UpdateCpuUsage() { void ArcAppLaunchHandler::OnCpuUsageUpdated( chromeos::cros_healthd::mojom::TelemetryInfoPtr info_ptr) { - if (!probe_service_ || !probe_service_.is_connected()) - return; - CpuTick tick; // For simplicity, assume that device has only one physical CPU. for (const auto& logical_cpu : diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc index 6a4ab13b57895f..a60b5e4b26de44 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc @@ -25,8 +25,6 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" -#include "chrome/browser/ash/app_restore/app_restore_arc_test_helper.h" -#include "chrome/browser/ash/app_restore/app_restore_test_util.h" #include "chrome/browser/ash/login/login_manager_test.h" #include "chrome/browser/ash/login/test/login_manager_mixin.h" #include "chrome/browser/ash/login/ui/user_adding_screen.h" @@ -51,7 +49,6 @@ #include "chromeos/ui/base/window_state_type.h" #include "components/app_restore/app_launch_info.h" #include "components/app_restore/features.h" -#include "components/app_restore/full_restore_save_handler.h" #include "components/app_restore/full_restore_utils.h" #include "components/app_restore/restore_data.h" #include "components/app_restore/window_properties.h" @@ -239,10 +236,13 @@ class DesksTemplatesClientTest : public extensions::PlatformAppBrowserTest { ash::features::kDesksTemplates}, /*disabled_features=*/{}); } - DesksTemplatesClientTest(const DesksTemplatesClientTest&) = delete; - DesksTemplatesClientTest& operator=(const DesksTemplatesClientTest&) = delete; ~DesksTemplatesClientTest() override = default; + void SetUpOnMainThread() override { + ::full_restore::SetActiveProfilePath(profile()->GetPath()); + extensions::PlatformAppBrowserTest::SetUpOnMainThread(); + } + void SetTemplate(std::unique_ptr launch_template) { DesksTemplatesClient::Get()->launch_template_for_test_ = std::move(launch_template); @@ -298,12 +298,6 @@ class DesksTemplatesClientTest : public extensions::PlatformAppBrowserTest { : web_app::LaunchWebAppBrowserAndWait(profile(), app_id); } - // extensions::PlatformAppBrowserTest: - void SetUpOnMainThread() override { - ::full_restore::SetActiveProfilePath(profile()->GetPath()); - extensions::PlatformAppBrowserTest::SetUpOnMainThread(); - } - private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -1146,124 +1140,6 @@ IN_PROC_BROWSER_TEST_F(DesksTemplatesClientTest, settings_window->parent()); } -class DesksTemplatesClientArcTest : public InProcessBrowserTest { - public: - DesksTemplatesClientArcTest() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{full_restore::features::kFullRestore, - ash::features::kDesksTemplates}, - /*disabled_features=*/{}); - } - DesksTemplatesClientArcTest(const DesksTemplatesClientArcTest&) = delete; - DesksTemplatesClientArcTest& operator=(const DesksTemplatesClientArcTest&) = - delete; - ~DesksTemplatesClientArcTest() override = default; - - ash::AppRestoreArcTestHelper* arc_helper() { return &arc_helper_; } - - // InProcessBrowserTest: - void SetUpCommandLine(base::CommandLine* command_line) override { - arc_helper_.SetUpCommandLine(command_line); - InProcessBrowserTest::SetUpCommandLine(command_line); - } - - void SetUpInProcessBrowserTestFixture() override { - arc_helper_.SetUpInProcessBrowserTestFixture(); - InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); - } - - void SetUpOnMainThread() override { - arc_helper_.SetUpOnMainThread(browser()->profile()); - InProcessBrowserTest::SetUpOnMainThread(); - } - - private: - ash::AppRestoreArcTestHelper arc_helper_; - base::test::ScopedFeatureList scoped_feature_list_; -}; - -// Tests that launching a template that contains an ARC app works as expected. -IN_PROC_BROWSER_TEST_F(DesksTemplatesClientArcTest, - NativeUILaunchTemplateWithArcApp) { - auto* desk_model = DesksTemplatesClient::Get()->GetDeskModel(); - ASSERT_EQ(0, desk_model->GetEntryCount()); - - constexpr char kTestAppPackage[] = "test.arc.app.package"; - arc_helper()->InstallTestApps(kTestAppPackage, /*multi_app=*/false); - const std::string app_id = ash::GetTestApp1Id(kTestAppPackage); - - int32_t session_id1 = - full_restore::FullRestoreSaveHandler::GetInstance()->GetArcSessionId(); - - // Create the window for app1. The task id needs to match the - // `window_app_id` arg of `CreateExoWindow`. - const int32_t kTaskId1 = 100; - views::Widget* widget = ash::CreateExoWindow("org.chromium.arc.100"); - widget->SetBounds(gfx::Rect(500, 500)); - full_restore::SaveAppLaunchInfo(browser()->profile()->GetPath(), - std::make_unique( - app_id, ui::EventFlags::EF_NONE, - session_id1, display::kDefaultDisplayId)); - - // Simulate creating the task. - arc_helper()->CreateTask(app_id, kTaskId1, session_id1); - - // Enter overview and save the current desk as a template. - ash::ToggleOverview(); - ash::WaitForOverviewEnterAnimation(); - views::Button* save_desk_as_template_button = - ash::GetSaveDeskAsTemplateButton(); - ASSERT_TRUE(save_desk_as_template_button); - ClickButton(save_desk_as_template_button); - ash::WaitForDesksTemplatesUI(); - ASSERT_EQ(1, desk_model->GetEntryCount()); - - // Exit overview and close the Arc window. We'll need to verify if it - // reopens later. - ash::ToggleOverview(); - ash::WaitForOverviewExitAnimation(); - widget->CloseNow(); - arc_helper()->GetAppHost()->OnTaskDestroyed(kTaskId1); - - // Enter overview, head over to the desks templates grid and launch the - // template. - ash::ToggleOverview(); - ash::WaitForOverviewEnterAnimation(); - views::Button* zero_state_templates_button = - ash::GetZeroStateDesksTemplatesButton(); - ASSERT_TRUE(zero_state_templates_button); - ClickButton(zero_state_templates_button); - - ash::WaitForDesksTemplatesUI(); - views::Button* template_item = ash::GetTemplateItemButton(/*index=*/0); - ASSERT_TRUE(template_item); - ClickButton(template_item); - - // Clicking the button is a two part, both async process. We need to wait for - // the template to be fetched from the model, and then wait for the desk - // animation to be launched. - // TODO(dandersson): Remove this when the desk is no longer activated on - // template launch. - ash::WaitForDesksTemplatesUI(); - ash::DeskSwitchAnimationWaiter waiter; - waiter.Wait(); - - // Create the window to simulate launching the ARC app. - const int32_t kTaskId2 = 200; - auto* widget1 = ash::CreateExoWindow("org.chromium.arc.200"); - auto* window1 = widget1->GetNativeWindow(); - arc_helper()->CreateTask(app_id, kTaskId2, session_id1); - - // Tests that the ARC app is launched on desk 2. - EXPECT_EQ(ash::Shell::GetContainer(window1->GetRootWindow(), - ash::kShellWindowId_DeskContainerB), - window1->parent()); - - widget1->CloseNow(); - arc_helper()->GetAppHost()->OnTaskDestroyed(kTaskId2); - arc_helper()->StopInstance(); -} - // TODO(crbug.com/1273532): Add more tests: // - Deleting templates. // - Launching templates with uninstalled apps. diff --git a/components/test/data/arc/icon_app_28.png b/components/test/data/arc/icon_app_28.png deleted file mode 100644 index b316a860c42fcbd7e22e2d02dd1e72258865516f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14609 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 p90c@V6{NkQ4+W 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 N^3p0&H4>&F{|D12LP!7r From 165485e8bfa206ccd720f7d7642fcd0029aa7431 Mon Sep 17 00:00:00 2001 From: chromium-internal-autoroll Date: Tue, 14 Dec 2021 06:09:58 +0000 Subject: [PATCH 11/45] Roll src-internal from 28fd42027961 to df7c46c625a3 (1 revision) https://chrome-internal.googlesource.com/chrome/src-internal.git/+log/28fd42027961..df7c46c625a3 If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://skia-autoroll.corp.goog/r/src-internal-chromium-autoroll Please CC yukishiino@google.com on the revert to ensure that a human is aware of the problem. To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chrome.try:linux-chromeos-chrome Bug: None Tbr: yukishiino@google.com Change-Id: Ib89cf4361501f8a9e9da068add75d9a8a404f778 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337356 Commit-Queue: chromium-internal-autoroll Bot-Commit: chromium-internal-autoroll Cr-Commit-Position: refs/heads/main@{#951384} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 53bf897cbcd49b..2d2144f5a85083 100644 --- a/DEPS +++ b/DEPS @@ -1700,7 +1700,7 @@ deps = { Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@28fd420279617c4b0b1d199a10ceb380ca60d08c', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@df7c46c625a3bb971a83b1469c8e82f7db00eeca', 'condition': 'checkout_src_internal', }, From 482f396fd52fe93ba0331090e109ed2926eb7602 Mon Sep 17 00:00:00 2001 From: David Black Date: Tue, 14 Dec 2021 06:12:54 +0000 Subject: [PATCH 12/45] Fix colors for managed badge icon. Dark (before): http://shortn/_oI5doTtfs5 Dark (after): http://shortn/_hDuoO2kd38 Light (before): http://shortn/_qDc05ppr9W Light (after): http://shortn/_zEwTRZUGzg Bug: 1279666 Change-Id: Ic1743d22f07ccd86b4a075d47f7e9b949373acc7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337400 Reviewed-by: Kyle Horimoto Commit-Queue: David Black Cr-Commit-Position: refs/heads/main@{#951385} --- .../settings/chromeos/os_people_page/account_manager.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html index 2c5d45d438fe46..2d5ec408a83af1 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html +++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html @@ -183,7 +183,7 @@ } .managed-badge > iron-icon { - --iron-icon-fill-color: white; + --iron-icon-fill-color: var(--cros-bg-color-elevation-1); --iron-icon-height: var(--badge-size); --iron-icon-width: var(--badge-size); display: block; From 6f3e430c2deec9dc78259590f6a16e1f7d739f9a Mon Sep 17 00:00:00 2001 From: Shakti Sahu Date: Tue, 14 Dec 2021 06:16:47 +0000 Subject: [PATCH 13/45] [feature_notification_guide] Implemented segmentation based targeting This CL hooks up feature notification guide to segmentation platform and adds check to schedule notifications only for low engaged users based on segmentation model prediction. Bug: 1277400 Change-Id: I5708fe0c4a838487f8ad0caf2079a16fc2ac7bd5 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3327955 Reviewed-by: Siddhartha S Commit-Queue: Shakti Sahu Cr-Commit-Position: refs/heads/main@{#951386} --- ...ture_notification_guide_service_factory.cc | 9 ++++- .../notifications/internal/BUILD.gn | 4 +++ ...feature_notification_guide_service_impl.cc | 36 ++++++++++++++++--- .../feature_notification_guide_service_impl.h | 14 +++++++- ...otification_guide_service_impl_unittest.cc | 24 ++++++++++++- 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc index a86d3067fb6c17..3e310d47de0489 100644 --- a/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc +++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc @@ -16,7 +16,9 @@ #include "chrome/browser/notifications/scheduler/notification_schedule_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_key.h" +#include "chrome/browser/segmentation_platform/segmentation_platform_service_factory.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "components/segmentation_platform/public/segmentation_platform_service.h" #include "content/public/browser/browser_context.h" #if defined(OS_ANDROID) @@ -64,6 +66,8 @@ FeatureNotificationGuideServiceFactory::FeatureNotificationGuideServiceFactory() "FeatureNotificationGuideService", BrowserContextDependencyManager::GetInstance()) { DependsOn(NotificationScheduleServiceFactory::GetInstance()); + DependsOn( + segmentation_platform::SegmentationPlatformServiceFactory::GetInstance()); } KeyedService* FeatureNotificationGuideServiceFactory::BuildServiceInstanceFor( @@ -73,6 +77,9 @@ KeyedService* FeatureNotificationGuideServiceFactory::BuildServiceInstanceFor( NotificationScheduleServiceFactory::GetForKey(profile->GetProfileKey()); feature_engagement::Tracker* tracker = feature_engagement::TrackerFactory::GetForBrowserContext(profile); + segmentation_platform::SegmentationPlatformService* + segmentation_platform_service = segmentation_platform:: + SegmentationPlatformServiceFactory::GetForProfile(profile); Config config; config.enabled_features = GetEnabledFeaturesFromVariations(); config.notification_deliver_time_delta = @@ -83,7 +90,7 @@ KeyedService* FeatureNotificationGuideServiceFactory::BuildServiceInstanceFor( #endif return new FeatureNotificationGuideServiceImpl( std::move(delegate), config, notification_scheduler, tracker, - base::DefaultClock::GetInstance()); + segmentation_platform_service, base::DefaultClock::GetInstance()); } bool FeatureNotificationGuideServiceFactory::ServiceIsNULLWhileTesting() const { diff --git a/chrome/browser/feature_guide/notifications/internal/BUILD.gn b/chrome/browser/feature_guide/notifications/internal/BUILD.gn index 54c8dd49fd2aa2..86c8c20885a80e 100644 --- a/chrome/browser/feature_guide/notifications/internal/BUILD.gn +++ b/chrome/browser/feature_guide/notifications/internal/BUILD.gn @@ -21,6 +21,8 @@ source_set("internal") { "//base", "//chrome/browser/feature_guide/notifications:public", "//components/feature_engagement/public", + "//components/optimization_guide/proto:optimization_guide_proto", + "//components/segmentation_platform/public", "//skia", ] } @@ -37,6 +39,8 @@ source_set("unit_tests") { "//chrome/browser/feature_guide/notifications:public", "//chrome/browser/notifications/scheduler/test:test_support", "//components/feature_engagement/test:test_support", + "//components/optimization_guide/proto:optimization_guide_proto", + "//components/segmentation_platform/public", "//skia", "//testing/gmock", "//testing/gtest", diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc index 03cf58ba6049ef..94b1663233ea0d 100644 --- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc +++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc @@ -21,6 +21,10 @@ #include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h" #include "chrome/browser/notifications/scheduler/public/schedule_params.h" #include "components/feature_engagement/public/tracker.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/public/config.h" +#include "components/segmentation_platform/public/segment_selection_result.h" +#include "components/segmentation_platform/public/segmentation_platform_service.h" namespace feature_guide { namespace { @@ -40,10 +44,13 @@ FeatureNotificationGuideServiceImpl::FeatureNotificationGuideServiceImpl( const Config& config, notifications::NotificationScheduleService* notification_scheduler, feature_engagement::Tracker* tracker, + segmentation_platform::SegmentationPlatformService* + segmentation_platform_service, base::Clock* clock) : delegate_(std::move(delegate)), notification_scheduler_(notification_scheduler), tracker_(tracker), + segmentation_platform_service_(segmentation_platform_service), clock_(clock), config_(config) { DCHECK(notification_scheduler_); @@ -59,16 +66,37 @@ void FeatureNotificationGuideServiceImpl::OnSchedulerInitialized( scheduled_features_.emplace(NotificationIdToFeature(guid)); } - tracker_->AddOnInitializedCallback(base::BindOnce( - &FeatureNotificationGuideServiceImpl::StartCheckingForEligibleFeatures, - weak_ptr_factory_.GetWeakPtr())); + tracker_->AddOnInitializedCallback( + base::BindOnce(&FeatureNotificationGuideServiceImpl::OnTrackerInitialized, + weak_ptr_factory_.GetWeakPtr())); } -void FeatureNotificationGuideServiceImpl::StartCheckingForEligibleFeatures( +void FeatureNotificationGuideServiceImpl::OnTrackerInitialized( bool init_success) { if (!init_success) return; + segmentation_platform_service_->GetSelectedSegment( + segmentation_platform::kChromeLowUserEngagementSegmentationKey, + base::BindOnce( + &FeatureNotificationGuideServiceImpl::OnQuerySegmentationPlatform, + weak_ptr_factory_.GetWeakPtr())); +} + +void FeatureNotificationGuideServiceImpl::OnQuerySegmentationPlatform( + const segmentation_platform::SegmentSelectionResult& result) { + if (!result.is_ready || !result.segment.has_value()) + return; + if (result.segment.value() != + optimization_guide::proto::OptimizationTarget:: + OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT) { + return; + } + + StartCheckingForEligibleFeatures(); +} + +void FeatureNotificationGuideServiceImpl::StartCheckingForEligibleFeatures() { for (auto feature : config_.enabled_features) { if (base::Contains(scheduled_features_, feature)) continue; diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h index c61a6f7452d4cb..6f2eeac5990778 100644 --- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h +++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h @@ -23,6 +23,11 @@ class NotificationScheduleService; struct NotificationData; } // namespace notifications +namespace segmentation_platform { +class SegmentationPlatformService; +struct SegmentSelectionResult; +} // namespace segmentation_platform + namespace feature_guide { class FeatureNotificationGuideServiceImpl @@ -33,6 +38,8 @@ class FeatureNotificationGuideServiceImpl const Config& config, notifications::NotificationScheduleService* notification_scheduler, feature_engagement::Tracker* tracker, + segmentation_platform::SegmentationPlatformService* + segmentation_platform_service, base::Clock* clock); ~FeatureNotificationGuideServiceImpl() override; @@ -45,12 +52,17 @@ class FeatureNotificationGuideServiceImpl Delegate* GetDelegate() { return delegate_.get(); } private: - void StartCheckingForEligibleFeatures(bool init_success); + void OnTrackerInitialized(bool init_success); + void OnQuerySegmentationPlatform( + const segmentation_platform::SegmentSelectionResult& result); + void StartCheckingForEligibleFeatures(); void ScheduleNotification(FeatureType feature); std::unique_ptr delegate_; raw_ptr notification_scheduler_; raw_ptr tracker_; + raw_ptr + segmentation_platform_service_; base::Clock* clock_; Config config_; diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc index a9f576e561570e..10b33483610e98 100644 --- a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc +++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc @@ -14,6 +14,9 @@ #include "chrome/browser/feature_guide/notifications/config.h" #include "chrome/browser/notifications/scheduler/test/mock_notification_schedule_service.h" #include "components/feature_engagement/test/mock_tracker.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/public/segment_selection_result.h" +#include "components/segmentation_platform/public/segmentation_platform_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -59,6 +62,24 @@ class TestScheduler queued_params_; }; +class TestSegmentationPlatformService + : public segmentation_platform::SegmentationPlatformService { + public: + void GetSelectedSegment(const std::string& segmentation_key, + segmentation_platform::SegmentationPlatformService:: + SegmentSelectionCallback callback) override { + segmentation_platform::SegmentSelectionResult result; + result.is_ready = true; + result.segment = optimization_guide::proto::OptimizationTarget:: + OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT; + std::move(callback).Run(result); + } + void EnableMetrics(bool signal_collection_allowed) override {} + segmentation_platform::ServiceProxy* GetServiceProxy() override { + return nullptr; + } +}; + class FeatureNotificationGuideServiceImplTest : public testing::Test { public: FeatureNotificationGuideServiceImplTest() = default; @@ -69,7 +90,7 @@ class FeatureNotificationGuideServiceImplTest : public testing::Test { config_.notification_deliver_time_delta = base::Days(7); service_ = std::make_unique( std::make_unique(), config_, ¬ifcation_scheduler_, - &tracker_, &test_clock_); + &tracker_, &segmentation_platform_service_, &test_clock_); EXPECT_CALL(tracker_, AddOnInitializedCallback(_)) .WillOnce(RunOnceCallback<0>(true)); } @@ -78,6 +99,7 @@ class FeatureNotificationGuideServiceImplTest : public testing::Test { base::test::TaskEnvironment::TimeSource::MOCK_TIME}; TestScheduler notifcation_scheduler_; feature_engagement::test::MockTracker tracker_; + TestSegmentationPlatformService segmentation_platform_service_; Config config_; base::SimpleTestClock test_clock_; std::unique_ptr service_; From b24c2739b557f0d56af3737278d86665888200cb Mon Sep 17 00:00:00 2001 From: Yuki Shiino Date: Tue, 14 Dec 2021 06:20:41 +0000 Subject: [PATCH 14/45] Revert "What's New: Fix session restore case" This reverts commit 4cb01cbe22ba5e9c5fb610af26036bc2a03ae114. Reason for revert: Suspicious about causing test failures of: SessionRestoreTest.RestoreAllBrowsers https://ci.chromium.org/ui/p/chromium/builders/ci/mac11-arm64-rel-tests/2442/overview Original change's description: > What's New: Fix session restore case > > https://chromium-review.googlesource.com/c/chromium/src/+/3275312 > changed the What's New logic for M98 to only open a tab if the > page exists for a given milestone. However, it missed the case of > session restore, where the startup tabs aren't opened by the startup > browser creator and are instead passed to session restore. This CL > updates the session restore logic to match the startup browser > creator logic, so that no What's New tabs are opened unless there is > a page corresponding to the current milestone. > > Bug: 1271106 > Change-Id: Ibc47ffd21aef42a18a80627d76f7f7fc67ed80cf > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3331237 > Reviewed-by: Scott Violet > Commit-Queue: Rebekah Potter > Cr-Commit-Position: refs/heads/main@{#951356} Bug: 1271106 Change-Id: I8e5ad5d2ca702235ea2e7ac129917df7ccfbc15b No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337645 Owners-Override: Yuki Shiino Auto-Submit: Yuki Shiino Commit-Queue: Rubber Stamper Bot-Commit: Rubber Stamper Cr-Commit-Position: refs/heads/main@{#951387} --- chrome/browser/sessions/session_restore.cc | 27 +++++++--------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc index b2e17dcc1a2df2..9f4263d544a99b 100644 --- a/chrome/browser/sessions/session_restore.cc +++ b/chrome/browser/sessions/session_restore.cc @@ -65,7 +65,6 @@ #include "chrome/browser/ui/tabs/tab_group_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/webui/whats_new/whats_new_util.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/extensions/extension_metrics.h" #include "chrome/common/url_constants.h" @@ -340,12 +339,9 @@ class SessionRestoreImpl : public BrowserListObserver { Browser* browser = nullptr; if (!created_tabbed_browser && always_create_tabbed_browser_) { browser = Browser::Create(Browser::CreateParams(profile_, false)); - if (startup_tabs_.empty() || - (startup_tabs_.size() == 1 && - startup_tabs_[0].url == whats_new::GetWebUIStartupURL())) { + if (startup_tabs_.empty()) { // No tab browsers were created and no URLs were supplied on the command - // line, or only the What's New page is specified at startup and may or - // may not add a tab. Open the new tab page. + // line. Open the new tab page. startup_tabs_.emplace_back(GURL(chrome::kChromeUINewTabURL)); } AppendURLsToBrowser(browser, startup_tabs_); @@ -896,22 +892,15 @@ class SessionRestoreImpl : public BrowserListObserver { // Appends the urls in |startup_tabs| to |browser|. void AppendURLsToBrowser(Browser* browser, const StartupTabs& startup_tabs) { - bool is_first_tab = true; - for (const auto& startup_tab : startup_tabs) { - const GURL& url = startup_tab.url; - if (url == whats_new::GetWebUIStartupURL()) { - whats_new::StartWhatsNewFetch(browser); - continue; - } + for (size_t i = 0; i < startup_tabs.size(); ++i) { int add_types = TabStripModel::ADD_FORCE_INDEX; - if (is_first_tab) + if (i == 0) add_types |= TabStripModel::ADD_ACTIVE; - NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL); - params.disposition = is_first_tab - ? WindowOpenDisposition::NEW_FOREGROUND_TAB - : WindowOpenDisposition::NEW_BACKGROUND_TAB; + NavigateParams params(browser, startup_tabs[i].url, + ui::PAGE_TRANSITION_AUTO_TOPLEVEL); + params.disposition = i == 0 ? WindowOpenDisposition::NEW_FOREGROUND_TAB + : WindowOpenDisposition::NEW_BACKGROUND_TAB; params.tabstrip_add_types = add_types; - is_first_tab = false; Navigate(¶ms); } } From 79431eb325ef14bfdf23336af567df141ac43f8c Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Tue, 14 Dec 2021 06:21:38 +0000 Subject: [PATCH 15/45] Roll Chrome Win32 PGO Profile Roll Chrome Win32 PGO profile from chrome-win32-main-1639439710-4ce88bd362cfc7e18e39dc64fb166eb8bff8bb1b.profdata to chrome-win32-main-1639450747-9674765a801b0ccdb3cdf42a7039da630818498e.profdata If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/pgo-win32-chromium Please CC pgo-profile-sheriffs@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium main branch: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chrome.try:win-chrome Tbr: pgo-profile-sheriffs@google.com Change-Id: I18c2ea9e1ac8b132505f411915887118cedf7b15 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337362 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#951388} --- chrome/build/win32.pgo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 21cc871107df9e..57dcccaefc1666 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt @@ -1 +1 @@ -chrome-win32-main-1639439710-4ce88bd362cfc7e18e39dc64fb166eb8bff8bb1b.profdata +chrome-win32-main-1639450747-9674765a801b0ccdb3cdf42a7039da630818498e.profdata From 2fcd4239fbdff863b2bd9eea634c7d7c3bc64f22 Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Tue, 14 Dec 2021 06:22:13 +0000 Subject: [PATCH 16/45] Roll Skia from ddbf93159f00 to 33c28b9fa986 (1 revision) https://skia.googlesource.com/skia.git/+log/ddbf93159f00..33c28b9fa986 2021-12-14 skia-autoroll@skia-public.iam.gserviceaccount.com Roll Dawn from ffb0024a8970 to d3cac111b662 (8 revisions) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-autoroll Please CC bungeman@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux-blink-rel;luci.chromium.try:linux-chromeos-compile-dbg;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel Cq-Do-Not-Cancel-Tryjobs: true Bug: None Tbr: bungeman@google.com Change-Id: I1b5cc7d143a0a0098ba68d645b88bc65daf0adb6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337365 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#951389} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 2d2144f5a85083..9dad79c5f4dd5a 100644 --- a/DEPS +++ b/DEPS @@ -239,7 +239,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'ddbf93159f00315cbe32212fbc96decc0c3e0709', + 'skia_revision': '33c28b9fa98634d36dbb5f404a3be33decc35463', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. From 1db720e67c8a29f0be44e36dafe56328aa918460 Mon Sep 17 00:00:00 2001 From: Avi Drissman Date: Tue, 14 Dec 2021 06:26:05 +0000 Subject: [PATCH 17/45] Skip HarfBuzzShaperTest.EmojiPercentage on macOS 12 HarfBuzzShaperTest.EmojiPercentage is broken on >= macOS 11; skip appropriately. Bug: 1194323 Change-Id: If08a1f3b2d0f7816bd377fb85199024324d19c94 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3336456 Auto-Submit: Avi Drissman Reviewed-by: Koji Ishii Commit-Queue: Koji Ishii Cr-Commit-Position: refs/heads/main@{#951390} --- .../renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc index 93ab3d5832d2dd..d38cc40aa10c67 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc @@ -1857,8 +1857,8 @@ TEST_F(HarfBuzzShaperTest, ShapeVerticalWithSubpixelPositionIsRounded) { TEST_F(HarfBuzzShaperTest, EmojiPercentage) { #if defined(OS_MAC) - if (base::mac::IsOS11()) - GTEST_SKIP() << "Broken on macOS 11: https://crbug.com/1194323"; + if (base::mac::IsAtLeastOS11()) + GTEST_SKIP() << "Broken on macOS >= 11: https://crbug.com/1194323"; #endif // This test relies on Noto Color Emoji from the third_party directory to not // contain sequences and single codepoint emoji from Unicode 13 and 13.1 such From 4de38efddeef41c2b6d525728badd88d2ebc0341 Mon Sep 17 00:00:00 2001 From: Preethi Mohan Date: Tue, 14 Dec 2021 06:33:00 +0000 Subject: [PATCH 18/45] Rebaseline-cl tool migration to ResultDB - '--test-name-file' option works. Listing the tests in files or positional args works. Continuing to work on autocomputation in a separate CL. This is Flag protected with '--resultDB' to not block the current rebaseline flow during the migration work. Bug: 1213998 Change-Id: Iba79cdf4f6e5a931ca8283e50ff52de94a995323 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3313503 Reviewed-by: Xianzhu Wang Commit-Queue: Preethi Mohan Cr-Commit-Position: refs/heads/main@{#951391} --- .../blinkpy/common/net/results_fetcher.py | 48 ++++++ .../common/net/results_fetcher_mock.py | 10 ++ .../blinkpy/common/net/web_test_results.py | 15 ++ .../tools/blinkpy/tool/commands/rebaseline.py | 41 +++++ .../blinkpy/tool/commands/rebaseline_cl.py | 22 ++- .../tool/commands/rebaseline_cl_unittest.py | 147 ++++++++++++++---- .../blinkpy/tool/commands/rebaseline_test.py | 53 +++++-- .../tool/commands/rebaseline_test_unittest.py | 2 + .../tool/commands/rebaseline_unittest.py | 9 +- 9 files changed, 299 insertions(+), 48 deletions(-) diff --git a/third_party/blink/tools/blinkpy/common/net/results_fetcher.py b/third_party/blink/tools/blinkpy/common/net/results_fetcher.py index 41d97b94d2220c..fe8b8d16247957 100644 --- a/third_party/blink/tools/blinkpy/common/net/results_fetcher.py +++ b/third_party/blink/tools/blinkpy/common/net/results_fetcher.py @@ -49,6 +49,11 @@ RESULTS_URL_BASE = '%s/data/layout_results' % TEST_RESULTS_SERVER RESULTS_SUMMARY_URL_BASE = 'https://storage.googleapis.com/chromium-layout-test-archives' +PREDICATE_UNEXPECTED_RESULTS = { + "expectancy": "VARIANTS_WITH_ONLY_UNEXPECTED_RESULTS", + "excludeExonerated": True +} + class Build(collections.namedtuple('Build', ('builder_name', 'build_number', 'build_id'))): @@ -74,6 +79,7 @@ class TestResultsFetcher(object): def __init__(self): self.web = Web() self.builders = BuilderList.load_default_builder_list(FileSystem()) + self._webtest_results_resultdb = None def results_url(self, builder_name, build_number=None, step_name=None): """Returns a URL for one set of archived web test results. @@ -96,6 +102,35 @@ def results_url(self, builder_name, build_number=None, step_name=None): return '%s/%s/layout-test-results' % (url_base, build_number) return self.accumulated_results_url_base(builder_name) + def get_artifact_list_for_test(self, host, result_name): + """Fetches the list of artifacts for a test-result. + """ + luci_token = LuciAuth(host).get_access_token() + + url = 'https://results.api.cr.dev/prpc/luci.resultdb.v1.ResultDB/ListArtifacts' + header = { + 'Authorization': 'Bearer ' + luci_token, + 'Accept': 'application/json', + 'Content-Type': 'application/json', + } + + data = { + "parent": result_name, + } + + req_body = json.dumps(data).encode("utf-8") + response = self.do_request_with_retries('POST', url, req_body, header) + if response is None: + _log.warning("Failed to get baseline artifacts") + if response.getcode() == 200: + response_body = response.read() + + RESPONSE_PREFIX = b")]}'" + if response_body.startswith(RESPONSE_PREFIX): + response_body = response_body[len(RESPONSE_PREFIX):] + res = json.loads(response_body) + return res['artifacts'] + def get_full_builder_url(self, url_base, builder_name): """ Returns the url for a builder directory in google storage. @@ -162,6 +197,19 @@ def do_request_with_retries(self, method, url, data, headers): _log.error("Http request failed for %s" % data) return None + @memoized + def fetch_results_from_resultdb_layout_tests(self, host, build, + unexpected_results): + rv = [] + if unexpected_results: + predicate = PREDICATE_UNEXPECTED_RESULTS + else: + predicate = "" + rv = self.fetch_results_from_resultdb(host, [build], predicate) + self._webtest_results_resultdb = WebTestResults.results_from_resultdb( + rv) + return self._webtest_results_resultdb + def fetch_results_from_resultdb(self, host, builds, predicate): """Returns a list of test results from ResultDB """ diff --git a/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py b/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py index f4c4cd82d5076b..6efd260f3c6829 100644 --- a/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py +++ b/third_party/blink/tools/blinkpy/common/net/results_fetcher_mock.py @@ -38,6 +38,7 @@ class MockTestResultsFetcher(TestResultsFetcher): def __init__(self): super(MockTestResultsFetcher, self).__init__() self._canned_results = {} + self._canned_artifacts_resultdb = {} self._canned_retry_summary_json = {} self._webdriver_results = {} self.fetched_builds = [] @@ -66,6 +67,15 @@ def fetch_results_from_resultdb(self, host, builds, predicate): rv.extend(results) return rv + def fetch_results_from_resultdb_layout_tests(self, host, build, predicate): + return self._canned_results.get(build.build_id) + + def get_artifact_list_for_test(self, host, result_id): + return self._canned_artifacts_resultdb[result_id] + + def set_artifact_list_for_test(self, host, artifacts): + self._canned_artifacts_resultdb = artifacts + def set_webdriver_test_results(self, build, m, results): self._webdriver_results[(build, m)] = results diff --git a/third_party/blink/tools/blinkpy/common/net/web_test_results.py b/third_party/blink/tools/blinkpy/common/net/web_test_results.py index c0835664831f31..733170f2aa46bd 100644 --- a/third_party/blink/tools/blinkpy/common/net/web_test_results.py +++ b/third_party/blink/tools/blinkpy/common/net/web_test_results.py @@ -134,6 +134,18 @@ def results_from_string(cls, string, step_name=None): return cls(json_dict, step_name=step_name) + @classmethod + def results_from_resultdb(cls, rv, step_name=None): + """Creates a WebTestResults object from a resultDB RPC response data. + + Args: + rv: resultDB RPC response json containing web test result. + """ + if not rv: + return None + + return cls(rv, step_name=step_name) + def __init__(self, parsed_json, chromium_revision=None, step_name=None): self._results = parsed_json self._chromium_revision = chromium_revision @@ -194,3 +206,6 @@ def add_if_passes(result): def didnt_run_as_expected_results(self): return self._filter_tests(lambda r: not r.did_run_as_expected()) + + def test_results_resultdb(self): + return self._results diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py index b00798bf03343a..d78924057c1c37 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py @@ -102,6 +102,22 @@ class AbstractRebaseliningCommand(Command): 'FlagSpecificConfig. This option will rebaseline ' 'results for the given FlagSpecificConfig while ignoring results ' 'from other builders.')) + resultDB_option = optparse.make_option( + '--resultDB', + default=False, + action='store_true', + help=('Fetch results from resultDB(WIP). ' + 'Works with --test-name-file ' + 'and positional parameters')) + + fetch_url_option = optparse.make_option( + '--fetch-url', + default=None, + action='store', + help=('Comma separated list of complete urls to fetch the baseline ' + 'artifact from. Developers do not need this option while ' + 'using rebaseline-cl. Default is empty. ' + 'When this is empty baselines will not be downloaded')) def __init__(self, options=None): super(AbstractRebaseliningCommand, self).__init__(options=options) @@ -319,6 +335,26 @@ def _builders_to_fetch_from(self, builders_to_check): wpt_builders.add(builder) return set(builders_to_fallback_paths) | wpt_builders + def baseline_fetch_url_resultdb(self, test_name, build): + # TODO(preethim): Consider doing QueryArtifacts do a walk of that list for + # test of interest than sending out the RPC for every test. + webtest_results_resultdb = self._tool.results_fetcher.fetch_results_from_resultdb_layout_tests( + self._tool, build, True) + results_list = webtest_results_resultdb.test_results_resultdb() + artifact_fetch_urls = [] + done = False + for result in results_list: + if done: + break + if test_name in result['testId']: + artifact_list = self._tool.results_fetcher.get_artifact_list_for_test( + self._tool, result['name']) + for artifact in artifact_list: + if 'actual' in artifact['artifactId']: + artifact_fetch_urls.append(artifact['fetchUrl']) + done = True + return artifact_fetch_urls + def _rebaseline_commands(self, test_baseline_set, options): path_to_blink_tool = self._tool.path() cwd = self._tool.git().checkout_root @@ -395,6 +431,11 @@ def _rebaseline_commands(self, test_baseline_set, options): if step_name: args.extend(['--step-name', step_name]) + if options.resultDB: + args.append('--resultDB') + fetch_urls = self.baseline_fetch_url_resultdb(test, build) + args.extend(['--fetch-url', ','.join(fetch_urls)]) + rebaseline_command = [ self._tool.executable, path_to_blink_tool, 'rebaseline-test-internal' diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py index 4eb4f3a0faacd9..f7b6fc3777c88e 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py @@ -93,11 +93,19 @@ def __init__(self): '--patchset', default=None, help='Patchset number to fetch new baselines from.'), + optparse.make_option('--resultDB', + dest='resultDB', + default=False, + action='store_true', + help=('Fetch results from resultDB(WIP). ' + 'Works with --test-name-file ' + 'and positional parameters')), self.no_optimize_option, self.results_directory_option, ]) self.git_cl = None self._selected_try_bots = None + self._resultdb_fetcher = False def execute(self, options, args, tool): self._tool = tool @@ -126,6 +134,8 @@ def execute(self, options, args, tool): 'Aborted: builder %s not found in builder list.' % options.flag_specific) return 1 + if options.resultDB: + self._resultdb_fetcher = True jobs = self.git_cl.latest_try_jobs( builder_names=self.selected_try_bots, patchset=options.patchset) @@ -285,6 +295,7 @@ def _fetch_results(self, jobs): """ results_fetcher = self._tool.results_fetcher results = {} + results_url = '' for build, status in jobs.items(): if status == TryJobStatus('COMPLETED', 'SUCCESS'): @@ -296,9 +307,14 @@ def _fetch_results(self, jobs): # Only completed failed builds will contain actual failed # web tests to download baselines for. continue - results_url = results_fetcher.results_url(build.builder_name, - build.build_number) - web_test_results = results_fetcher.fetch_results(build) + if self._resultdb_fetcher: + web_test_results = results_fetcher.fetch_results_from_resultdb_layout_tests( + self._tool, build, True) + else: + results_url = results_fetcher.results_url( + build.builder_name, build.build_number) + web_test_results = results_fetcher.fetch_results(build) + if web_test_results is None: _log.info('Failed to fetch results for "%s".', build.builder_name) diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py index 3f5a41147fdbab..b568fb90d40bb3 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py @@ -29,21 +29,21 @@ def setUp(self): BaseTestCase.setUp(self) LoggingTestCase.setUp(self) self.maxDiff = None - builds = { - Build('MOCK Try Win', 5000): + self.builds = { + Build('MOCK Try Win', 5000, 'Build-1'): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): + Build('MOCK Try Mac', 4000, 'Build-2'): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Linux', 6000): + Build('MOCK Try Linux', 6000, 'Build-3'): TryJobStatus('COMPLETED', 'FAILURE'), # Test the special case for experimental builders # Highdpi is an experimental builder whose status # is returned as ('COMPLETED', 'SUCCESS') even with failures. - Build('MOCK Try Highdpi', 8000): + Build('MOCK Try Highdpi', 8000, 'Build-4'): TryJobStatus('COMPLETED', 'SUCCESS'), } - self.command.git_cl = MockGitCL(self.tool, builds) + self.command.git_cl = MockGitCL(self.tool, self.builds) git = MockGit( filesystem=self.tool.filesystem, executive=self.tool.executive) @@ -148,8 +148,54 @@ def setUp(self): }, }, }) + self.web_test_resultsdb = WebTestResults([ + { + "name": "tests/two/image-fail.html/results/2", + "testId": "ninja://:blink_web_tests/two/image-fail.html", + "resultId": "2", + "variant": { + "def": { + "builder": "", + "os": "", + "test_suite": "blink_web_tests" + } + }, + "status": "FAIL" + }, + { + "name": "tests/one/missing.html/results/1", + "testId": "ninja://:blink_web_tests/one/image-fail.html", + "resultId": "1", + "variant": { + "def": { + "builder": "", + "os": "", + "test_suite": "blink_web_tests" + } + }, + "status": "FAIL" + }, + ]) + self.test_artifacts_list = { + "tests/one/missing.html/results/1": [{ + "name": + "invocations/task-chromium-swarm.appspot.com-1/tests/ninja:%2F%2F:blink_web_tests%2Fone%2Fmissing.html/results/1", + "artifactId": "actual_image", + "fetchUrl": + "https://results.usercontent.cr.dev/invocations/task-chromium-swarm.appspot.com-1/tests/ninja:%2F%2F:blink_web_tests%2Fone%2Fmissing.html/results/artifacts/actual_image?token=1", + "contentType": "image/png", + }], + "tests/two/image-fail.html/results/2": [{ + "name": + "invocations/task-chromium-swarm.appspot.com-2/tests/ninja:%2F%2F:blink_web_tests%2Ftwo%2Fimage-fail.html/results/2", + "artifactId": "actual_image", + "fetchUrl": + "https://results.usercontent.cr.dev/invocations/task-chromium-swarm.appspot.com-2/tests/ninja:%2F%2F:blink_web_tests%2Ftwo%2Fimage-fail.html/results/artifacts/actual_image?token=2", + "contentType": "image/png", + }] + } - for build in builds: + for build in self.builds: self.tool.results_fetcher.set_results(build, web_test_results) self.tool.results_fetcher.set_retry_sumary_json( build, @@ -198,7 +244,8 @@ def command_options(**kwargs): 'builders': [], 'patchset': None, 'use_blink_try_bots_only': False, - 'flag_specific': None + 'flag_specific': None, + 'resultDB': None } options.update(kwargs) return optparse.Values(dict(**options)) @@ -243,6 +290,35 @@ def test_execute_with_test_name_file(self): 'INFO: Rebaselining two/image-fail.html\n', ]) + def test_execute_with_test_name_file_resultDB(self): + fs = self.mac_port.host.filesystem + test_name_file = fs.mktemp() + fs.write_text_file( + test_name_file, + textwrap.dedent(''' + one/missing.html + two/missing.html + # one/slow-fail.html + # + + two/image-fail.html ''')) + for build in self.builds: + self.tool.results_fetcher.set_results_to_resultdb( + build, self.web_test_resultsdb) + self.tool.results_fetcher.set_artifact_list_for_test( + build, self.test_artifacts_list) + exit_code = self.command.execute( + self.command_options(test_name_file=test_name_file, resultDB=True), + [], self.tool) + self.assertEqual(exit_code, 0) + self.assertLog([ + 'INFO: Finished try jobs found for all try bots.\n', + 'INFO: Reading list of tests to rebaseline from %s\n' % + test_name_file, + 'INFO: Rebaselining one/missing.html\n', + 'INFO: Rebaselining two/image-fail.html\n', + ]) + def test_execute_with_no_issue_number_aborts(self): # If the user hasn't uploaded a CL, an error message is printed. self.command.git_cl = MockGitCL(self.tool, issue_number='None') @@ -309,9 +385,12 @@ def test_execute_one_missing_build(self): def test_execute_with_unfinished_jobs(self): builds = { - Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): TryJobStatus('STARTED'), - Build('MOCK Try Linux', 6000): TryJobStatus('SCHEDULED'), + Build('MOCK Try Win', 5000, 'Build-1'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Mac', 4000, 'Build-2'): + TryJobStatus('STARTED'), + Build('MOCK Try Linux', 6000, 'Build-3'): + TryJobStatus('SCHEDULED'), } self.command.git_cl = MockGitCL(self.tool, builds) exit_code = self.command.execute(self.command_options(), [], self.tool) @@ -331,10 +410,12 @@ def test_execute_with_unfinished_jobs(self): def test_execute_with_canceled_job(self): builds = { - Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Linux', 6000): TryJobStatus( - 'COMPLETED', 'CANCELED'), + Build('MOCK Try Win', 5000, 'Build-1'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Mac', 4000, 'Build-2'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Linux', 6000, 'Build-3'): + TryJobStatus('COMPLETED', 'CANCELED'), } self.command.git_cl = MockGitCL(self.tool, builds) exit_code = self.command.execute(self.command_options(), [], self.tool) @@ -349,10 +430,12 @@ def test_execute_with_canceled_job(self): def test_execute_with_passing_jobs(self): builds = { - Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): TryJobStatus('COMPLETED', 'SUCCESS'), - Build('MOCK Try Linux', 6000): TryJobStatus( - 'COMPLETED', 'SUCCESS'), + Build('MOCK Try Win', 5000, 'Build-1'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Mac', 4000, 'Build-2'): + TryJobStatus('COMPLETED', 'SUCCESS'), + Build('MOCK Try Linux', 6000, 'Build-3'): + TryJobStatus('COMPLETED', 'SUCCESS'), } self.command.git_cl = MockGitCL(self.tool, builds) exit_code = self.command.execute(self.command_options(), [], self.tool) @@ -368,8 +451,10 @@ def test_execute_with_passing_jobs(self): def test_execute_with_no_trigger_jobs_option(self): builds = { - Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Win', 5000, 'Build-1'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Mac', 4000, 'Build-2'): + TryJobStatus('COMPLETED', 'FAILURE'), } self.command.git_cl = MockGitCL(self.tool, builds) exit_code = self.command.execute( @@ -401,10 +486,12 @@ def test_execute_with_test_that_fails_on_retry(self): # In this example, one test failed both with and without the patch # in the try job, so it is not rebaselined. builds = { - Build('MOCK Try Win', 5000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Mac', 4000): TryJobStatus('COMPLETED', 'FAILURE'), - Build('MOCK Try Linux', 6000): TryJobStatus( - 'COMPLETED', 'FAILURE'), + Build('MOCK Try Win', 5000, 'Build-1'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Mac', 4000, 'Build-2'): + TryJobStatus('COMPLETED', 'FAILURE'), + Build('MOCK Try Linux', 6000, 'Build-3'): + TryJobStatus('COMPLETED', 'FAILURE'), } for build in builds: self.tool.results_fetcher.set_retry_sumary_json( @@ -424,7 +511,7 @@ def test_execute_with_no_retry_summary_downloaded(self): # In this example, the retry summary could not be downloaded, so # a warning is printed and all tests are rebaselined. self.tool.results_fetcher.set_retry_sumary_json( - Build('MOCK Try Win', 5000), None) + Build('MOCK Try Win', 5000, 'Build-1'), None) exit_code = self.command.execute(self.command_options(), [], self.tool) self.assertEqual(exit_code, 0) self.assertLog([ @@ -459,8 +546,8 @@ def test_rebaseline_command_invocations(self): 'one/flaky-fail.html') self._write(path, 'contents') test_baseline_set = TestBaselineSet(self.tool) - test_baseline_set.add('one/flaky-fail.html', Build( - 'MOCK Try Win', 5000)) + test_baseline_set.add('one/flaky-fail.html', + Build('MOCK Try Win', 5000, 'Build-1')) self.command.rebaseline(self.command_options(), test_baseline_set) self.assertEqual(self.tool.executive.calls, [[[ @@ -519,7 +606,7 @@ def test_trigger_try_jobs(self): def test_execute_missing_results_with_no_fill_missing_prompts(self): self.tool.results_fetcher.set_results( - Build('MOCK Try Win', 5000), None) + Build('MOCK Try Win', 5000, 'Build-1'), None) exit_code = self.command.execute(self.command_options(), [], self.tool) self.assertEqual(exit_code, 1) self.assertLog([ @@ -536,7 +623,7 @@ def test_execute_missing_results_with_no_fill_missing_prompts(self): def test_execute_missing_results_with_fill_missing_continues(self): self.tool.results_fetcher.set_results( - Build('MOCK Try Win', 5000), None) + Build('MOCK Try Win', 5000, 'Build-1'), None) exit_code = self.command.execute( self.command_options(fill_missing=True), ['one/flaky-fail.html'], self.tool) diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py index fc959a4cb9a64e..a33476c91ad460 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py @@ -23,6 +23,8 @@ def __init__(self): self.step_name_option, self.results_directory_option, self.flag_specific_option, + self.resultDB_option, + self.fetch_url_option, ]) def execute(self, options, args, tool): @@ -31,10 +33,11 @@ def execute(self, options, args, tool): def _rebaseline_test_and_update_expectations(self, options): self._baseline_suffix_list = options.suffixes.split(',') - + results_url = '' + suffix = '' if options.results_directory: results_url = 'file://' + options.results_directory - else: + elif not options.resultDB: results_url = self._tool.results_fetcher.results_url( options.builder, build_number=options.build_number, @@ -43,20 +46,42 @@ def _rebaseline_test_and_update_expectations(self, options): port_name = options.port_name or self._tool.builders.port_name_for_builder_name( options.builder) test_name = options.test - for suffix in self._baseline_suffix_list: - self._rebaseline_test(port_name, - test_name, - suffix, - results_url, - self._tool.builders.is_wpt_builder( - options.builder), - options=options) + if not options.resultDB: + for suffix in self._baseline_suffix_list: + self._rebaseline_test(port_name, + test_name, + suffix, + results_url, + self._tool.builders.is_wpt_builder( + options.builder), + options=options) + else: + self._baseline_fetch_url_list = options.fetch_url.split(',') + if not self._baseline_fetch_url_list: + _log.warning('No baseline fetch url found for test %s', + test_name) + for artifact_fetch_url in self._baseline_fetch_url_list: + if 'actual_image' in artifact_fetch_url: + suffix = 'png' + if 'actual_text' in artifact_fetch_url: + suffix = 'txt' + if 'actual_audio' in artifact_fetch_url: + suffix = 'wav' + self._rebaseline_test(port_name, + test_name, + suffix, + results_url, + artifact_fetch_url, + self._tool.builders.is_wpt_builder( + options.builder), + options=options) def _rebaseline_test(self, port_name, test_name, suffix, results_url, + fetch_url_resultdb='', is_wpt=False, options=None): """Downloads a baseline file and saves it to the filesystem. @@ -82,8 +107,12 @@ def _rebaseline_test(self, else: baseline_directory = port.baseline_version_dir() - source_baseline = '%s/%s' % ( - results_url, self._file_name_for_actual_result(test_name, suffix)) + if options and options.resultDB: + source_baseline = fetch_url_resultdb + else: + source_baseline = '%s/%s' % (results_url, + self._file_name_for_actual_result( + test_name, suffix)) target_baseline = self._tool.filesystem.join( baseline_directory, self._file_name_for_expected_result(test_name, suffix, is_wpt)) diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py index 53aec422c4222d..f8cb81fe77de41 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py @@ -27,6 +27,7 @@ def options(**kwargs): 'build_number': None, 'step_name': None, 'flag_specific': None, + 'resultDB': None, }, **kwargs)) def test_rebaseline_test_internal_with_port_that_lacks_buildbot(self): @@ -55,6 +56,7 @@ def test_rebaseline_test_internal_with_port_that_lacks_buildbot(self): 'build_number': None, 'step_name': None, 'flag_specific': None, + 'resultDB': None, }) oc.capture_output() self.command.execute(options, [], self.tool) diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py index a215313c9758f7..2b6a4c448e2bb8 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py @@ -303,7 +303,8 @@ def options(**kwargs): 'optimize': True, 'verbose': True, 'results_directory': None, - 'flag_specific': None + 'flag_specific': None, + 'resultDB': None }, **kwargs)) def test_rebaseline_test_passes_on_all_builders(self): @@ -565,7 +566,8 @@ def options(): 'optimize': False, 'verbose': True, 'results_directory': None, - 'flag_specific': None + 'flag_specific': None, + 'resultDB': None }) # In the following test cases, we use a mock rebaseline-test-internal to @@ -922,7 +924,8 @@ def options(): 'builders': None, 'suffixes': 'png,txt', 'verbose': True, - 'flag_specific': None + 'flag_specific': None, + 'resultDB': None }) def test_rebaseline(self): From 0c0a3654694f3f9ae6b6e3fb0659f05fe20bbd04 Mon Sep 17 00:00:00 2001 From: David Black Date: Tue, 14 Dec 2021 06:43:16 +0000 Subject: [PATCH 19/45] Update toggle colors to match spec. Dark (before): http://shortn/_vxfud4oAu2 Dark (after): http://shortn/_exj8Nqb228 Light (before): http://shortn/_b9BkhxVtbz Light (after): http://shortn/_Sdd1fqnSb1 Bug: 1279660 Change-Id: Id681a742d50dd036bb6893d90a06f13d81678378 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337396 Reviewed-by: Kyle Horimoto Commit-Queue: David Black Cr-Commit-Position: refs/heads/main@{#951392} --- ui/chromeos/styles/cros_colors.json5 | 10 ++++++++-- .../cr_elements/chromeos/cros_color_overrides.html | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ui/chromeos/styles/cros_colors.json5 b/ui/chromeos/styles/cros_colors.json5 index 1ac6c0c62f03c3..4a1eabb4935309 100644 --- a/ui/chromeos/styles/cros_colors.json5 +++ b/ui/chromeos/styles/cros_colors.json5 @@ -224,8 +224,14 @@ menu_item_ripple_color: "$ripple_color", toggle_color: "$color_prominent", - toggle_bg_color_inactive: "$google_grey_400", - toggle_button_color_inactive: "$white", + toggle_bg_color_inactive: { + light: "rgba($google_grey_700_rgb, $second_tone_opacity)", + dark: "rgba($google_grey_200_rgb, $second_tone_opacity)" + }, + toggle_button_color_inactive: { + light: "$white", + dark: "$google_grey_400" + }, toggle_ripple_color: "rgba($toggle_color_rgb, .2)", toggle_ripple_color_inactive: "rgba($google_grey_600_rgb, .15)", diff --git a/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.html b/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.html index fcdf16bf78fe0c..b8ee110ea2b40c 100644 --- a/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.html +++ b/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.html @@ -39,6 +39,7 @@ :host-context([cros]) cr-toggle { --cr-toggle-checked-bar-color: var(--cros-toggle-color); + --cr-toggle-checked-bar-opacity: var(--cros-second-tone-opacity); --cr-toggle-checked-button-color: var(--cros-toggle-color); --cr-toggle-checked-ripple-color: var(--cros-toggle-ripple-color); --cr-toggle-unchecked-bar-color: var(--cros-toggle-bg-color-inactive); From 6581237ca5668a18b7743554ad6fdbed6bc64fa3 Mon Sep 17 00:00:00 2001 From: David Black Date: Tue, 14 Dec 2021 07:04:25 +0000 Subject: [PATCH 20/45] personalization: Stub in rendering for a Google Photos album. When an album is selected, the photos belonging to that album should be rendered. This results in a data fetch if photos for the album have not previously been fetched. Bug: b:207025665 Change-Id: I5f26ac6ef8d97229b9fc12774a2d39f4835ca483 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3292164 Reviewed-by: Jeffrey Young Commit-Queue: David Black Cr-Commit-Position: refs/heads/main@{#951393} --- .../personalization_app/resources/BUILD.gn | 1 + .../resources/common/styles.html | 6 + .../personalization_router_element.html | 1 + .../wallpaper/google_photos_albums_element.js | 9 +- .../google_photos_collection_element.html | 14 +- .../google_photos_collection_element.js | 45 ++++- ...gle_photos_photos_by_album_id_element.html | 28 ++++ ...oogle_photos_photos_by_album_id_element.ts | 155 ++++++++++++++++++ .../wallpaper/google_photos_photos_element.js | 13 +- .../trusted/wallpaper/wallpaper_subpage.ts | 1 + .../google_photos_collection_element_test.js | 48 +++++- ..._photos_photos_by_album_id_element_test.js | 128 +++++++++++++++ .../personalization_app_component_test.js | 2 + 13 files changed, 421 insertions(+), 30 deletions(-) create mode 100644 ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_by_album_id_element.html create mode 100644 ash/webui/personalization_app/resources/trusted/wallpaper/google_photos_photos_by_album_id_element.ts create mode 100644 chrome/test/data/webui/chromeos/personalization_app/google_photos_photos_by_album_id_element_test.js diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn index 080e3933d56853..f8c1953513b189 100644 --- a/ash/webui/personalization_app/resources/BUILD.gn +++ b/ash/webui/personalization_app/resources/BUILD.gn @@ -47,6 +47,7 @@ polymer_js_files = [ "trusted/personalization_breadcrumb_element.ts", "trusted/wallpaper/google_photos_albums_element.js", "trusted/wallpaper/google_photos_collection_element.js", + "trusted/wallpaper/google_photos_photos_by_album_id_element.ts", "trusted/wallpaper/google_photos_photos_element.js", "trusted/wallpaper/google_photos_zero_state_element.js", "trusted/wallpaper/local_images_element.ts", diff --git a/ash/webui/personalization_app/resources/common/styles.html b/ash/webui/personalization_app/resources/common/styles.html index f24758af924018..6e39147144af00 100644 --- a/ash/webui/personalization_app/resources/common/styles.html +++ b/ash/webui/personalization_app/resources/common/styles.html @@ -1,5 +1,11 @@