diff --git a/DEPS b/DEPS index 599934e..a444026 100644 --- a/DEPS +++ b/DEPS
@@ -306,11 +306,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '9d220ebe40a0e8537f3e37d8ac1fbe4ac4dfa43a', + 'skia_revision': 'f3401c6186c1371361f8c4042c9a927c1221c29a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '13b0f9f24b88983f07952beb652e1bce97a4deb6', + 'v8_revision': 'f906e925e1400ce4f4561ca712db612d13b08ecf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -397,7 +397,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'c7e8227f786e657d8f82d6e9f1de859ed60280df', + 'devtools_frontend_revision': 'b1c975718f05be94786dce33e6d4442dcfeae6ed', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -421,7 +421,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '3c117aa551537c3e7cc0f8cbb05d85fe76d466fc', + 'dawn_revision': 'c704dd55195ff489fda18c7ce9f73dfa3be2b48c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -465,7 +465,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'cros_components_revision': 'b7deff896ee3186e7d33a52ddde07da2400de2ad', + 'cros_components_revision': 'efb676910c7e96c78bb050ee100e47f4addf23d1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -821,7 +821,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'a60e161b8d92adf6d1a44622e66d17ff3b52e6e5', + '71dddbd0f90161e04d335f5a91d520455a45f8c4', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1199,7 +1199,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '14464a6787e9a358a6acdc532568e6fe3a347344', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'b5e20256983e9c53f986d0da955d8e45a4a0be92', 'condition': 'checkout_src_internal', }, @@ -1664,7 +1664,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '870ace23995e3eef1682a224b2c60d7d58215a81', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a4488671e30a2c1617b86190860b0dfd1afeb488', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1849,7 +1849,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '666950d6de30c9c26773208b0f861463b25ae37c', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'e6df126b798c0644010afeaddeb2e13053d8f192', + Var('webrtc_git') + '/src.git' + '@' + '161d2c84528ec9eb0c19bfb51024bca54353abc4', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1972,7 +1972,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '3Qbtr1ROVR8xYc3CYHk5WdgZ3HQLPITOB2NICHFQMG8C', + 'version': 'TQjn5G3UI76ngmYjyT81Iz3XSGriFhuN7XQPrrDWbesC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2016,7 +2016,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'FTl2iAAP0OjIKhfi-fpg36FwZwxgLzNFMNRn1JM_iVcC', + 'version': '2jvMrTVoKlVXZylqFkp8D1JB0l7Xqm2KwBjPta5MioIC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4006,7 +4006,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'b8fd6d1953501218760e0f7e2f0485c44d4925c1', + '88f7c14d049dcca81d3515f989101f080d8557e1', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/browser/aw_feature_list_creator.cc b/android_webview/browser/aw_feature_list_creator.cc index 79be466..6c965909 100644 --- a/android_webview/browser/aw_feature_list_creator.cc +++ b/android_webview/browser/aw_feature_list_creator.cc
@@ -256,6 +256,11 @@ // able to break seed downloads. See https://crbug.com/801771 for more info. variations::SafeSeedManager ignored_safe_seed_manager(local_state_.get()); + base::Time fetchTime = + variations_field_trial_creator_->CalculateSeedFreshness(); + long seedFreshnessMinutes = (base::Time::Now() - fetchTime).InMinutes(); + CacheSeedFreshness(seedFreshnessMinutes); + auto feature_list = std::make_unique<base::FeatureList>(); std::vector<std::string> variation_ids = aw_feature_entries::RegisterEnabledFeatureEntries(feature_list.get());
diff --git a/android_webview/browser/variations/variations_seed_loader.cc b/android_webview/browser/variations/variations_seed_loader.cc index 22d24a7..d06e7d6c 100644 --- a/android_webview/browser/variations/variations_seed_loader.cc +++ b/android_webview/browser/variations/variations_seed_loader.cc
@@ -117,4 +117,9 @@ return seed; } +void CacheSeedFreshness(long freshness) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_VariationsSeedLoader_cacheSeedFreshness(env, freshness); +} + } // namespace android_webview
diff --git a/android_webview/browser/variations/variations_seed_loader.h b/android_webview/browser/variations/variations_seed_loader.h index 995ad98d..4b8a49fe 100644 --- a/android_webview/browser/variations/variations_seed_loader.h +++ b/android_webview/browser/variations/variations_seed_loader.h
@@ -13,6 +13,8 @@ std::unique_ptr<AwVariationsSeed> TakeSeed(); +void CacheSeedFreshness(long freshness); + } // namespace android_webview #endif // ANDROID_WEBVIEW_BROWSER_VARIATIONS_VARIATIONS_SEED_LOADER_H_
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected index 0632787..63d1d32e 100644 --- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -5,7 +5,7 @@ platformBuildVersionCode="34" platformBuildVersionName="14" android:isolatedSplits="true" - android:versionCode="OFFSET=0" + android:versionCode="OFFSET=1" android:versionName="#.#.#.#"> <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.software.leanback" android:required="false"/> @@ -21,7 +21,8 @@ android:extractNativeLibs="false" android:icon="@$PACKAGE:drawable/icon_webview" android:label="Android System WebView" - android:multiArch="true"> + android:multiArch="true" + android:use32bitAbi="true"> <activity # DIFF-ANCHOR: ea1a94af android:name="com.google.android.gms.common.api.GoogleApiActivity" android:exported="false"
diff --git a/android_webview/expectations/trichrome_webview_32_bundle.arm64.libs_and_assets.expected b/android_webview/expectations/trichrome_webview_32_bundle.arm64.libs_and_assets.expected index 508a001d..9b76ad74 100644 --- a/android_webview/expectations/trichrome_webview_32_bundle.arm64.libs_and_assets.expected +++ b/android_webview/expectations/trichrome_webview_32_bundle.arm64.libs_and_assets.expected
@@ -1,91 +1,7 @@ apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 -apk_path=assets/locales/af.pak, compress=False, alignment=4 -apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 -apk_path=assets/locales/ar.pak, compress=False, alignment=4 -apk_path=assets/locales/as.pak, compress=False, alignment=4 -apk_path=assets/locales/az.pak, compress=False, alignment=4 -apk_path=assets/locales/be.pak, compress=False, alignment=4 -apk_path=assets/locales/bg.pak, compress=False, alignment=4 -apk_path=assets/locales/bn.pak, compress=False, alignment=4 -apk_path=assets/locales/bs.pak, compress=False, alignment=4 -apk_path=assets/locales/ca.pak, compress=False, alignment=4 -apk_path=assets/locales/cs.pak, compress=False, alignment=4 -apk_path=assets/locales/da.pak, compress=False, alignment=4 -apk_path=assets/locales/de.pak, compress=False, alignment=4 -apk_path=assets/locales/el.pak, compress=False, alignment=4 -apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 -apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 -apk_path=assets/locales/es-419.pak, compress=False, alignment=4 -apk_path=assets/locales/es.pak, compress=False, alignment=4 -apk_path=assets/locales/et.pak, compress=False, alignment=4 -apk_path=assets/locales/eu.pak, compress=False, alignment=4 -apk_path=assets/locales/fa.pak, compress=False, alignment=4 -apk_path=assets/locales/fi.pak, compress=False, alignment=4 -apk_path=assets/locales/fil.pak, compress=False, alignment=4 -apk_path=assets/locales/fr-CA.pak, compress=False, alignment=4 -apk_path=assets/locales/fr.pak, compress=False, alignment=4 -apk_path=assets/locales/gl.pak, compress=False, alignment=4 -apk_path=assets/locales/gu.pak, compress=False, alignment=4 -apk_path=assets/locales/he.pak, compress=False, alignment=4 -apk_path=assets/locales/hi.pak, compress=False, alignment=4 -apk_path=assets/locales/hr.pak, compress=False, alignment=4 -apk_path=assets/locales/hu.pak, compress=False, alignment=4 -apk_path=assets/locales/hy.pak, compress=False, alignment=4 -apk_path=assets/locales/id.pak, compress=False, alignment=4 -apk_path=assets/locales/is.pak, compress=False, alignment=4 -apk_path=assets/locales/it.pak, compress=False, alignment=4 -apk_path=assets/locales/ja.pak, compress=False, alignment=4 -apk_path=assets/locales/ka.pak, compress=False, alignment=4 -apk_path=assets/locales/kk.pak, compress=False, alignment=4 -apk_path=assets/locales/km.pak, compress=False, alignment=4 -apk_path=assets/locales/kn.pak, compress=False, alignment=4 -apk_path=assets/locales/ko.pak, compress=False, alignment=4 -apk_path=assets/locales/ky.pak, compress=False, alignment=4 -apk_path=assets/locales/lo.pak, compress=False, alignment=4 -apk_path=assets/locales/lt.pak, compress=False, alignment=4 -apk_path=assets/locales/lv.pak, compress=False, alignment=4 -apk_path=assets/locales/mk.pak, compress=False, alignment=4 -apk_path=assets/locales/ml.pak, compress=False, alignment=4 -apk_path=assets/locales/mn.pak, compress=False, alignment=4 -apk_path=assets/locales/mr.pak, compress=False, alignment=4 -apk_path=assets/locales/ms.pak, compress=False, alignment=4 -apk_path=assets/locales/my.pak, compress=False, alignment=4 -apk_path=assets/locales/nb.pak, compress=False, alignment=4 -apk_path=assets/locales/ne.pak, compress=False, alignment=4 -apk_path=assets/locales/nl.pak, compress=False, alignment=4 -apk_path=assets/locales/or.pak, compress=False, alignment=4 -apk_path=assets/locales/pa.pak, compress=False, alignment=4 -apk_path=assets/locales/pl.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-BR.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-PT.pak, compress=False, alignment=4 -apk_path=assets/locales/ro.pak, compress=False, alignment=4 -apk_path=assets/locales/ru.pak, compress=False, alignment=4 -apk_path=assets/locales/si.pak, compress=False, alignment=4 -apk_path=assets/locales/sk.pak, compress=False, alignment=4 -apk_path=assets/locales/sl.pak, compress=False, alignment=4 -apk_path=assets/locales/sq.pak, compress=False, alignment=4 -apk_path=assets/locales/sr-Latn.pak, compress=False, alignment=4 -apk_path=assets/locales/sr.pak, compress=False, alignment=4 -apk_path=assets/locales/sv.pak, compress=False, alignment=4 -apk_path=assets/locales/sw.pak, compress=False, alignment=4 -apk_path=assets/locales/ta.pak, compress=False, alignment=4 -apk_path=assets/locales/te.pak, compress=False, alignment=4 -apk_path=assets/locales/th.pak, compress=False, alignment=4 -apk_path=assets/locales/tr.pak, compress=False, alignment=4 -apk_path=assets/locales/uk.pak, compress=False, alignment=4 -apk_path=assets/locales/ur.pak, compress=False, alignment=4 -apk_path=assets/locales/uz.pak, compress=False, alignment=4 -apk_path=assets/locales/vi.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-CN.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-HK.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-TW.pak, compress=False, alignment=4 -apk_path=assets/locales/zu.pak, compress=False, alignment=4 apk_path=assets/resources.pak, compress=False, alignment=4 apk_path=assets/stored-locales/af.pak, compress=False, alignment=4 apk_path=assets/stored-locales/am.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/ar.pak, compress=False, alignment=4 apk_path=assets/stored-locales/as.pak, compress=False, alignment=4 apk_path=assets/stored-locales/az.pak, compress=False, alignment=4 @@ -100,7 +16,6 @@ apk_path=assets/stored-locales/el.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es-419.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es.pak, compress=False, alignment=4 apk_path=assets/stored-locales/et.pak, compress=False, alignment=4
diff --git a/android_webview/expectations/trichrome_webview_64_32_bundle.arm64.libs_and_assets.expected b/android_webview/expectations/trichrome_webview_64_32_bundle.arm64.libs_and_assets.expected index 877ba5a..e9244d1 100644 --- a/android_webview/expectations/trichrome_webview_64_32_bundle.arm64.libs_and_assets.expected +++ b/android_webview/expectations/trichrome_webview_64_32_bundle.arm64.libs_and_assets.expected
@@ -1,96 +1,10 @@ -apk_path=lib/armeabi-v7a/libarcore_sdk_c.so, compress=False, alignment=4096 -apk_path=lib/armeabi-v7a/libchromium_android_linker.so, compress=False, alignment=4096 apk_path=lib/armeabi-v7a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 apk_path=lib/armeabi-v7a/libmonochrome_64.so, compress=False, alignment=4096 apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 -apk_path=assets/locales/af.pak, compress=False, alignment=4 -apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 -apk_path=assets/locales/ar.pak, compress=False, alignment=4 -apk_path=assets/locales/as.pak, compress=False, alignment=4 -apk_path=assets/locales/az.pak, compress=False, alignment=4 -apk_path=assets/locales/be.pak, compress=False, alignment=4 -apk_path=assets/locales/bg.pak, compress=False, alignment=4 -apk_path=assets/locales/bn.pak, compress=False, alignment=4 -apk_path=assets/locales/bs.pak, compress=False, alignment=4 -apk_path=assets/locales/ca.pak, compress=False, alignment=4 -apk_path=assets/locales/cs.pak, compress=False, alignment=4 -apk_path=assets/locales/da.pak, compress=False, alignment=4 -apk_path=assets/locales/de.pak, compress=False, alignment=4 -apk_path=assets/locales/el.pak, compress=False, alignment=4 -apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 -apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 -apk_path=assets/locales/es-419.pak, compress=False, alignment=4 -apk_path=assets/locales/es.pak, compress=False, alignment=4 -apk_path=assets/locales/et.pak, compress=False, alignment=4 -apk_path=assets/locales/eu.pak, compress=False, alignment=4 -apk_path=assets/locales/fa.pak, compress=False, alignment=4 -apk_path=assets/locales/fi.pak, compress=False, alignment=4 -apk_path=assets/locales/fil.pak, compress=False, alignment=4 -apk_path=assets/locales/fr-CA.pak, compress=False, alignment=4 -apk_path=assets/locales/fr.pak, compress=False, alignment=4 -apk_path=assets/locales/gl.pak, compress=False, alignment=4 -apk_path=assets/locales/gu.pak, compress=False, alignment=4 -apk_path=assets/locales/he.pak, compress=False, alignment=4 -apk_path=assets/locales/hi.pak, compress=False, alignment=4 -apk_path=assets/locales/hr.pak, compress=False, alignment=4 -apk_path=assets/locales/hu.pak, compress=False, alignment=4 -apk_path=assets/locales/hy.pak, compress=False, alignment=4 -apk_path=assets/locales/id.pak, compress=False, alignment=4 -apk_path=assets/locales/is.pak, compress=False, alignment=4 -apk_path=assets/locales/it.pak, compress=False, alignment=4 -apk_path=assets/locales/ja.pak, compress=False, alignment=4 -apk_path=assets/locales/ka.pak, compress=False, alignment=4 -apk_path=assets/locales/kk.pak, compress=False, alignment=4 -apk_path=assets/locales/km.pak, compress=False, alignment=4 -apk_path=assets/locales/kn.pak, compress=False, alignment=4 -apk_path=assets/locales/ko.pak, compress=False, alignment=4 -apk_path=assets/locales/ky.pak, compress=False, alignment=4 -apk_path=assets/locales/lo.pak, compress=False, alignment=4 -apk_path=assets/locales/lt.pak, compress=False, alignment=4 -apk_path=assets/locales/lv.pak, compress=False, alignment=4 -apk_path=assets/locales/mk.pak, compress=False, alignment=4 -apk_path=assets/locales/ml.pak, compress=False, alignment=4 -apk_path=assets/locales/mn.pak, compress=False, alignment=4 -apk_path=assets/locales/mr.pak, compress=False, alignment=4 -apk_path=assets/locales/ms.pak, compress=False, alignment=4 -apk_path=assets/locales/my.pak, compress=False, alignment=4 -apk_path=assets/locales/nb.pak, compress=False, alignment=4 -apk_path=assets/locales/ne.pak, compress=False, alignment=4 -apk_path=assets/locales/nl.pak, compress=False, alignment=4 -apk_path=assets/locales/or.pak, compress=False, alignment=4 -apk_path=assets/locales/pa.pak, compress=False, alignment=4 -apk_path=assets/locales/pl.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-BR.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-PT.pak, compress=False, alignment=4 -apk_path=assets/locales/ro.pak, compress=False, alignment=4 -apk_path=assets/locales/ru.pak, compress=False, alignment=4 -apk_path=assets/locales/si.pak, compress=False, alignment=4 -apk_path=assets/locales/sk.pak, compress=False, alignment=4 -apk_path=assets/locales/sl.pak, compress=False, alignment=4 -apk_path=assets/locales/sq.pak, compress=False, alignment=4 -apk_path=assets/locales/sr-Latn.pak, compress=False, alignment=4 -apk_path=assets/locales/sr.pak, compress=False, alignment=4 -apk_path=assets/locales/sv.pak, compress=False, alignment=4 -apk_path=assets/locales/sw.pak, compress=False, alignment=4 -apk_path=assets/locales/ta.pak, compress=False, alignment=4 -apk_path=assets/locales/te.pak, compress=False, alignment=4 -apk_path=assets/locales/th.pak, compress=False, alignment=4 -apk_path=assets/locales/tr.pak, compress=False, alignment=4 -apk_path=assets/locales/uk.pak, compress=False, alignment=4 -apk_path=assets/locales/ur.pak, compress=False, alignment=4 -apk_path=assets/locales/uz.pak, compress=False, alignment=4 -apk_path=assets/locales/vi.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-CN.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-HK.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-TW.pak, compress=False, alignment=4 -apk_path=assets/locales/zu.pak, compress=False, alignment=4 apk_path=assets/resources.pak, compress=False, alignment=4 apk_path=assets/snapshot_blob_32.bin, compress=False, alignment=4 apk_path=assets/stored-locales/af.pak, compress=False, alignment=4 apk_path=assets/stored-locales/am.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/ar.pak, compress=False, alignment=4 apk_path=assets/stored-locales/as.pak, compress=False, alignment=4 apk_path=assets/stored-locales/az.pak, compress=False, alignment=4 @@ -105,7 +19,6 @@ apk_path=assets/stored-locales/el.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es-419.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es.pak, compress=False, alignment=4 apk_path=assets/stored-locales/et.pak, compress=False, alignment=4
diff --git a/android_webview/expectations/trichrome_webview_64_bundle.arm64.libs_and_assets.expected b/android_webview/expectations/trichrome_webview_64_bundle.arm64.libs_and_assets.expected index 508a001d..9b76ad74 100644 --- a/android_webview/expectations/trichrome_webview_64_bundle.arm64.libs_and_assets.expected +++ b/android_webview/expectations/trichrome_webview_64_bundle.arm64.libs_and_assets.expected
@@ -1,91 +1,7 @@ apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 -apk_path=assets/locales/af.pak, compress=False, alignment=4 -apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 -apk_path=assets/locales/ar.pak, compress=False, alignment=4 -apk_path=assets/locales/as.pak, compress=False, alignment=4 -apk_path=assets/locales/az.pak, compress=False, alignment=4 -apk_path=assets/locales/be.pak, compress=False, alignment=4 -apk_path=assets/locales/bg.pak, compress=False, alignment=4 -apk_path=assets/locales/bn.pak, compress=False, alignment=4 -apk_path=assets/locales/bs.pak, compress=False, alignment=4 -apk_path=assets/locales/ca.pak, compress=False, alignment=4 -apk_path=assets/locales/cs.pak, compress=False, alignment=4 -apk_path=assets/locales/da.pak, compress=False, alignment=4 -apk_path=assets/locales/de.pak, compress=False, alignment=4 -apk_path=assets/locales/el.pak, compress=False, alignment=4 -apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 -apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 -apk_path=assets/locales/es-419.pak, compress=False, alignment=4 -apk_path=assets/locales/es.pak, compress=False, alignment=4 -apk_path=assets/locales/et.pak, compress=False, alignment=4 -apk_path=assets/locales/eu.pak, compress=False, alignment=4 -apk_path=assets/locales/fa.pak, compress=False, alignment=4 -apk_path=assets/locales/fi.pak, compress=False, alignment=4 -apk_path=assets/locales/fil.pak, compress=False, alignment=4 -apk_path=assets/locales/fr-CA.pak, compress=False, alignment=4 -apk_path=assets/locales/fr.pak, compress=False, alignment=4 -apk_path=assets/locales/gl.pak, compress=False, alignment=4 -apk_path=assets/locales/gu.pak, compress=False, alignment=4 -apk_path=assets/locales/he.pak, compress=False, alignment=4 -apk_path=assets/locales/hi.pak, compress=False, alignment=4 -apk_path=assets/locales/hr.pak, compress=False, alignment=4 -apk_path=assets/locales/hu.pak, compress=False, alignment=4 -apk_path=assets/locales/hy.pak, compress=False, alignment=4 -apk_path=assets/locales/id.pak, compress=False, alignment=4 -apk_path=assets/locales/is.pak, compress=False, alignment=4 -apk_path=assets/locales/it.pak, compress=False, alignment=4 -apk_path=assets/locales/ja.pak, compress=False, alignment=4 -apk_path=assets/locales/ka.pak, compress=False, alignment=4 -apk_path=assets/locales/kk.pak, compress=False, alignment=4 -apk_path=assets/locales/km.pak, compress=False, alignment=4 -apk_path=assets/locales/kn.pak, compress=False, alignment=4 -apk_path=assets/locales/ko.pak, compress=False, alignment=4 -apk_path=assets/locales/ky.pak, compress=False, alignment=4 -apk_path=assets/locales/lo.pak, compress=False, alignment=4 -apk_path=assets/locales/lt.pak, compress=False, alignment=4 -apk_path=assets/locales/lv.pak, compress=False, alignment=4 -apk_path=assets/locales/mk.pak, compress=False, alignment=4 -apk_path=assets/locales/ml.pak, compress=False, alignment=4 -apk_path=assets/locales/mn.pak, compress=False, alignment=4 -apk_path=assets/locales/mr.pak, compress=False, alignment=4 -apk_path=assets/locales/ms.pak, compress=False, alignment=4 -apk_path=assets/locales/my.pak, compress=False, alignment=4 -apk_path=assets/locales/nb.pak, compress=False, alignment=4 -apk_path=assets/locales/ne.pak, compress=False, alignment=4 -apk_path=assets/locales/nl.pak, compress=False, alignment=4 -apk_path=assets/locales/or.pak, compress=False, alignment=4 -apk_path=assets/locales/pa.pak, compress=False, alignment=4 -apk_path=assets/locales/pl.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-BR.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-PT.pak, compress=False, alignment=4 -apk_path=assets/locales/ro.pak, compress=False, alignment=4 -apk_path=assets/locales/ru.pak, compress=False, alignment=4 -apk_path=assets/locales/si.pak, compress=False, alignment=4 -apk_path=assets/locales/sk.pak, compress=False, alignment=4 -apk_path=assets/locales/sl.pak, compress=False, alignment=4 -apk_path=assets/locales/sq.pak, compress=False, alignment=4 -apk_path=assets/locales/sr-Latn.pak, compress=False, alignment=4 -apk_path=assets/locales/sr.pak, compress=False, alignment=4 -apk_path=assets/locales/sv.pak, compress=False, alignment=4 -apk_path=assets/locales/sw.pak, compress=False, alignment=4 -apk_path=assets/locales/ta.pak, compress=False, alignment=4 -apk_path=assets/locales/te.pak, compress=False, alignment=4 -apk_path=assets/locales/th.pak, compress=False, alignment=4 -apk_path=assets/locales/tr.pak, compress=False, alignment=4 -apk_path=assets/locales/uk.pak, compress=False, alignment=4 -apk_path=assets/locales/ur.pak, compress=False, alignment=4 -apk_path=assets/locales/uz.pak, compress=False, alignment=4 -apk_path=assets/locales/vi.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-CN.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-HK.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-TW.pak, compress=False, alignment=4 -apk_path=assets/locales/zu.pak, compress=False, alignment=4 apk_path=assets/resources.pak, compress=False, alignment=4 apk_path=assets/stored-locales/af.pak, compress=False, alignment=4 apk_path=assets/stored-locales/am.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/ar.pak, compress=False, alignment=4 apk_path=assets/stored-locales/as.pak, compress=False, alignment=4 apk_path=assets/stored-locales/az.pak, compress=False, alignment=4 @@ -100,7 +16,6 @@ apk_path=assets/stored-locales/el.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es-419.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es.pak, compress=False, alignment=4 apk_path=assets/stored-locales/et.pak, compress=False, alignment=4
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected index abac15d4..3c23690 100644 --- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -5,7 +5,7 @@ platformBuildVersionCode="34" platformBuildVersionName="14" android:isolatedSplits="true" - android:versionCode="OFFSET=30" + android:versionCode="OFFSET=31" android:versionName="#.#.#.#"> <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.software.leanback" android:required="false"/> @@ -21,7 +21,8 @@ android:extractNativeLibs="false" android:icon="@$PACKAGE:drawable/icon_webview" android:label="Android System WebView" - android:multiArch="true"> + android:multiArch="true" + android:use32bitAbi="true"> <activity # DIFF-ANCHOR: ea1a94af android:name="com.google.android.gms.common.api.GoogleApiActivity" android:exported="false" @@ -493,6 +494,6 @@ android:process=":sandboxed_process9" android:visibleToInstantApps="true"> </service> # DIFF-ANCHOR: e2f3bbbd - <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="OFFSET=30"/> + <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="OFFSET=31"/> </application> </manifest>
diff --git a/android_webview/expectations/trichrome_webview_bundle.arm64.libs_and_assets.expected b/android_webview/expectations/trichrome_webview_bundle.arm64.libs_and_assets.expected index 53efb3e..5197e7f 100644 --- a/android_webview/expectations/trichrome_webview_bundle.arm64.libs_and_assets.expected +++ b/android_webview/expectations/trichrome_webview_bundle.arm64.libs_and_assets.expected
@@ -1,96 +1,10 @@ -apk_path=lib/arm64-v8a/libarcore_sdk_c.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libchromium_android_linker.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libmonochrome.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libmonochrome.so, compress=False, alignment=16384 apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 -apk_path=assets/locales/af.pak, compress=False, alignment=4 -apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 -apk_path=assets/locales/ar.pak, compress=False, alignment=4 -apk_path=assets/locales/as.pak, compress=False, alignment=4 -apk_path=assets/locales/az.pak, compress=False, alignment=4 -apk_path=assets/locales/be.pak, compress=False, alignment=4 -apk_path=assets/locales/bg.pak, compress=False, alignment=4 -apk_path=assets/locales/bn.pak, compress=False, alignment=4 -apk_path=assets/locales/bs.pak, compress=False, alignment=4 -apk_path=assets/locales/ca.pak, compress=False, alignment=4 -apk_path=assets/locales/cs.pak, compress=False, alignment=4 -apk_path=assets/locales/da.pak, compress=False, alignment=4 -apk_path=assets/locales/de.pak, compress=False, alignment=4 -apk_path=assets/locales/el.pak, compress=False, alignment=4 -apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 -apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 -apk_path=assets/locales/es-419.pak, compress=False, alignment=4 -apk_path=assets/locales/es.pak, compress=False, alignment=4 -apk_path=assets/locales/et.pak, compress=False, alignment=4 -apk_path=assets/locales/eu.pak, compress=False, alignment=4 -apk_path=assets/locales/fa.pak, compress=False, alignment=4 -apk_path=assets/locales/fi.pak, compress=False, alignment=4 -apk_path=assets/locales/fil.pak, compress=False, alignment=4 -apk_path=assets/locales/fr-CA.pak, compress=False, alignment=4 -apk_path=assets/locales/fr.pak, compress=False, alignment=4 -apk_path=assets/locales/gl.pak, compress=False, alignment=4 -apk_path=assets/locales/gu.pak, compress=False, alignment=4 -apk_path=assets/locales/he.pak, compress=False, alignment=4 -apk_path=assets/locales/hi.pak, compress=False, alignment=4 -apk_path=assets/locales/hr.pak, compress=False, alignment=4 -apk_path=assets/locales/hu.pak, compress=False, alignment=4 -apk_path=assets/locales/hy.pak, compress=False, alignment=4 -apk_path=assets/locales/id.pak, compress=False, alignment=4 -apk_path=assets/locales/is.pak, compress=False, alignment=4 -apk_path=assets/locales/it.pak, compress=False, alignment=4 -apk_path=assets/locales/ja.pak, compress=False, alignment=4 -apk_path=assets/locales/ka.pak, compress=False, alignment=4 -apk_path=assets/locales/kk.pak, compress=False, alignment=4 -apk_path=assets/locales/km.pak, compress=False, alignment=4 -apk_path=assets/locales/kn.pak, compress=False, alignment=4 -apk_path=assets/locales/ko.pak, compress=False, alignment=4 -apk_path=assets/locales/ky.pak, compress=False, alignment=4 -apk_path=assets/locales/lo.pak, compress=False, alignment=4 -apk_path=assets/locales/lt.pak, compress=False, alignment=4 -apk_path=assets/locales/lv.pak, compress=False, alignment=4 -apk_path=assets/locales/mk.pak, compress=False, alignment=4 -apk_path=assets/locales/ml.pak, compress=False, alignment=4 -apk_path=assets/locales/mn.pak, compress=False, alignment=4 -apk_path=assets/locales/mr.pak, compress=False, alignment=4 -apk_path=assets/locales/ms.pak, compress=False, alignment=4 -apk_path=assets/locales/my.pak, compress=False, alignment=4 -apk_path=assets/locales/nb.pak, compress=False, alignment=4 -apk_path=assets/locales/ne.pak, compress=False, alignment=4 -apk_path=assets/locales/nl.pak, compress=False, alignment=4 -apk_path=assets/locales/or.pak, compress=False, alignment=4 -apk_path=assets/locales/pa.pak, compress=False, alignment=4 -apk_path=assets/locales/pl.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-BR.pak, compress=False, alignment=4 -apk_path=assets/locales/pt-PT.pak, compress=False, alignment=4 -apk_path=assets/locales/ro.pak, compress=False, alignment=4 -apk_path=assets/locales/ru.pak, compress=False, alignment=4 -apk_path=assets/locales/si.pak, compress=False, alignment=4 -apk_path=assets/locales/sk.pak, compress=False, alignment=4 -apk_path=assets/locales/sl.pak, compress=False, alignment=4 -apk_path=assets/locales/sq.pak, compress=False, alignment=4 -apk_path=assets/locales/sr-Latn.pak, compress=False, alignment=4 -apk_path=assets/locales/sr.pak, compress=False, alignment=4 -apk_path=assets/locales/sv.pak, compress=False, alignment=4 -apk_path=assets/locales/sw.pak, compress=False, alignment=4 -apk_path=assets/locales/ta.pak, compress=False, alignment=4 -apk_path=assets/locales/te.pak, compress=False, alignment=4 -apk_path=assets/locales/th.pak, compress=False, alignment=4 -apk_path=assets/locales/tr.pak, compress=False, alignment=4 -apk_path=assets/locales/uk.pak, compress=False, alignment=4 -apk_path=assets/locales/ur.pak, compress=False, alignment=4 -apk_path=assets/locales/uz.pak, compress=False, alignment=4 -apk_path=assets/locales/vi.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-CN.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-HK.pak, compress=False, alignment=4 -apk_path=assets/locales/zh-TW.pak, compress=False, alignment=4 -apk_path=assets/locales/zu.pak, compress=False, alignment=4 apk_path=assets/resources.pak, compress=False, alignment=4 apk_path=assets/snapshot_blob_64.bin, compress=False, alignment=4 apk_path=assets/stored-locales/af.pak, compress=False, alignment=4 apk_path=assets/stored-locales/am.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/ar.pak, compress=False, alignment=4 apk_path=assets/stored-locales/as.pak, compress=False, alignment=4 apk_path=assets/stored-locales/az.pak, compress=False, alignment=4 @@ -105,7 +19,6 @@ apk_path=assets/stored-locales/el.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es-419.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es.pak, compress=False, alignment=4 apk_path=assets/stored-locales/et.pak, compress=False, alignment=4
diff --git a/android_webview/java/src/org/chromium/android_webview/variations/VariationsSeedLoader.java b/android_webview/java/src/org/chromium/android_webview/variations/VariationsSeedLoader.java index 4e29f07..52305dc 100644 --- a/android_webview/java/src/org/chromium/android_webview/variations/VariationsSeedLoader.java +++ b/android_webview/java/src/org/chromium/android_webview/variations/VariationsSeedLoader.java
@@ -16,6 +16,7 @@ import androidx.annotation.VisibleForTesting; +import org.jni_zero.CalledByNative; import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; @@ -90,6 +91,9 @@ public static final String APP_SEED_FRESHNESS_HISTOGRAM_NAME = "Variations.AppSeedFreshness"; @VisibleForTesting + public static final String SEED_FRESHNESS_DIFF_HISTOGRAM_NAME = "Variations.SeedFreshnessDiff"; + + @VisibleForTesting public static final String DOWNLOAD_JOB_INTERVAL_HISTOGRAM_NAME = "Variations.WebViewDownloadJobInterval"; @@ -101,6 +105,10 @@ "Variations.SeedLoadBlockingTime"; // This metric is also written by VariationsSeedStore::LoadSeed and is used by other platforms. private static final String SEED_LOAD_RESULT_HISTOGRAM_NAME = "Variations.SeedLoadResult"; + // These two variables below are used for caching the difference between Seed and + // AppSeed Freshness. + private static long sCachedSeedFreshness; + private static long sCachedAppSeedFreshness; private SeedLoadAndUpdateRunnable mRunnable; private SeedServerCallback mSeedServerCallback = new SeedServerCallback(); @@ -114,15 +122,60 @@ RecordHistogram.recordTimesHistogram(SEED_LOAD_BLOCKING_TIME_HISTOGRAM_NAME, timeMs); } - private static void recordAppSeedFreshness(long freshnessMinutes) { + private static void recordAppSeedFreshness(long appSeedFreshnessMinutes) { // Bucket parameters should match Variations.SeedFreshness. // See variations::RecordSeedFreshness. RecordHistogram.recordCustomCountHistogram( APP_SEED_FRESHNESS_HISTOGRAM_NAME, - (int) freshnessMinutes, + (int) appSeedFreshnessMinutes, /* min= */ 1, /* max= */ (int) TimeUnit.DAYS.toMinutes(30), /* numBuckets= */ 50); + cacheAppSeedFreshness(appSeedFreshnessMinutes); + } + + // This method is to cache the AppSeedFreshness value + @VisibleForTesting + public static void cacheAppSeedFreshness(long appSeedFreshnessMinutes) { + if (appSeedFreshnessMinutes < 0) { + return; + } + sCachedAppSeedFreshness = appSeedFreshnessMinutes; + calculateSeedFreshnessDiff(); + } + + // This method is to cache the SeedFreshness value + @CalledByNative + @VisibleForTesting + public static void cacheSeedFreshness(long seedFreshness) { + if (seedFreshness < 0) { + return; + } + sCachedSeedFreshness = seedFreshness; + calculateSeedFreshnessDiff(); + } + + // This method is to calculate the difference between SeedFreshness + // and AppSeedFreshness + private static void calculateSeedFreshnessDiff() { + if (sCachedSeedFreshness == 0 || sCachedAppSeedFreshness == 0) { + return; + } + long diff = sCachedSeedFreshness - sCachedAppSeedFreshness; + recordAppSeedFreshnessDiff(diff); + } + + // This method is to record the difference between SeedFreshness + // and AppSeedFreshness + private static void recordAppSeedFreshnessDiff(long diff) { + RecordHistogram.recordCustomCountHistogram( + SEED_FRESHNESS_DIFF_HISTOGRAM_NAME, + (int) diff, + /* min= */ 1, + /* max= */ (int) TimeUnit.DAYS.toMinutes(30), + /* numBuckets= */ 50); + sCachedSeedFreshness = 0; + sCachedAppSeedFreshness = 0; } private static void recordMinuteHistogram(String name, long value, long maxValue) {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/VariationsSeedLoaderTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/VariationsSeedLoaderTest.java index 64696187..824565d 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/VariationsSeedLoaderTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/VariationsSeedLoaderTest.java
@@ -171,6 +171,31 @@ VariationsTestUtils.deleteSeeds(); } + // Test that Seed and AppSeed Freshness diff is correct and recorded + @Test + @MediumTest + public void testRecordSeedDiff() throws Exception { + // The first line is needed to set the seed freshness to zero + // in order to calculate the diff correctly + VariationsSeedLoader.cacheSeedFreshness(0); + long seedFreshnessInMinutes = 100; + long appSeedFreshnessInMinutes = 40; + long diff = seedFreshnessInMinutes - appSeedFreshnessInMinutes; + var histogramWatcherOne = + HistogramWatcher.newSingleRecordWatcher( + VariationsSeedLoader.SEED_FRESHNESS_DIFF_HISTOGRAM_NAME, (int) diff); + VariationsSeedLoader.cacheAppSeedFreshness(appSeedFreshnessInMinutes); + VariationsSeedLoader.cacheSeedFreshness(seedFreshnessInMinutes); + histogramWatcherOne.assertExpected(); + + var histogramWatcherTwo = + HistogramWatcher.newSingleRecordWatcher( + VariationsSeedLoader.SEED_FRESHNESS_DIFF_HISTOGRAM_NAME, (int) diff); + VariationsSeedLoader.cacheSeedFreshness(seedFreshnessInMinutes); + VariationsSeedLoader.cacheAppSeedFreshness(appSeedFreshnessInMinutes); + histogramWatcherTwo.assertExpected(); + } + // Test the case that: // VariationsUtils.getSeedFile() - doesn't exist // VariationsUtils.getNewSeedFile() - doesn't exist
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni index b2d987b..6b79ebe5 100644 --- a/android_webview/system_webview_apk_tmpl.gni +++ b/android_webview/system_webview_apk_tmpl.gni
@@ -37,6 +37,7 @@ if (_is_trichrome) { _is_64_bit_browser = android_64bit_target_cpu && invoker.is_64_bit_browser _version_code = TRICHROME_VERSION_MAP["${android_64bit_target_cpu}_${_is_64_bit_browser}_${_include_64_bit_webview}_${_include_32_bit_webview}"] + # Allow a custom version_code, but always use the default _trichrome_library_version_code _trichrome_library_version_code = _version_code } else { @@ -72,8 +73,8 @@ "manifest_package=$_manifest_package", ] if (_is_trichrome) { - variables += - trichrome_jinja_variables + [ "trichrome_version=$_trichrome_library_version_code" ] + variables += trichrome_jinja_variables + + [ "trichrome_version=$_trichrome_library_version_code" ] if (_is_64_bit_browser) { variables += [ "library=libmonochrome_64.so" ] } else { @@ -123,8 +124,13 @@ min_sdk_version = 29 } if (defined(expected_android_manifest)) { - expected_android_manifest_version_code_offset = chrome_version_code - expected_android_manifest_library_version_offset = chrome_version_code + if (android_64bit_target_cpu) { + _version_code_offset = chrome_32_version_code + } else { + _version_code_offset = chrome_version_code + } + expected_android_manifest_version_code_offset = _version_code_offset + expected_android_manifest_library_version_offset = _version_code_offset } android_manifest = _android_manifest
diff --git a/ash/accessibility/accessibility_event_handler_manager.cc b/ash/accessibility/accessibility_event_handler_manager.cc index ec12310..95e128a5 100644 --- a/ash/accessibility/accessibility_event_handler_manager.cc +++ b/ash/accessibility/accessibility_event_handler_manager.cc
@@ -4,6 +4,7 @@ #include "ash/accessibility/accessibility_event_handler_manager.h" #include "ash/shell.h" +#include "base/ranges/algorithm.h" #include "ui/events/event_handler.h" namespace ash { @@ -30,7 +31,7 @@ void AccessibilityEventHandlerManager::RemoveAccessibilityEventHandler( ui::EventHandler* handler) { DCHECK(handler); - auto it = std::find(event_handlers_.begin(), event_handlers_.end(), handler); + auto it = base::ranges::find(event_handlers_, handler); DCHECK(it != event_handlers_.end()); // Remove it from our list.
diff --git a/ash/api/tasks/fake_tasks_client.cc b/ash/api/tasks/fake_tasks_client.cc index fb683ca..99536fb6 100644 --- a/ash/api/tasks/fake_tasks_client.cc +++ b/ash/api/tasks/fake_tasks_client.cc
@@ -14,6 +14,7 @@ #include "base/functional/callback.h" #include "base/functional/callback_forward.h" #include "base/notreached.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_util.h" #include "base/time/time.h" #include "base/uuid.h" @@ -75,9 +76,9 @@ pending_completed_tasks_.push_back( base::JoinString({task_list_id, task_id}, ":")); } else { - pending_completed_tasks_.erase(std::find( - pending_completed_tasks_.begin(), pending_completed_tasks_.end(), - base::JoinString({task_list_id, task_id}, ":"))); + pending_completed_tasks_.erase( + base::ranges::find(pending_completed_tasks_, + base::JoinString({task_list_id, task_id}, ":"))); } }
diff --git a/ash/assistant/model/ui/assistant_card_element.cc b/ash/assistant/model/ui/assistant_card_element.cc index 625065c..c4570d2 100644 --- a/ash/assistant/model/ui/assistant_card_element.cc +++ b/ash/assistant/model/ui/assistant_card_element.cc
@@ -57,8 +57,7 @@ contents_view_->AddObserver(this); // Encode the html string to be URL-safe. - std::string encoded_html; - base::Base64Encode(card_element_->html(), &encoded_html); + std::string encoded_html = base::Base64Encode(card_element_->html()); // Navigate to the data URL which represents the card. constexpr char kDataUriPrefix[] = "data:text/html;base64,";
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index 3b18233..73808047b 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -1500,11 +1500,6 @@ inline constexpr char kProjectorSWAUIPrefsMigrated[] = "ash.projector.swa_ui_prefs_migrated_to_chrome_untrusted"; -// A boolean pref that indicates whether the migration of Chromad devices to -// cloud management can be started. -inline constexpr char kChromadToCloudMigrationEnabled[] = - "ash.chromad_to_cloud_migration_enabled"; - // List of Drive Folder Shortcuts in the Files app. Used to sync the shortcuts // across devices. inline constexpr char kFilesAppFolderShortcuts[] =
diff --git a/ash/style/style_viewer/system_ui_components_grid_view.cc b/ash/style/style_viewer/system_ui_components_grid_view.cc index 3cf3251..f0bd8781 100644 --- a/ash/style/style_viewer/system_ui_components_grid_view.cc +++ b/ash/style/style_viewer/system_ui_components_grid_view.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <numeric> +#include "base/ranges/algorithm.h" #include "ui/gfx/text_constants.h" #include "ui/views/controls/label.h" #include "ui/views/layout/layout_manager.h" @@ -161,7 +162,7 @@ DCHECK(view); // Get the index of `view` in `children_`. - auto iter = std::find(children_.begin(), children_.end(), view); + auto iter = base::ranges::find(children_, view); DCHECK(iter != children_.end()); const int view_index = std::distance(children_.begin(), iter);
diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc index becdf27ce..cb4ed17 100644 --- a/ash/system/message_center/ash_notification_view.cc +++ b/ash/system/message_center/ash_notification_view.cc
@@ -286,10 +286,8 @@ std::vector<unsigned char> image_data; if (gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, /*discard_transparency=*/false, &image_data)) { - std::string encoded_data; - base::Base64Encode( - /*input=*/std::string(image_data.cbegin(), image_data.cend()), - &encoded_data); + std::string encoded_data = base::Base64Encode( + /*input=*/std::string(image_data.cbegin(), image_data.cend())); const std::string html = base::StrCat( {"<img src=\"data:image/png;base64,", encoded_data, "\"/>"}); std::u16string html_in_u16;
diff --git a/ash/system/privacy_hub/camera_privacy_switch_controller_unittest.cc b/ash/system/privacy_hub/camera_privacy_switch_controller_unittest.cc index e2d818a..97a7034d 100644 --- a/ash/system/privacy_hub/camera_privacy_switch_controller_unittest.cc +++ b/ash/system/privacy_hub/camera_privacy_switch_controller_unittest.cc
@@ -23,6 +23,7 @@ #include "base/command_line.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" +#include "base/ranges/algorithm.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "components/prefs/pref_change_registrar.h" @@ -64,8 +65,7 @@ } void CloseAppAccessingCamera(const std::u16string& app_name) { - auto it = std::find(apps_accessing_camera_.begin(), - apps_accessing_camera_.end(), app_name); + auto it = base::ranges::find(apps_accessing_camera_, app_name); if (it != apps_accessing_camera_.end()) { apps_accessing_camera_.erase(it); }
diff --git a/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc b/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc index 0b13c2ab..36991b0 100644 --- a/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc +++ b/ash/system/privacy_hub/microphone_privacy_switch_controller_unittest.cc
@@ -25,6 +25,7 @@ #include "ash/test/ash_test_base.h" #include "base/command_line.h" #include "base/memory/raw_ptr.h" +#include "base/ranges/algorithm.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chromeos/ash/components/audio/cras_audio_handler.h" @@ -63,8 +64,7 @@ } void CloseAppAccessingMicrophone(const std::u16string& app_name) { - auto it = std::find(apps_accessing_microphone_.begin(), - apps_accessing_microphone_.end(), app_name); + auto it = base::ranges::find(apps_accessing_microphone_, app_name); ASSERT_NE(apps_accessing_microphone_.end(), it); apps_accessing_microphone_.erase(it);
diff --git a/ash/system/privacy_hub/privacy_hub_notification_unittest.cc b/ash/system/privacy_hub/privacy_hub_notification_unittest.cc index 02a8a88..f8ccd7cd 100644 --- a/ash/system/privacy_hub/privacy_hub_notification_unittest.cc +++ b/ash/system/privacy_hub/privacy_hub_notification_unittest.cc
@@ -19,6 +19,7 @@ #include "ash/test/ash_test_base.h" #include "base/memory/scoped_refptr.h" #include "base/notreached.h" +#include "base/ranges/algorithm.h" #include "base/test/bind.h" #include "base/test/gtest_util.h" #include "base/test/scoped_feature_list.h" @@ -47,7 +48,7 @@ } void CloseApp(const std::u16string& app_name) { - auto it = std::find(apps_.begin(), apps_.end(), app_name); + auto it = base::ranges::find(apps_, app_name); if (it != apps_.end()) { apps_.erase(it); }
diff --git a/ash/system/unified/classroom_bubble_student_view.cc b/ash/system/unified/classroom_bubble_student_view.cc index 112d5bd..a58bc4b 100644 --- a/ash/system/unified/classroom_bubble_student_view.cc +++ b/ash/system/unified/classroom_bubble_student_view.cc
@@ -4,7 +4,6 @@ #include "ash/system/unified/classroom_bubble_student_view.h" -#include <algorithm> #include <array> #include <memory> #include <utility> @@ -19,6 +18,7 @@ #include "base/check.h" #include "base/functional/bind.h" #include "base/metrics/user_metrics.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_piece.h" #include "base/time/time.h" #include "base/types/cxx23_to_underlying.h" @@ -93,9 +93,8 @@ const auto selected_list_type = static_cast<StudentAssignmentsListType>( Shell::Get()->session_controller()->GetActivePrefService()->GetInteger( kLastSelectedAssignmentsListPref)); - const auto* const iter = - std::find(kStudentAssignmentsListTypeOrdered.begin(), - kStudentAssignmentsListTypeOrdered.end(), selected_list_type); + const auto* const iter = base::ranges::find( + kStudentAssignmentsListTypeOrdered, selected_list_type); return iter != kStudentAssignmentsListTypeOrdered.end() ? iter - kStudentAssignmentsListTypeOrdered.begin() : 0;
diff --git a/ash/system/unified/glanceable_tray_bubble_view.cc b/ash/system/unified/glanceable_tray_bubble_view.cc index a6e91bd..0a65199 100644 --- a/ash/system/unified/glanceable_tray_bubble_view.cc +++ b/ash/system/unified/glanceable_tray_bubble_view.cc
@@ -4,7 +4,6 @@ #include "ash/system/unified/glanceable_tray_bubble_view.h" -#include <algorithm> #include <memory> #include "ash/api/tasks/tasks_client.h" @@ -25,6 +24,7 @@ #include "base/check.h" #include "base/feature_list.h" #include "base/functional/bind.h" +#include "base/ranges/algorithm.h" #include "components/session_manager/session_manager_types.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/models/list_model.h" @@ -307,8 +307,7 @@ // Adds classroom bubble before `calendar_view_`. auto* const scroll_contents = scroll_view_->contents(); const auto calendar_view_index = - std::find(scroll_contents->children().begin(), - scroll_contents->children().end(), calendar_view_) - + base::ranges::find(scroll_contents->children(), calendar_view_) - scroll_contents->children().begin(); classroom_bubble_student_view_ = scroll_contents->AddChildViewAt( std::make_unique<ClassroomBubbleStudentView>(), calendar_view_index);
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn index a0569dbc..989c56e 100644 --- a/ash/webui/personalization_app/resources/BUILD.gn +++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -150,6 +150,7 @@ "js/wallpaper/constants.ts", "js/wallpaper/google_photos_metrics_logger.ts", "js/wallpaper/sea_pen/constants.ts", + "js/wallpaper/sea_pen/load_time_booleans.ts", "js/wallpaper/sea_pen/sea_pen_actions.ts", "js/wallpaper/sea_pen/sea_pen_controller.ts", "js/wallpaper/sea_pen/sea_pen_interface_provider.ts",
diff --git a/ash/webui/personalization_app/resources/js/load_time_booleans.ts b/ash/webui/personalization_app/resources/js/load_time_booleans.ts index c09bd0d0..6a82627 100644 --- a/ash/webui/personalization_app/resources/js/load_time_booleans.ts +++ b/ash/webui/personalization_app/resources/js/load_time_booleans.ts
@@ -55,11 +55,3 @@ return loadTimeData.getBoolean( 'isTimeOfDayWallpaperForcedAutoScheduleEnabled'); } - -export function isSeaPenEnabled() { - return loadTimeData.getBoolean('isSeaPenEnabled'); -} - -export function isSeaPenTextInputEnabled() { - return loadTimeData.getBoolean('isSeaPenTextInputEnabled'); -}
diff --git a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts index bb5a2a0..a446859 100644 --- a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts +++ b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
@@ -27,7 +27,8 @@ import {isPathValid, Paths, PersonalizationRouterElement} from './personalization_router_element.js'; import {WithPersonalizationStore} from './personalization_store.js'; import {inBetween, isNonEmptyArray} from './utils.js'; -import {findAlbumById, getSampleSeaPenTemplates, QUERY, SeaPenTemplate} from './wallpaper/utils.js'; +import {getSampleSeaPenTemplates, QUERY, SeaPenTemplate} from './wallpaper/sea_pen/constants.js'; +import {findAlbumById} from './wallpaper/utils.js'; /** Event interface for dom-repeat. */ interface RepeaterEvent extends CustomEvent {
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/constants.ts b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/constants.ts index 1815d36d5..86a67480 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/constants.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/constants.ts
@@ -4,6 +4,12 @@ import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js'; +import {SeaPenTemplateChip, SeaPenTemplateId, SeaPenTemplateOption} from '../../../sea_pen.mojom-webui.js'; + +import {isSeaPenTextInputEnabled} from './load_time_booleans.js'; + +export const QUERY: string = 'Query'; + /** * An interface for the data of a recent sea pen image. */ @@ -11,3 +17,385 @@ url: Url; queryInfo: string; } + +export interface SeaPenOption { + // `value` is the actual option value to be sent to the server side. + value: SeaPenTemplateOption; + // `translation` is the translated value to be displayed in the UI. + translation: string; +} + +export interface SeaPenTemplate { + id: string; + // `title` is the user-visible string in collection titles and breadcrumbs. + title: string; + preview: Url[]; + // `text` is the string that shows up on the sea pen subpage. + text: string; + // `options` are in the form of 'option_name': [option1, option2, ...]. + options: Map<SeaPenTemplateChip, SeaPenOption[]>; +} + +export function getSampleSeaPenTemplates(): SeaPenTemplate[] { + const templates = [ + { + id: SeaPenTemplateId.kFlower.toString(), + title: 'Airbrushed', + text: `A radiant <${SeaPenTemplateChip.kFlowerColor}> <${ + SeaPenTemplateChip.kFlowerType}> in bloom`, + preview: [{ + url: 'chrome://personalization/images/sea_pen_tile.svg', + }], + options: new Map([ + [ + SeaPenTemplateChip.kFlowerType, + [ + { + value: SeaPenTemplateOption.kFlowerTypeRose, + translation: 'rose', + }, + { + value: SeaPenTemplateOption.kFlowerTypeCallaLily, + translation: 'calla lily', + }, + { + value: SeaPenTemplateOption.kFlowerTypeWindflower, + translation: 'windflower', + }, + { + value: SeaPenTemplateOption.kFlowerTypeTulip, + translation: 'tulip', + }, + { + value: SeaPenTemplateOption.kFlowerTypeLilyOfTheValley, + translation: 'lily of the valley', + }, + { + value: SeaPenTemplateOption.kFlowerTypeBirdOfParadise, + translation: 'bird-of-paradise flower', + }, + { + value: SeaPenTemplateOption.kFlowerTypeOrchid, + translation: 'orchid', + }, + { + value: SeaPenTemplateOption.kFlowerTypeRanunculus, + translation: 'ranunculus', + }, + { + value: SeaPenTemplateOption.kFlowerTypeDaisy, + translation: 'daisy', + }, + { + value: SeaPenTemplateOption.kFlowerTypeHydrangeas, + translation: 'hydrangeas', + }, + ], + ], + [ + SeaPenTemplateChip.kFlowerColor, + [ + { + value: SeaPenTemplateOption.kFlowerColorPink, + translation: 'pink', + }, + { + value: SeaPenTemplateOption.kFlowerColorPurple, + translation: 'purple', + }, + { + value: SeaPenTemplateOption.kFlowerColorBlue, + translation: 'blue', + }, + { + value: SeaPenTemplateOption.kFlowerColorWhite, + translation: 'white', + }, + { + value: SeaPenTemplateOption.kFlowerColorCoral, + translation: 'coral', + }, + { + value: SeaPenTemplateOption.kFlowerColorYellow, + translation: 'yellow', + }, + { + value: SeaPenTemplateOption.kFlowerColorGreen, + translation: 'green', + }, + { + value: SeaPenTemplateOption.kFlowerColorRed, + translation: 'red', + }, + ], + ], + ]), + }, + { + id: SeaPenTemplateId.kMineral.toString(), + title: 'Mineral', + text: `A close-up image of <${SeaPenTemplateChip.kMineralName}> with <${ + SeaPenTemplateChip.kMineralColor}> hues`, + preview: [{ + url: 'chrome://personalization/images/sea_pen_tile.svg', + }], + options: new Map([ + [ + SeaPenTemplateChip.kMineralName, + [ + { + value: SeaPenTemplateOption.kMineralNameWhiteQuartz, + translation: 'white quartz', + }, + { + value: SeaPenTemplateOption.kMineralNameAmethyst, + translation: 'amethyst', + }, + { + value: SeaPenTemplateOption.kMineralNameBlueSapphire, + translation: 'blue sapphire', + }, + { + value: SeaPenTemplateOption.kMineralNameAmberCarnelian, + translation: 'amber carnelian', + }, + { + value: SeaPenTemplateOption.kMineralNameEmerald, + translation: 'emerald', + }, + { + value: SeaPenTemplateOption.kMineralNameRuby, + translation: 'ruby', + }, + ], + ], + [ + SeaPenTemplateChip.kMineralColor, + [ + { + value: SeaPenTemplateOption.kMineralColorWhite, + translation: 'white', + }, + { + value: SeaPenTemplateOption.kMineralColorPeriwinkle, + translation: 'periwinkle', + }, + { + value: SeaPenTemplateOption.kMineralColorPink, + translation: 'pink', + }, + { + value: SeaPenTemplateOption.kMineralColorLavender, + translation: 'lavender', + }, + ], + ], + ]), + }, + { + id: SeaPenTemplateId.kLandscape.toString(), + title: 'Landscape', + text: `A <${SeaPenTemplateChip.kLandscapeBiome}> landscape with <${ + SeaPenTemplateChip.kLandscapeLighting}> lighting`, + preview: [{ + url: 'chrome://personalization/images/sea_pen_tile.svg', + }], + options: new Map([ + [ + SeaPenTemplateChip.kLandscapeBiome, + [ + { + value: SeaPenTemplateOption.kLandscapeBiomeTaiga, + translation: 'taiga', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeDesert, + translation: 'desert', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeRainforest, + translation: 'rainforest', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeTundra, + translation: 'tundra', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeBeach, + translation: 'beach', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeIcebergs, + translation: 'icebergs', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeSwamp, + translation: 'swamp', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeGrassland, + translation: 'grassland', + }, + { + value: SeaPenTemplateOption.kLandscapeBiomeForest, + translation: 'forest', + }, + ], + ], + [ + SeaPenTemplateChip.kLandscapeLighting, + [ + { + value: SeaPenTemplateOption.kLandscapeLightingDiffuse, + translation: 'diffuse', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingNorthernLights, + translation: 'northern lights', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingSunRays, + translation: 'sun rays', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingGoldenHour, + translation: 'golden hour', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingEarlyMorning, + translation: 'early morning', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingBlueHour, + translation: 'blue hour', + }, + { + value: SeaPenTemplateOption.kLandscapeLightingMidday, + translation: 'midday', + }, + ], + ], + ]), + }, + { + id: SeaPenTemplateId.kScifi.toString(), + title: 'Sci-fi', + text: `Otherworldly <${SeaPenTemplateChip.kScifiFeature}> in <${ + SeaPenTemplateChip.kScifiColor}> colors`, + preview: [{ + url: 'chrome://personalization/images/sea_pen_tile.svg', + }], + options: new Map([ + [ + SeaPenTemplateChip.kScifiFeature, + [ + { + value: SeaPenTemplateOption.kScifiFeatureStreet, + translation: 'street', + }, + { + value: SeaPenTemplateOption.kScifiFeatureSkyline, + translation: 'skyline', + }, + { + value: SeaPenTemplateOption.kScifiFeatureSwamp, + translation: 'swamp', + }, + { + value: SeaPenTemplateOption.kScifiFeatureTransport, + translation: 'transport hub', + }, + { + value: SeaPenTemplateOption.kScifiFeatureBusStop, + translation: 'bus stop', + }, + { + value: SeaPenTemplateOption.kScifiFeatureDesert, + translation: 'desert', + }, + { + value: SeaPenTemplateOption.kScifiFeatureBeach, + translation: 'beach', + }, + { + value: SeaPenTemplateOption.kScifiFeatureMountains, + translation: 'mountains', + }, + { + value: SeaPenTemplateOption.kScifiFeaturePark, + translation: 'park', + }, + { + value: SeaPenTemplateOption.kScifiFeatureForest, + translation: 'forest', + }, + { + value: SeaPenTemplateOption.kScifiFeatureSmallTown, + translation: 'small town', + }, + { + value: SeaPenTemplateOption.kScifiFeatureFarm, + translation: 'farm', + }, + { + value: SeaPenTemplateOption.kScifiFeatureUnderwater, + translation: 'underwater', + }, + ], + ], + [ + SeaPenTemplateChip.kScifiColor, + [ + { + value: SeaPenTemplateOption.kScifiColorEarthy, + translation: 'earthy', + }, + { + value: SeaPenTemplateOption.kScifiColorVibrant, + translation: 'vibrant', + }, + { + value: SeaPenTemplateOption.kScifiColorSilver, + translation: 'silver', + }, + { + value: SeaPenTemplateOption.kScifiColorEerie, + translation: 'eerie', + }, + { + value: SeaPenTemplateOption.kScifiColorComplementary, + translation: 'complementary', + }, + { + value: SeaPenTemplateOption.kScifiColorNeutral, + translation: 'neutral', + }, + ], + ], + ]), + }, + ]; + if (isSeaPenTextInputEnabled()) { + templates.push({ + preview: [{ + url: 'chrome://personalization/images/sea_pen_tile.svg', + }], + title: 'Freeform', + text: 'Freeform', + id: QUERY, + options: new Map(), + }); + } + return templates; +} + +/** + * Split the template string into an array of strings, where each string is + * either a literal string or a placeholder for a chip. + * @example + * // returns ['A park in ', '<city>', ' in the style of ', '<style>'] + * parseTemplateText('A park in <city> in the style of <style>'); + */ +export function parseTemplateText(template: string): string[] { + return template.split(/(<\w+>)/g); +}
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/load_time_booleans.ts b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/load_time_booleans.ts new file mode 100644 index 0000000..2215c47 --- /dev/null +++ b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/load_time_booleans.ts
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Getters for all of the loadTimeData booleans used throughout + * SeaPen. + * Export them as functions so they reload the values when overridden in test. + */ + +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; + +export function isSeaPenEnabled() { + return loadTimeData.getBoolean('isSeaPenEnabled'); +} + +export function isSeaPenTextInputEnabled() { + return loadTimeData.getBoolean('isSeaPenTextInputEnabled'); +}
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_input_query_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_input_query_element.ts index 39a1564c..7a6cc7c98 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_input_query_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_input_query_element.ts
@@ -19,8 +19,8 @@ import {MAXIMUM_SEARCH_WALLPAPER_TEXT_BYTES, SeaPenQuery} from '../../../sea_pen.mojom-webui.js'; import {Paths, PersonalizationRouterElement} from '../../personalization_router_element.js'; -import {QUERY} from '../utils.js'; +import {QUERY} from './constants.js'; import {searchSeaPenThumbnails} from './sea_pen_controller.js'; import {getTemplate} from './sea_pen_input_query_element.html.js'; import {getSeaPenProvider} from './sea_pen_interface_provider.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_template_query_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_template_query_element.ts index 69d8148..d09e636 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_template_query_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_template_query_element.ts
@@ -14,8 +14,8 @@ import {SeaPenQuery, SeaPenTemplateChip, SeaPenTemplateId, SeaPenTemplateOption} from '../../../sea_pen.mojom-webui.js'; import {Paths, PersonalizationRouterElement} from '../../personalization_router_element.js'; import {isNonEmptyArray} from '../../utils.js'; -import {getSampleSeaPenTemplates, parseTemplateText, SeaPenOption, SeaPenTemplate} from '../utils.js'; +import {getSampleSeaPenTemplates, parseTemplateText, SeaPenOption, SeaPenTemplate} from './constants.js'; import {searchSeaPenThumbnails} from './sea_pen_controller.js'; import {getSeaPenProvider} from './sea_pen_interface_provider.js'; import {WithSeaPenStore} from './sea_pen_store.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_templates_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_templates_element.ts index 3327dcd..635ed77 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_templates_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/sea_pen/sea_pen_templates_element.ts
@@ -12,8 +12,8 @@ import {assert} from 'chrome://resources/js/assert.js'; import {PersonalizationRouterElement} from '../../personalization_router_element.js'; -import {getSampleSeaPenTemplates, SeaPenTemplate} from '../utils.js'; +import {getSampleSeaPenTemplates, SeaPenTemplate} from './constants.js'; import {WithSeaPenStore} from './sea_pen_store.js'; import {getTemplate} from './sea_pen_templates_element.html.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/utils.ts b/ash/webui/personalization_app/resources/js/wallpaper/utils.ts index f510b89..dd5f930 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/utils.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/utils.ts
@@ -7,36 +7,13 @@ import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js'; -import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js'; import {CurrentAttribution, CurrentWallpaper, GooglePhotosAlbum, GooglePhotosPhoto, WallpaperImage, WallpaperLayout, WallpaperType} from '../../personalization_app.mojom-webui.js'; -import {SeaPenTemplateChip, SeaPenTemplateId, SeaPenTemplateOption} from '../../sea_pen.mojom-webui.js'; -import {isSeaPenTextInputEnabled} from '../load_time_booleans.js'; import {getNumberOfGridItemsPerRow, isNonEmptyArray, isNonEmptyString} from '../utils.js'; import {DefaultImageSymbol, DisplayableImage, kDefaultImageSymbol} from './constants.js'; import {DailyRefreshState} from './wallpaper_state.js'; -export const QUERY: string = 'Query'; - -export interface SeaPenOption { - // `value` is the actual option value to be sent to the server side. - value: SeaPenTemplateOption; - // `translation` is the translated value to be displayed in the UI. - translation: string; -} - -export interface SeaPenTemplate { - id: string; - // `title` is the user-visible string in collection titles and breadcrumbs. - title: string; - preview: Url[]; - // `text` is the string that shows up on the sea pen subpage. - text: string; - // `options` are in the form of 'option_name': [option1, option2, ...]. - options: Map<SeaPenTemplateChip, SeaPenOption[]>; -} - export function isWallpaperImage(obj: any): obj is WallpaperImage { return !!obj && typeof obj.unitId === 'bigint'; } @@ -225,366 +202,3 @@ return null; } -/** - * Split the template string into an array of strings, where each string is - * either a literal string or a placeholder for a chip. - * @example - * // returns ['A park in ', '<city>', ' in the style of ', '<style>'] - * parseTemplateText('A park in <city> in the style of <style>'); - */ -export function parseTemplateText(template: string): string[] { - return template.split(/(<\w+>)/g); -} - -export function getSampleSeaPenTemplates(): SeaPenTemplate[] { - const templates = [ - { - id: SeaPenTemplateId.kFlower.toString(), - title: 'Airbrushed', - text: `A radiant <${SeaPenTemplateChip.kFlowerColor}> <${ - SeaPenTemplateChip.kFlowerType}> in bloom`, - preview: [{ - url: 'chrome://personalization/images/sea_pen_tile.svg', - }], - options: new Map([ - [ - SeaPenTemplateChip.kFlowerType, - [ - { - value: SeaPenTemplateOption.kFlowerTypeRose, - translation: 'rose', - }, - { - value: SeaPenTemplateOption.kFlowerTypeCallaLily, - translation: 'calla lily', - }, - { - value: SeaPenTemplateOption.kFlowerTypeWindflower, - translation: 'windflower', - }, - { - value: SeaPenTemplateOption.kFlowerTypeTulip, - translation: 'tulip', - }, - { - value: SeaPenTemplateOption.kFlowerTypeLilyOfTheValley, - translation: 'lily of the valley', - }, - { - value: SeaPenTemplateOption.kFlowerTypeBirdOfParadise, - translation: 'bird-of-paradise flower', - }, - { - value: SeaPenTemplateOption.kFlowerTypeOrchid, - translation: 'orchid', - }, - { - value: SeaPenTemplateOption.kFlowerTypeRanunculus, - translation: 'ranunculus', - }, - { - value: SeaPenTemplateOption.kFlowerTypeDaisy, - translation: 'daisy', - }, - { - value: SeaPenTemplateOption.kFlowerTypeHydrangeas, - translation: 'hydrangeas', - }, - ], - ], - [ - SeaPenTemplateChip.kFlowerColor, - [ - { - value: SeaPenTemplateOption.kFlowerColorPink, - translation: 'pink', - }, - { - value: SeaPenTemplateOption.kFlowerColorPurple, - translation: 'purple', - }, - { - value: SeaPenTemplateOption.kFlowerColorBlue, - translation: 'blue', - }, - { - value: SeaPenTemplateOption.kFlowerColorWhite, - translation: 'white', - }, - { - value: SeaPenTemplateOption.kFlowerColorCoral, - translation: 'coral', - }, - { - value: SeaPenTemplateOption.kFlowerColorYellow, - translation: 'yellow', - }, - { - value: SeaPenTemplateOption.kFlowerColorGreen, - translation: 'green', - }, - { - value: SeaPenTemplateOption.kFlowerColorRed, - translation: 'red', - }, - ], - ], - ]), - }, - { - id: SeaPenTemplateId.kMineral.toString(), - title: 'Mineral', - text: `A close-up image of <${SeaPenTemplateChip.kMineralName}> with <${ - SeaPenTemplateChip.kMineralColor}> hues`, - preview: [{ - url: 'chrome://personalization/images/sea_pen_tile.svg', - }], - options: new Map([ - [ - SeaPenTemplateChip.kMineralName, - [ - { - value: SeaPenTemplateOption.kMineralNameWhiteQuartz, - translation: 'white quartz', - }, - { - value: SeaPenTemplateOption.kMineralNameAmethyst, - translation: 'amethyst', - }, - { - value: SeaPenTemplateOption.kMineralNameBlueSapphire, - translation: 'blue sapphire', - }, - { - value: SeaPenTemplateOption.kMineralNameAmberCarnelian, - translation: 'amber carnelian', - }, - { - value: SeaPenTemplateOption.kMineralNameEmerald, - translation: 'emerald', - }, - { - value: SeaPenTemplateOption.kMineralNameRuby, - translation: 'ruby', - }, - ], - ], - [ - SeaPenTemplateChip.kMineralColor, - [ - { - value: SeaPenTemplateOption.kMineralColorWhite, - translation: 'white', - }, - { - value: SeaPenTemplateOption.kMineralColorPeriwinkle, - translation: 'periwinkle', - }, - { - value: SeaPenTemplateOption.kMineralColorPink, - translation: 'pink', - }, - { - value: SeaPenTemplateOption.kMineralColorLavender, - translation: 'lavender', - }, - ], - ], - ]), - }, - { - id: SeaPenTemplateId.kLandscape.toString(), - title: 'Landscape', - text: `A <${SeaPenTemplateChip.kLandscapeBiome}> landscape with <${ - SeaPenTemplateChip.kLandscapeLighting}> lighting`, - preview: [{ - url: 'chrome://personalization/images/sea_pen_tile.svg', - }], - options: new Map([ - [ - SeaPenTemplateChip.kLandscapeBiome, - [ - { - value: SeaPenTemplateOption.kLandscapeBiomeTaiga, - translation: 'taiga', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeDesert, - translation: 'desert', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeRainforest, - translation: 'rainforest', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeTundra, - translation: 'tundra', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeBeach, - translation: 'beach', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeIcebergs, - translation: 'icebergs', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeSwamp, - translation: 'swamp', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeGrassland, - translation: 'grassland', - }, - { - value: SeaPenTemplateOption.kLandscapeBiomeForest, - translation: 'forest', - }, - ], - ], - [ - SeaPenTemplateChip.kLandscapeLighting, - [ - { - value: SeaPenTemplateOption.kLandscapeLightingDiffuse, - translation: 'diffuse', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingNorthernLights, - translation: 'northern lights', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingSunRays, - translation: 'sun rays', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingGoldenHour, - translation: 'golden hour', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingEarlyMorning, - translation: 'early morning', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingBlueHour, - translation: 'blue hour', - }, - { - value: SeaPenTemplateOption.kLandscapeLightingMidday, - translation: 'midday', - }, - ], - ], - ]), - }, - { - id: SeaPenTemplateId.kScifi.toString(), - title: 'Sci-fi', - text: `Otherworldly <${SeaPenTemplateChip.kScifiFeature}> in <${ - SeaPenTemplateChip.kScifiColor}> colors`, - preview: [{ - url: 'chrome://personalization/images/sea_pen_tile.svg', - }], - options: new Map([ - [ - SeaPenTemplateChip.kScifiFeature, - [ - { - value: SeaPenTemplateOption.kScifiFeatureStreet, - translation: 'street', - }, - { - value: SeaPenTemplateOption.kScifiFeatureSkyline, - translation: 'skyline', - }, - { - value: SeaPenTemplateOption.kScifiFeatureSwamp, - translation: 'swamp', - }, - { - value: SeaPenTemplateOption.kScifiFeatureTransport, - translation: 'transport hub', - }, - { - value: SeaPenTemplateOption.kScifiFeatureBusStop, - translation: 'bus stop', - }, - { - value: SeaPenTemplateOption.kScifiFeatureDesert, - translation: 'desert', - }, - { - value: SeaPenTemplateOption.kScifiFeatureBeach, - translation: 'beach', - }, - { - value: SeaPenTemplateOption.kScifiFeatureMountains, - translation: 'mountains', - }, - { - value: SeaPenTemplateOption.kScifiFeaturePark, - translation: 'park', - }, - { - value: SeaPenTemplateOption.kScifiFeatureForest, - translation: 'forest', - }, - { - value: SeaPenTemplateOption.kScifiFeatureSmallTown, - translation: 'small town', - }, - { - value: SeaPenTemplateOption.kScifiFeatureFarm, - translation: 'farm', - }, - { - value: SeaPenTemplateOption.kScifiFeatureUnderwater, - translation: 'underwater', - }, - ], - ], - [ - SeaPenTemplateChip.kScifiColor, - [ - { - value: SeaPenTemplateOption.kScifiColorEarthy, - translation: 'earthy', - }, - { - value: SeaPenTemplateOption.kScifiColorVibrant, - translation: 'vibrant', - }, - { - value: SeaPenTemplateOption.kScifiColorSilver, - translation: 'silver', - }, - { - value: SeaPenTemplateOption.kScifiColorEerie, - translation: 'eerie', - }, - { - value: SeaPenTemplateOption.kScifiColorComplementary, - translation: 'complementary', - }, - { - value: SeaPenTemplateOption.kScifiColorNeutral, - translation: 'neutral', - }, - ], - ], - ]), - }, - ]; - if (isSeaPenTextInputEnabled()) { - templates.push({ - preview: [{ - url: 'chrome://personalization/images/sea_pen_tile.svg', - }], - title: 'Freeform', - text: 'Freeform', - id: QUERY, - options: new Map(), - }); - } - return templates; -}
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.ts index b16ea43..cd787ba9 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_collections_element.ts
@@ -22,12 +22,13 @@ import {afterNextRender} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {GooglePhotosEnablementState, WallpaperCollection, WallpaperImage} from '../../personalization_app.mojom-webui.js'; -import {isGooglePhotosIntegrationEnabled, isPersonalizationJellyEnabled, isSeaPenEnabled, isTimeOfDayWallpaperEnabled} from '../load_time_booleans.js'; +import {isGooglePhotosIntegrationEnabled, isPersonalizationJellyEnabled, isTimeOfDayWallpaperEnabled} from '../load_time_booleans.js'; import {Paths, PersonalizationRouterElement} from '../personalization_router_element.js'; import {WithPersonalizationStore} from '../personalization_store.js'; import {getCountText, isImageDataUrl, isNonEmptyArray, isSelectionEvent} from '../utils.js'; import {DefaultImageSymbol, kDefaultImageSymbol, kMaximumLocalImagePreviews} from './constants.js'; +import {isSeaPenEnabled} from './sea_pen/load_time_booleans.js'; import {getLoadingPlaceholderAnimationDelay, getLoadingPlaceholders, getPathOrSymbol} from './utils.js'; import {getTemplate} from './wallpaper_collections_element.html.js'; import {fetchGooglePhotosEnabled, fetchLocalData, getDefaultImageThumbnail, initializeBackdropData} from './wallpaper_controller.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts index 90aa44d..914fa95 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts
@@ -8,10 +8,11 @@ */ import {CurrentWallpaper, WallpaperType} from '../../personalization_app.mojom-webui.js'; -import {isGooglePhotosIntegrationEnabled, isSeaPenEnabled} from '../load_time_booleans.js'; +import {isGooglePhotosIntegrationEnabled} from '../load_time_booleans.js'; import {Paths, PersonalizationRouterElement, QueryParams} from '../personalization_router_element.js'; import {WithPersonalizationStore} from '../personalization_store.js'; +import {isSeaPenEnabled} from './sea_pen/load_time_booleans.js'; import {getTemplate} from './wallpaper_subpage_element.html.js'; export class WallpaperSubpageElement extends WithPersonalizationStore {
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_top_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_top_element.ts index 08890b8e..3ec0be3 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_top_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_top_element.ts
@@ -7,11 +7,11 @@ * subpage. */ -import {isSeaPenEnabled, isSeaPenTextInputEnabled} from '../load_time_booleans.js'; import {Paths} from '../personalization_router_element.js'; import {WithPersonalizationStore} from '../personalization_store.js'; -import {QUERY} from './utils.js'; +import {QUERY} from './sea_pen/constants.js'; +import {isSeaPenEnabled, isSeaPenTextInputEnabled} from './sea_pen/load_time_booleans.js'; import {getTemplate} from './wallpaper_subpage_top_element.html.js'; export class WallpaperSubpageTopElement extends WithPersonalizationStore {
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc index e26c250..bfd8d10 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -350,8 +350,7 @@ return false; } const std::vector<ui::Accelerator>& hidden_accelerators = iter->second; - return std::find(hidden_accelerators.begin(), hidden_accelerators.end(), - accelerator) != hidden_accelerators.end(); + return base::Contains(hidden_accelerators, accelerator); } std::optional<std::u16string> GetReservedAcceleratorName(
diff --git a/ash/wm/overview/glanceables/glanceables_bar_view.cc b/ash/wm/overview/glanceables/glanceables_bar_view.cc index 7375aa4..a94f7bf6 100644 --- a/ash/wm/overview/glanceables/glanceables_bar_view.cc +++ b/ash/wm/overview/glanceables/glanceables_bar_view.cc
@@ -10,6 +10,7 @@ #include "ash/style/icon_button.h" #include "ash/wm/work_area_insets.h" #include "base/functional/bind.h" +#include "base/ranges/algorithm.h" #include "base/time/time.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" @@ -78,7 +79,7 @@ } void RemoveChip(GlanceablesChipButton* chip) { - auto iter = std::find(chips_.begin(), chips_.end(), chip); + auto iter = base::ranges::find(chips_, chip); if (iter != chips_.end()) { RemoveChildViewT(chip); chips_.erase(iter);
diff --git a/ash/wm/raster_scale/raster_scale_controller.cc b/ash/wm/raster_scale/raster_scale_controller.cc index ee877cc5..f4711bc 100644 --- a/ash/wm/raster_scale/raster_scale_controller.cc +++ b/ash/wm/raster_scale/raster_scale_controller.cc
@@ -6,6 +6,7 @@ #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" +#include "base/ranges/algorithm.h" #include "ui/aura/client/aura_constants.h" namespace ash { @@ -96,7 +97,7 @@ auto& scales = iter->second; DCHECK(base::Contains(scales, raster_scale)); - auto scale_iter = std::find(scales.begin(), scales.end(), raster_scale); + auto scale_iter = base::ranges::find(scales, raster_scale); if (scale_iter != scales.end()) { scales.erase(scale_iter); }
diff --git a/ash/wm/resize_shadow_and_cursor_unittest.cc b/ash/wm/resize_shadow_and_cursor_unittest.cc index 2df3dc5d..34616ac9 100644 --- a/ash/wm/resize_shadow_and_cursor_unittest.cc +++ b/ash/wm/resize_shadow_and_cursor_unittest.cc
@@ -659,10 +659,8 @@ auto parent_children = shadow_layer->parent()->children(); auto* window_layer = test_window->layer(); - auto shadow_iter = - std::find(parent_children.begin(), parent_children.end(), shadow_layer); - auto window_iter = - std::find(parent_children.begin(), parent_children.end(), window_layer); + auto shadow_iter = base::ranges::find(parent_children, shadow_layer); + auto window_iter = base::ranges::find(parent_children, window_layer); EXPECT_LT(std::distance(parent_children.begin(), shadow_iter), std::distance(parent_children.begin(), window_iter)); }
diff --git a/base/metrics/field_trial_params.cc b/base/metrics/field_trial_params.cc index 37f90ef..2041180 100644 --- a/base/metrics/field_trial_params.cc +++ b/base/metrics/field_trial_params.cc
@@ -225,8 +225,16 @@ } std::string FeatureParam<std::string>::Get() const { - const std::string value = GetFieldTrialParamValueByFeature(*feature, name); - return value.empty() ? default_value : value; + // We don't use `GetFieldTrialParamValueByFeature()` to handle empty values in + // the map. + FieldTrialParams params; + if (GetFieldTrialParamsByFeature(*feature, ¶ms)) { + auto it = params.find(name); + if (it != params.end()) { + return it->second; + } + } + return default_value; } double FeatureParam<double>::Get() const {
diff --git a/base/metrics/field_trial_params_unittest.cc b/base/metrics/field_trial_params_unittest.cc index 0658ac6f..7da6472 100644 --- a/base/metrics/field_trial_params_unittest.cc +++ b/base/metrics/field_trial_params_unittest.cc
@@ -255,7 +255,7 @@ CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get()); - EXPECT_EQ("default", a.Get()); // empty + EXPECT_EQ("", a.Get()); // empty EXPECT_EQ("non-default", b.Get()); EXPECT_EQ("non-default", c.Get()); EXPECT_EQ("", d.Get()); // empty
diff --git a/build/util/android_chrome_version.py b/build/util/android_chrome_version.py index ebf7e0b..ebd8cf4 100755 --- a/build/util/android_chrome_version.py +++ b/build/util/android_chrome_version.py
@@ -104,6 +104,7 @@ ], 'hybrid': [ ('CHROME', 'CHROME', '64'), + ('CHROME_32', 'CHROME', '32'), ('CHROME_MODERN', 'CHROME_MODERN', '64'), ('MONOCHROME', 'MONOCHROME', '32_64'), ('MONOCHROME_32', 'MONOCHROME', '32'),
diff --git a/chrome/VERSION b/chrome/VERSION index 86643d59..a384661 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=122 MINOR=0 -BUILD=6183 +BUILD=6184 PATCH=0
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 1127109..9162ece 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -296,6 +296,7 @@ "junit/src/org/chromium/chrome/browser/payments/AddressEditorTest.java", "junit/src/org/chromium/chrome/browser/payments/ContactEditorTest.java", "junit/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImplTest.java", + "junit/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java", "junit/src/org/chromium/chrome/browser/quickactionsearchwidget/QuickActionSearchWidgetProviderTest.java", "junit/src/org/chromium/chrome/browser/read_later/ReadLaterIPHControllerUnitTest.java", "junit/src/org/chromium/chrome/browser/read_later/ReadingListUtilsUnitTest.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni index 54c50b5..de1736f 100644 --- a/chrome/android/chrome_public_apk_tmpl.gni +++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -264,8 +264,13 @@ version_code = _version_code } if (defined(invoker.expected_android_manifest)) { - expected_android_manifest_version_code_offset = chrome_version_code - expected_android_manifest_library_version_offset = chrome_version_code + if (android_64bit_target_cpu) { + _version_code_offset = chrome_32_version_code + } else { + _version_code_offset = chrome_version_code + } + expected_android_manifest_version_code_offset = _version_code_offset + expected_android_manifest_library_version_offset = _version_code_offset } if (_target_type == "android_apk") {
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index dff1413a..273f944 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -408,7 +408,6 @@ "javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java", "javatests/src/org/chromium/chrome/browser/query_tiles/ListMatchers.java", "javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java", - "javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java", "javatests/src/org/chromium/chrome/browser/query_tiles/TileMatchers.java", "javatests/src/org/chromium/chrome/browser/query_tiles/ViewActions.java", "javatests/src/org/chromium/chrome/browser/read_later/ReadLaterContextMenuTest.java",
diff --git a/chrome/android/expectations/expectations.gni b/chrome/android/expectations/expectations.gni index c9adf02..09a0fa2 100644 --- a/chrome/android/expectations/expectations.gni +++ b/chrome/android/expectations/expectations.gni
@@ -5,15 +5,11 @@ import("//build/config/android/config.gni") import("//build/config/coverage/coverage.gni") -# Chosen to match what CQ bots exist. +# Chosen to match android-binary-size trybot. enable_libs_and_assets_verification = !enable_chrome_android_internal && !is_component_build && !use_jacoco_coverage && - ((target_cpu == "arm" && android_channel == "stable") || - (target_cpu == "arm64" && android_channel == "default" && - !skip_secondary_abi_for_cq && - # Disable checks in official arm64 builds due to unwind assets. - !is_official_build)) + (target_cpu == "arm64" && android_channel == "stable") # enable_chrome_android_internal: Manifest merging of play services deps vary. # use_jacoco_coverage: Adds proguard flags. @@ -21,4 +17,4 @@ # target_cpu: android:versionCode varies. enable_manifest_verification = !is_java_debug && !enable_chrome_android_internal && !use_jacoco_coverage && - android_channel == "stable" && target_cpu == "arm" + (target_cpu == "arm64" && android_channel == "stable")
diff --git a/chrome/android/expectations/monochrome_public_bundle.arm64.libs_and_assets.expected b/chrome/android/expectations/monochrome_public_bundle.arm64.libs_and_assets.expected index 63949774..5e688fe 100644 --- a/chrome/android/expectations/monochrome_public_bundle.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/monochrome_public_bundle.arm64.libs_and_assets.expected
@@ -1,5 +1,5 @@ -apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libmonochrome.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libmonochrome.so, compress=False, alignment=16384 apk_path=lib/armeabi-v7a/libarcore_sdk_c.so, compress=False, alignment=4096 apk_path=lib/armeabi-v7a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 apk_path=lib/armeabi-v7a/libmonochrome.so, compress=False, alignment=4096 @@ -7,7 +7,6 @@ apk_path=assets/icudtl.dat, compress=False, alignment=4 apk_path=assets/locales/af.pak, compress=False, alignment=4 apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/locales/ar.pak, compress=False, alignment=4 apk_path=assets/locales/as.pak, compress=False, alignment=4 apk_path=assets/locales/az.pak, compress=False, alignment=4 @@ -22,7 +21,6 @@ apk_path=assets/locales/el.pak, compress=False, alignment=4 apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/locales/es-419.pak, compress=False, alignment=4 apk_path=assets/locales/es.pak, compress=False, alignment=4 apk_path=assets/locales/et.pak, compress=False, alignment=4 @@ -93,7 +91,6 @@ apk_path=assets/snapshot_blob_64.bin, compress=False, alignment=4 apk_path=assets/stored-locales/af.pak, compress=False, alignment=4 apk_path=assets/stored-locales/am.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/ar.pak, compress=False, alignment=4 apk_path=assets/stored-locales/as.pak, compress=False, alignment=4 apk_path=assets/stored-locales/az.pak, compress=False, alignment=4 @@ -108,7 +105,6 @@ apk_path=assets/stored-locales/el.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/stored-locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/stored-locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es-419.pak, compress=False, alignment=4 apk_path=assets/stored-locales/es.pak, compress=False, alignment=4 apk_path=assets/stored-locales/et.pak, compress=False, alignment=4
diff --git a/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected index a76c493..147a50e 100644 --- a/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__base.AndroidManifest.expected
@@ -5,7 +5,7 @@ platformBuildVersionCode="34" platformBuildVersionName="14" android:isolatedSplits="true" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/> <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/> @@ -92,6 +92,7 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@drawable/ic_launcher_round" android:supportsRtl="true" + android:use32bitAbi="true" android:zygotePreloadName="org.chromium.content_public.app.ZygotePreload"> <activity # DIFF-ANCHOR: ea1a94af android:name="com.google.android.gms.common.api.GoogleApiActivity"
diff --git a/chrome/android/expectations/monochrome_public_bundle__cablev2_authenticator.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__cablev2_authenticator.AndroidManifest.expected index d790789..e887e1f 100644 --- a/chrome/android/expectations/monochrome_public_bundle__cablev2_authenticator.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__cablev2_authenticator.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:onDemand="false" dist:title="@string/cablev2_authenticator_module_title"> # DIFF-ANCHOR: 4362cefb <dist:fusing dist:include="true"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle__chrome.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__chrome.AndroidManifest.expected index 03b225923..afcd221 100644 --- a/chrome/android/expectations/monochrome_public_bundle__chrome.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__chrome.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:onDemand="false"> # DIFF-ANCHOR: 2805007f <dist:fusing dist:include="true"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle__dev_ui.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__dev_ui.AndroidManifest.expected index 1faf6b29..e1fd9d65 100644 --- a/chrome/android/expectations/monochrome_public_bundle__dev_ui.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__dev_ui.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:onDemand="true" dist:title="@string/dev_ui_module_title"> # DIFF-ANCHOR: 671a5c9f <dist:fusing dist:include="true"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle__stack_unwinder.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__stack_unwinder.AndroidManifest.expected index 5ff4869..c750badd 100644 --- a/chrome/android/expectations/monochrome_public_bundle__stack_unwinder.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__stack_unwinder.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:onDemand="true" dist:title="@string/stack_unwinder_module_title"> # DIFF-ANCHOR: 2d9e963c <dist:fusing dist:include="true"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle__test_dummy.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__test_dummy.AndroidManifest.expected index a767889..55560448 100644 --- a/chrome/android/expectations/monochrome_public_bundle__test_dummy.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__test_dummy.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:onDemand="true" dist:title="@string/test_dummy_module_title"> # DIFF-ANCHOR: d029b25b <dist:fusing dist:include="true"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle__vr.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle__vr.AndroidManifest.expected index 4946b66..2c9a0b9e 100644 --- a/chrome/android/expectations/monochrome_public_bundle__vr.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle__vr.AndroidManifest.expected
@@ -6,7 +6,7 @@ package="org.chromium.chrome.stable" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=20" + android:versionCode="OFFSET=21" android:versionName="#.#.#.#"> <dist:module dist:instant="false" dist:title="@string/vr_module_title"> # DIFF-ANCHOR: aac219ae <dist:delivery> # DIFF-ANCHOR: ea157ece
diff --git a/chrome/android/expectations/trichrome_chrome_32_bundle.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_chrome_32_bundle.arm64.libs_and_assets.expected index cf37af6..a57a100 100644 --- a/chrome/android/expectations/trichrome_chrome_32_bundle.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_chrome_32_bundle.arm64.libs_and_assets.expected
@@ -2,7 +2,6 @@ apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 apk_path=assets/locales/af.pak, compress=False, alignment=4 apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/locales/ar.pak, compress=False, alignment=4 apk_path=assets/locales/as.pak, compress=False, alignment=4 apk_path=assets/locales/az.pak, compress=False, alignment=4 @@ -17,7 +16,6 @@ apk_path=assets/locales/el.pak, compress=False, alignment=4 apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/locales/es-419.pak, compress=False, alignment=4 apk_path=assets/locales/es.pak, compress=False, alignment=4 apk_path=assets/locales/et.pak, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_chrome_64_32_bundle.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_chrome_64_32_bundle.arm64.libs_and_assets.expected index 7e76a5fd..c6c7acc 100644 --- a/chrome/android/expectations/trichrome_chrome_64_32_bundle.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_chrome_64_32_bundle.arm64.libs_and_assets.expected
@@ -1,8 +1,7 @@ -apk_path=lib/arm64-v8a/libchromium_android_linker.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libchromium_android_linker.so, compress=False, alignment=16384 apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 apk_path=assets/locales/af.pak, compress=False, alignment=4 apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/locales/ar.pak, compress=False, alignment=4 apk_path=assets/locales/as.pak, compress=False, alignment=4 apk_path=assets/locales/az.pak, compress=False, alignment=4 @@ -17,7 +16,6 @@ apk_path=assets/locales/el.pak, compress=False, alignment=4 apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/locales/es-419.pak, compress=False, alignment=4 apk_path=assets/locales/es.pak, compress=False, alignment=4 apk_path=assets/locales/et.pak, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_chrome_64_bundle.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_chrome_64_bundle.arm64.libs_and_assets.expected index 7e76a5fd..c6c7acc 100644 --- a/chrome/android/expectations/trichrome_chrome_64_bundle.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_chrome_64_bundle.arm64.libs_and_assets.expected
@@ -1,8 +1,7 @@ -apk_path=lib/arm64-v8a/libchromium_android_linker.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libchromium_android_linker.so, compress=False, alignment=16384 apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 apk_path=assets/locales/af.pak, compress=False, alignment=4 apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/locales/ar.pak, compress=False, alignment=4 apk_path=assets/locales/as.pak, compress=False, alignment=4 apk_path=assets/locales/az.pak, compress=False, alignment=4 @@ -17,7 +16,6 @@ apk_path=assets/locales/el.pak, compress=False, alignment=4 apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/locales/es-419.pak, compress=False, alignment=4 apk_path=assets/locales/es.pak, compress=False, alignment=4 apk_path=assets/locales/et.pak, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_chrome_bundle.arm64.libs_and_assets.expected index cf37af6..a57a100 100644 --- a/chrome/android/expectations/trichrome_chrome_bundle.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_chrome_bundle.arm64.libs_and_assets.expected
@@ -2,7 +2,6 @@ apk_path=assets/chrome_100_percent.pak, compress=False, alignment=4 apk_path=assets/locales/af.pak, compress=False, alignment=4 apk_path=assets/locales/am.pak, compress=False, alignment=4 -apk_path=assets/locales/ar-XB.pak, compress=False, alignment=4 apk_path=assets/locales/ar.pak, compress=False, alignment=4 apk_path=assets/locales/as.pak, compress=False, alignment=4 apk_path=assets/locales/az.pak, compress=False, alignment=4 @@ -17,7 +16,6 @@ apk_path=assets/locales/el.pak, compress=False, alignment=4 apk_path=assets/locales/en-GB.pak, compress=False, alignment=4 apk_path=assets/locales/en-US.pak, compress=False, alignment=4 -apk_path=assets/locales/en-XA.pak, compress=False, alignment=4 apk_path=assets/locales/es-419.pak, compress=False, alignment=4 apk_path=assets/locales/es.pak, compress=False, alignment=4 apk_path=assets/locales/et.pak, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_chrome_bundle__base.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle__base.AndroidManifest.expected index 66d47e31..5463aac 100644 --- a/chrome/android/expectations/trichrome_chrome_bundle__base.AndroidManifest.expected +++ b/chrome/android/expectations/trichrome_chrome_bundle__base.AndroidManifest.expected
@@ -5,7 +5,7 @@ platformBuildVersionCode="34" platformBuildVersionName="14" android:isolatedSplits="true" - android:versionCode="OFFSET=30" + android:versionCode="OFFSET=31" android:versionName="#.#.#.#"> <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/> <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/> @@ -502,6 +502,6 @@ android:permission="$PACKAGE.permission.CHILD_SERVICE" android:process=":sandboxed_process9"> </service> # DIFF-ANCHOR: e2f3bbbd - <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="OFFSET=30"/> + <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="OFFSET=31"/> </application> </manifest>
diff --git a/chrome/android/expectations/trichrome_library_64_32_apk.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_library_64_32_apk.arm64.libs_and_assets.expected index c731b0ed..0df38f2 100644 --- a/chrome/android/expectations/trichrome_library_64_32_apk.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_library_64_32_apk.arm64.libs_and_assets.expected
@@ -1,5 +1,5 @@ -apk_path=lib/arm64-v8a/libarcore_sdk_c.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libmonochrome_64.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libarcore_sdk_c.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libmonochrome_64.so, compress=False, alignment=16384 apk_path=assets/icudtl.dat, compress=False, alignment=4 apk_path=assets/snapshot_blob_64.bin, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_library_64_apk.arm64.libs_and_assets.expected b/chrome/android/expectations/trichrome_library_64_apk.arm64.libs_and_assets.expected index c731b0ed..0df38f2 100644 --- a/chrome/android/expectations/trichrome_library_64_apk.arm64.libs_and_assets.expected +++ b/chrome/android/expectations/trichrome_library_64_apk.arm64.libs_and_assets.expected
@@ -1,5 +1,5 @@ -apk_path=lib/arm64-v8a/libarcore_sdk_c.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=4096 -apk_path=lib/arm64-v8a/libmonochrome_64.so, compress=False, alignment=4096 +apk_path=lib/arm64-v8a/libarcore_sdk_c.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libcrashpad_handler_trampoline.so, compress=False, alignment=16384 +apk_path=lib/arm64-v8a/libmonochrome_64.so, compress=False, alignment=16384 apk_path=assets/icudtl.dat, compress=False, alignment=4 apk_path=assets/snapshot_blob_64.bin, compress=False, alignment=4
diff --git a/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected b/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected index 3d62634d..6b8b05a8 100644 --- a/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected +++ b/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected
@@ -4,7 +4,7 @@ package="org.chromium.trichromelibrary" platformBuildVersionCode="34" platformBuildVersionName="14" - android:versionCode="OFFSET=30" + android:versionCode="OFFSET=31" android:versionName="#.#.#.#"> <uses-feature android:glEsVersion="0x00020000"/> <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> @@ -15,7 +15,8 @@ android:hasCode="false" android:icon="@drawable/icon_webview" android:label="Trichrome Library" - android:multiArch="true"> - <static-library android:name="$PACKAGE" android:version="OFFSET=30"/> + android:multiArch="true" + android:use32bitAbi="true"> + <static-library android:name="$PACKAGE" android:version="OFFSET=31"/> </application> </manifest>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java index 31c1f1de..f7d5a98f5 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -742,9 +742,7 @@ mPriceMessageService.invalidateMessage(); } boolean showQuickly = mTabListCoordinator.resetWithListOfTabs(tabs, quickMode); - if (showQuickly) { - removeAllAppendedMessage(); - } + removeAllAppendedMessage(); if (tabs != null && tabs.size() > 0) { if (mPriceMessageService != null && PriceTrackingUtilities.isPriceAlertsMessageCardEnabled(
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java index a41d5ab4..7f7987f 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoCardRenderTest.java
@@ -75,6 +75,7 @@ @Test @MediumTest @Feature({"RenderTest"}) + @DisabledTest(message = "https://crbug.com/1376143") public void testRenderReauthPromoMessageCard_Portrait() throws IOException { final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); @@ -106,6 +107,7 @@ @Test @MediumTest @Feature({"RenderTest"}) + @DisabledTest(message = "https://crbug.com/1376143") public void testRenderReauthPromoMessageCard_Snackbar() throws IOException { final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFeatures.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFeatures.java index cd6fc9f4..e300adc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFeatures.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkFeatures.java
@@ -12,9 +12,7 @@ public class BookmarkFeatures { /** Returns whether an additional "add bookmark" item should be in the overflow menu. */ public static boolean isBookmarkMenuItemAsDedicatedRowEnabled() { - // TODO(wylieb): Remove the BOOKMARKS_REFRESH flag. return FeatureList.isInitialized() - && ChromeFeatureList.isEnabled(ChromeFeatureList.BOOKMARKS_REFRESH) && ShoppingFeatures.isShoppingListEligible(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index d41e647..0b517d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -714,7 +714,6 @@ private void refreshCachedSegmentationResult() { FeedPositionUtils.cacheSegmentationResult(); - QueryTileUtils.cacheSegmentationResult(); } private void startBindingManagementIfNeeded() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java index e0e4a5b..7ad11bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java
@@ -4,75 +4,16 @@ package org.chromium.chrome.browser.query_tiles; -import androidx.annotation.IntDef; -import androidx.annotation.VisibleForTesting; - import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; -import org.chromium.base.ResettersForTesting; -import org.chromium.base.TimeUtils; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; -import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.segmentation_platform.SegmentationPlatformServiceFactory; -import org.chromium.components.segmentation_platform.SegmentationPlatformService; -import org.chromium.components.segmentation_platform.proto.SegmentationProto.SegmentId; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; /** Handles various feature utility functions for query tiles. */ @JNINamespace("query_tiles") public class QueryTileUtils { private static Boolean sShowQueryTilesOnNtp; private static Boolean sShowQueryTilesOnStartSurface; - private static final long INVALID_DECISION_TIMESTAMP = -1L; - private static final String QUERY_TILES_SEGMENTATION_PLATFORM_KEY = "query_tiles"; - private static int sSegmentationResultsForTesting = -1; - - @VisibleForTesting static final long MILLISECONDS_PER_DAY = TimeUtils.SECONDS_PER_DAY * 1000; - @VisibleForTesting static final int DEFAULT_NUM_DAYS_KEEP_SHOWING_QUERY_TILES = 28; - @VisibleForTesting static final int DEFAULT_NUM_DAYS_MV_CLICKS_BELOW_THRESHOLD = 7; - - // Constants with ShowQueryTilesSegmentationResult in enums.xml. - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - @IntDef({ - ShowQueryTilesSegmentationResult.UNINITIALIZED, - ShowQueryTilesSegmentationResult.DONT_SHOW, - ShowQueryTilesSegmentationResult.SHOW - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ShowQueryTilesSegmentationResult { - int UNINITIALIZED = 0; - int DONT_SHOW = 1; - int SHOW = 2; - int NUM_ENTRIES = 3; - } - - // Constants with ShowQueryTilesSegmentationResultComparison in enums.xml. - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - @IntDef({ - ShowQueryTilesSegmentationResultComparison.UNINITIALIZED, - ShowQueryTilesSegmentationResultComparison.SEGMENTATION_ENABLED_LOGIC_ENABLED, - ShowQueryTilesSegmentationResultComparison.SEGMENTATION_ENABLED_LOGIC_DISABLED, - ShowQueryTilesSegmentationResultComparison.SEGMENTATION_DISABLED_LOGIC_ENABLED, - ShowQueryTilesSegmentationResultComparison.SEGMENTATION_DISABLED_LOGIC_DISABLED - }) - @Retention(RetentionPolicy.SOURCE) - @VisibleForTesting - public @interface ShowQueryTilesSegmentationResultComparison { - int UNINITIALIZED = 0; - int SEGMENTATION_ENABLED_LOGIC_ENABLED = 1; - int SEGMENTATION_ENABLED_LOGIC_DISABLED = 2; - int SEGMENTATION_DISABLED_LOGIC_ENABLED = 3; - int SEGMENTATION_DISABLED_LOGIC_DISABLED = 4; - int NUM_ENTRIES = 5; - } /** * Whether query tiles is enabled and should be shown on NTP. @@ -85,7 +26,7 @@ boolean queryTileEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES) && ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES_IN_NTP); - sShowQueryTilesOnNtp = queryTileEnabled && shouldShowQueryTiles(); + sShowQueryTilesOnNtp = queryTileEnabled; return sShowQueryTilesOnNtp; } @@ -99,124 +40,10 @@ boolean queryTileEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES) || QueryTileUtilsJni.get().isQueryTilesEnabled(); - sShowQueryTilesOnStartSurface = queryTileEnabled && shouldShowQueryTiles(); + sShowQueryTilesOnStartSurface = queryTileEnabled; return sShowQueryTilesOnStartSurface; } - /** - * Called to Check whether query tiles should be displayed. Here are the rules for showing query - * tile: If user hasn't clicked on MV tiles for a while, query tiles will be shown for a period - * of time. And the decision is reevaluated when it expires. - * @return Whether query tiles should be displayed. - */ - @VisibleForTesting - static boolean shouldShowQueryTiles() { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES_SEGMENTATION)) { - return true; - } - - long nextDecisionTimestamp = - ChromeSharedPreferences.getInstance() - .readLong( - ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS, - INVALID_DECISION_TIMESTAMP); - - boolean noPreviousHistory = (nextDecisionTimestamp == INVALID_DECISION_TIMESTAMP); - - boolean nextDecisionTimestampReached = System.currentTimeMillis() >= nextDecisionTimestamp; - - // Use segmentation model result only if finch enabled and next decision is expired or - // unavailable. If nextDecisionTimestamp is available and hasn't been reached, continue - // using code algorithm. - boolean lastDecisionExpired = noPreviousHistory || nextDecisionTimestampReached; - if (lastDecisionExpired) { - ChromeSharedPreferences.getInstance() - .removeKey(ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS); - return getBehaviourResultFromSegmentation(getSegmentationResult(), false); - } - - return ChromeSharedPreferences.getInstance() - .readBoolean(ChromePreferenceKeys.QUERY_TILES_SHOW_ON_NTP, false); - } - - /** - * Called to check whether query tiles should be displayed based on segmentation model result. - * @param segmentationResult The result from segmentation model. - * @param defaultResult The default result. - * @return Whether to show query tiles based on segmentation result. When unavailable, returns - * the default value given. - */ - private static boolean getBehaviourResultFromSegmentation( - @ShowQueryTilesSegmentationResult int segmentationResult, boolean defaultResult) { - RecordHistogram.recordEnumeratedHistogram( - "Search.QueryTiles.ShowQueryTilesSegmentationResult", - segmentationResult, - ShowQueryTilesSegmentationResult.NUM_ENTRIES); - switch (segmentationResult) { - case ShowQueryTilesSegmentationResult.DONT_SHOW: - return false; - case ShowQueryTilesSegmentationResult.SHOW: - return true; - - case ShowQueryTilesSegmentationResult.UNINITIALIZED: - default: - return defaultResult; - } - } - - /** - * Called to get segment selection result from shared prefs. - * @return The segmentation result. - */ - private static @ShowQueryTilesSegmentationResult int getSegmentationResult() { - assert ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES_SEGMENTATION); - @ShowQueryTilesSegmentationResult int segmentationResult; - if (sSegmentationResultsForTesting == -1) { - segmentationResult = - ChromeSharedPreferences.getInstance() - .readInt( - ChromePreferenceKeys.SEGMENTATION_SHOW_QUERY_TILES, - ShowQueryTilesSegmentationResult.DONT_SHOW); - } else { - segmentationResult = sSegmentationResultsForTesting; - } - - return segmentationResult; - } - - /** - * Called to cache segment selection result from segmentation platform service into shared - * prefs. - */ - public static void cacheSegmentationResult() { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES_SEGMENTATION)) return; - SegmentationPlatformService segmentationPlatformService = - SegmentationPlatformServiceFactory.getForProfile( - Profile.getLastUsedRegularProfile()); - segmentationPlatformService.getSelectedSegment( - QUERY_TILES_SEGMENTATION_PLATFORM_KEY, - result -> { - @ShowQueryTilesSegmentationResult int segmentationResult; - if (!result.isReady) { - segmentationResult = ShowQueryTilesSegmentationResult.UNINITIALIZED; - } else if (result.selectedSegment - == SegmentId.OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES) { - segmentationResult = ShowQueryTilesSegmentationResult.SHOW; - } else { - segmentationResult = ShowQueryTilesSegmentationResult.DONT_SHOW; - } - ChromeSharedPreferences.getInstance() - .writeInt( - ChromePreferenceKeys.SEGMENTATION_SHOW_QUERY_TILES, - segmentationResult); - }); - } - - public static void setSegmentationResultsForTesting(int result) { - sSegmentationResultsForTesting = result; - ResettersForTesting.register(() -> sSegmentationResultsForTesting = -1); - } - @NativeMethods interface Natives { boolean isQueryTilesEnabled();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java index e08d96a..39a764dc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java
@@ -446,7 +446,6 @@ @SmallTest @Feature({"Browser", "Main"}) @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) - @EnableFeatures(ChromeFeatureList.BOOKMARKS_REFRESH) public void testAddBookmarkMenuItem() throws IOException { ShoppingFeatures.setShoppingListEligibleForTesting(true); TestThreadUtils.runOnUiThreadBlocking(() -> mAppMenuHandler.hideAppMenu()); @@ -462,7 +461,6 @@ @SmallTest @Feature({"Browser", "Main", "RenderTest"}) @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) - @EnableFeatures(ChromeFeatureList.BOOKMARKS_REFRESH) public void testEditBookmarkMenuItem() throws IOException { ShoppingFeatures.setShoppingListEligibleForTesting(true); TestThreadUtils.runOnUiThreadBlocking(() -> mAppMenuHandler.hideAppMenu());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowRenderTest.java index 89847a8..d63e2ac 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowRenderTest.java
@@ -35,14 +35,12 @@ import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.commerce.ShoppingFeatures; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.R; import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.image_fetcher.ImageFetcher; import org.chromium.components.payments.CurrencyFormatter; @@ -57,7 +55,6 @@ /** Render tests for the Shopping power bookmarks experience. */ @RunWith(ParameterizedRunner.class) @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) -@EnableFeatures(ChromeFeatureList.BOOKMARKS_REFRESH) public class PowerBookmarkShoppingItemRowRenderTest { @ParameterAnnotations.ClassParameter private static List<ParameterSet> sClassParams = new NightModeParams().getParameters();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowTest.java index 01fff1d..0807187 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/PowerBookmarkShoppingItemRowTest.java
@@ -32,11 +32,9 @@ import org.chromium.chrome.browser.commerce.PriceTrackingUtils; import org.chromium.chrome.browser.commerce.PriceTrackingUtilsJni; import org.chromium.chrome.browser.commerce.ShoppingFeatures; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkItem; import org.chromium.components.bookmarks.BookmarkType; @@ -56,7 +54,6 @@ /** Tests for the Shopping power bookmarks experience. */ @RunWith(ChromeJUnit4ClassRunner.class) -@EnableFeatures(ChromeFeatureList.BOOKMARKS_REFRESH) public class PowerBookmarkShoppingItemRowTest extends BlankUiTestActivityTestCase { private static final String TITLE = "PowerBookmarkShoppingItemRow";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java deleted file mode 100644 index b2e3c16..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java +++ /dev/null
@@ -1,130 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.query_tiles; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.lessThanOrEqualTo; - -import androidx.test.filters.SmallTest; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; -import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; - -/** Tests for the query tiles section on new tab page. */ -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class QueryTileUtilsTest { - private static final int MILLISECONDS_PER_MINUTE = 60 * 1000; - - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - - @Before - public void setUp() { - mActivityTestRule.startMainActivityOnBlankPage(); - QueryTileUtils.setSegmentationResultsForTesting(0 /*UNINITIALIZED*/); - ChromeSharedPreferences.getInstance() - .removeKey(ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS); - } - - @Test - @SmallTest - @EnableFeatures({ChromeFeatureList.QUERY_TILES, ChromeFeatureList.QUERY_TILES_IN_NTP}) - @DisableFeatures(ChromeFeatureList.QUERY_TILES_SEGMENTATION) - public void testIsQueryTilesEnabledOnNtpWithoutSegmentation() { - Assert.assertTrue(QueryTileUtils.isQueryTilesEnabledOnNtp()); - } - - @Test - @SmallTest - @EnableFeatures({ - ChromeFeatureList.QUERY_TILES, - ChromeFeatureList.QUERY_TILES_IN_NTP, - ChromeFeatureList.QUERY_TILES_SEGMENTATION - }) - public void testShouldUseSegmentationModel() { - // Set segmentation model to show query tiles. - ChromeSharedPreferences.getInstance() - .writeBoolean(ChromePreferenceKeys.QUERY_TILES_SHOW_ON_NTP, false); - QueryTileUtils.setSegmentationResultsForTesting(2 /*SHOW*/); - - // Verify that query tiles is shown via segmentation model when no previous history. - Assert.assertTrue(QueryTileUtils.shouldShowQueryTiles()); - - // Verify that query tiles is shown via segmentation model when previous decision time - // expired. - nextDecisionTimeReached(); - Assert.assertTrue(QueryTileUtils.shouldShowQueryTiles()); - - // Verify that segmentation is not used when previous decision time did not expire. - ChromeSharedPreferences.getInstance() - .writeLong( - ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS, - System.currentTimeMillis() + QueryTileUtils.MILLISECONDS_PER_DAY); - Assert.assertFalse(QueryTileUtils.shouldShowQueryTiles()); - } - - /** - * Check that the next decision time is within |numOfDays| from now. - * - * @param numOfDays Number of days to check. - */ - private void nextDecisionTimeStampInDays(int numOfDays) { - long approximateTime = - System.currentTimeMillis() + numOfDays * QueryTileUtils.MILLISECONDS_PER_DAY; - long nextDecisionTime = - ChromeSharedPreferences.getInstance() - .readLong( - ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS, 0); - - assertThat( - "new decision time lower bound", - approximateTime - MILLISECONDS_PER_MINUTE, - lessThanOrEqualTo(nextDecisionTime)); - - assertThat( - "new decision time upper bound", - approximateTime + MILLISECONDS_PER_MINUTE, - greaterThanOrEqualTo(nextDecisionTime)); - } - - /** Helper method to simulate that the next decision time has reached. */ - void nextDecisionTimeReached() { - ChromeSharedPreferences.getInstance() - .writeLong( - ChromePreferenceKeys.QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS, - System.currentTimeMillis() - MILLISECONDS_PER_MINUTE); - } - - /** Helper method to check that query tiles will be shown from now on for a period of time. */ - void queryTilesWillBeShownFromNowOn() { - nextDecisionTimeStampInDays(QueryTileUtils.DEFAULT_NUM_DAYS_KEEP_SHOWING_QUERY_TILES); - Assert.assertTrue( - ChromeSharedPreferences.getInstance() - .readBoolean(ChromePreferenceKeys.QUERY_TILES_SHOW_ON_NTP, false)); - } - - /** Helper method to check that query tiles will be hidden from now on for a period of time. */ - void queryTilesWillBeHiddenFromNowOn() { - nextDecisionTimeStampInDays(QueryTileUtils.DEFAULT_NUM_DAYS_MV_CLICKS_BELOW_THRESHOLD); - Assert.assertFalse( - ChromeSharedPreferences.getInstance() - .readBoolean(ChromePreferenceKeys.QUERY_TILES_SHOW_ON_NTP, false)); - } -}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java index 3f4045c..882ea7e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -247,20 +247,13 @@ } private void setupFeatureDefaults() { - setBookmarkItemRowEnabled(false); - setShoppingListItemRowEnabled(false); + setShoppingListEligible(false); + setShoppingListEligible(false); FeatureList.setTestValues(mTestValues); } - private void setBookmarkItemRowEnabled(boolean enabled) { + private void setShoppingListEligible(boolean enabled) { ShoppingFeatures.setShoppingListEligibleForTesting(enabled); - mTestValues.addFeatureFlagOverride(ChromeFeatureList.BOOKMARKS_REFRESH, enabled); - FeatureList.setTestValues(mTestValues); - } - - private void setShoppingListItemRowEnabled(boolean enabled) { - ShoppingFeatures.setShoppingListEligibleForTesting(enabled); - mTestValues.addFeatureFlagOverride(ChromeFeatureList.BOOKMARKS_REFRESH, enabled); FeatureList.setTestValues(mTestValues); } @@ -742,7 +735,7 @@ @Test public void updateBookmarkMenuItemRow() { - setBookmarkItemRowEnabled(true); + setShoppingListEligible(true); doReturn(true).when(mBookmarkModel).isEditBookmarksEnabled(); MenuItem bookmarkMenuItemAdd = mock(MenuItem.class); @@ -755,7 +748,7 @@ @Test public void updateBookmarkMenuItemRow_NullTab() { - setBookmarkItemRowEnabled(true); + setShoppingListEligible(true); MenuItem bookmarkMenuItemAdd = mock(MenuItem.class); MenuItem bookmarkMenuItemEdit = mock(MenuItem.class); @@ -767,7 +760,7 @@ @Test public void updateBookmarkMenuItemRow_NullBookmarkModel() { - setBookmarkItemRowEnabled(true); + setShoppingListEligible(true); mBookmarkModelSupplier.set(null); MenuItem bookmarkMenuItemAdd = mock(MenuItem.class); @@ -780,7 +773,7 @@ @Test public void enablePriceTrackingItemRow() { - setShoppingListItemRowEnabled(true); + setShoppingListEligible(true); PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true); doReturn(true).when(mBookmarkModel).isEditBookmarksEnabled(); @@ -803,7 +796,7 @@ @Test public void enablePriceTrackingItemRow_NullBookmarkModel() { - setShoppingListItemRowEnabled(true); + setShoppingListEligible(true); PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true); mBookmarkModelSupplier.set(null); @@ -817,7 +810,7 @@ @Test public void enablePriceTrackingItemRow_NullBookmarkId() { - setShoppingListItemRowEnabled(true); + setShoppingListEligible(true); PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true); doReturn(true).when(mBookmarkModel).isEditBookmarksEnabled(); @@ -840,7 +833,7 @@ @Test public void enablePriceTrackingItemRow_PriceTrackingEnabled() { - setShoppingListItemRowEnabled(true); + setShoppingListEligible(true); PowerBookmarkUtils.setPriceTrackingEligibleForTesting(true); doReturn(true).when(mBookmarkModel).isEditBookmarksEnabled(); @@ -887,7 +880,7 @@ @Test public void enablePriceTrackingItemRow_PriceTrackingEnabled_NoProductInfo() { - setShoppingListItemRowEnabled(true); + setShoppingListEligible(true); PowerBookmarkUtils.setPriceTrackingEligibleForTesting(false); doReturn(true).when(mBookmarkModel).isEditBookmarksEnabled();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java index 5635181..efb886a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinatorTest.java
@@ -28,7 +28,6 @@ import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.R; import org.chromium.chrome.browser.commerce.ShoppingServiceFactory; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; @@ -36,7 +35,6 @@ import org.chromium.chrome.browser.sync.SyncServiceFactory; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.commerce.core.ShoppingService; import org.chromium.components.favicon.LargeIconBridge; import org.chromium.components.favicon.LargeIconBridgeJni; @@ -54,7 +52,6 @@ ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ChromeSwitches.DISABLE_NATIVE_INITIALIZATION }) -@EnableFeatures({ChromeFeatureList.BOOKMARKS_REFRESH}) public class BookmarkManagerCoordinatorTest { @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @Rule public JniMocker mJniMocker = new JniMocker();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java index 0a5d5ac..ef215e16 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -140,7 +140,6 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(shadows = {ShadowPostTask.class}) @EnableFeatures({ - ChromeFeatureList.BOOKMARKS_REFRESH, ChromeFeatureList.SHOPPING_LIST, }) public class BookmarkManagerMediatorTest {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java index 77e5413..8977cbe 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefsTest.java
@@ -63,7 +63,6 @@ @Test @DisableFeatures({ChromeFeatureList.ANDROID_IMPROVED_BOOKMARKS}) - @EnableFeatures({ChromeFeatureList.BOOKMARKS_REFRESH}) public void legacyVisualFlags() { ShoppingFeatures.setShoppingListEligibleForTesting(true); @@ -75,7 +74,6 @@ @Test @DisableFeatures({ChromeFeatureList.ANDROID_IMPROVED_BOOKMARKS}) - @EnableFeatures({ChromeFeatureList.BOOKMARKS_REFRESH}) public void legacyVisualFlags_noShopping() { ShoppingFeatures.setShoppingListEligibleForTesting(false);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java new file mode 100644 index 0000000..e077e37 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/query_tiles/QueryTileUtilsTest.java
@@ -0,0 +1,34 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.query_tiles; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; + +/** Tests for the query tiles section on new tab page. */ +@RunWith(BaseRobolectricTestRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +public class QueryTileUtilsTest { + + @Rule public TestRule mProcessor = new Features.JUnitProcessor(); + + @Test + @EnableFeatures({ChromeFeatureList.QUERY_TILES, ChromeFeatureList.QUERY_TILES_IN_NTP}) + @DisableFeatures(ChromeFeatureList.QUERY_TILES_SEGMENTATION) + public void testIsQueryTilesEnabledOnNtpWithoutSegmentation() { + Assert.assertTrue(QueryTileUtils.isQueryTilesEnabledOnNtp()); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java index 4112ded..6e4edaec 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
@@ -96,7 +96,6 @@ @RunWith(BaseRobolectricTestRunner.class) @EnableFeatures({ ChromeFeatureList.WEB_FEED, - ChromeFeatureList.BOOKMARKS_REFRESH, UiAccessibilityFeatures.START_SURFACE_ACCESSIBILITY_CHECK }) @DisableFeatures({ChromeFeatureList.SHOPPING_LIST})
diff --git a/chrome/android/modules/chrome_bundle_tmpl.gni b/chrome/android/modules/chrome_bundle_tmpl.gni index 9bf03f9..57371525 100644 --- a/chrome/android/modules/chrome_bundle_tmpl.gni +++ b/chrome/android/modules/chrome_bundle_tmpl.gni
@@ -146,15 +146,22 @@ parent_module_target = ":${_bundle_target_name}__chrome_bundle_module" } + if (android_64bit_target_cpu) { + _version_code_offset = chrome_32_version_code + } else { + _version_code_offset = chrome_version_code + } + not_needed([ _version_code_offset ]) + if (defined(invoker.expected_android_manifest_template)) { - expected_android_manifest_version_code_offset = chrome_version_code + expected_android_manifest_version_code_offset = _version_code_offset expected_android_manifest = string_replace(invoker.expected_android_manifest_template, "SPLIT_NAME", _module_desc.name) } if (defined(invoker.expected_android_manifest_base_template)) { - expected_android_manifest_version_code_offset = chrome_version_code + expected_android_manifest_version_code_offset = _version_code_offset if (defined(_module_desc.ignore_base_manifest_expectations) && _module_desc.ignore_base_manifest_expectations) { # Remove ".diff" since it's not actually a diff.
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni index 9dd39ee..ce4e5858 100644 --- a/chrome/android/trichrome.gni +++ b/chrome/android/trichrome.gni
@@ -85,8 +85,13 @@ manifest_package = _manifest_package if (defined(invoker.expected_android_manifest)) { - expected_android_manifest_version_code_offset = chrome_version_code - expected_android_manifest_library_version_offset = chrome_version_code + if (android_64bit_target_cpu) { + _version_code_offset = chrome_32_version_code + } else { + _version_code_offset = chrome_version_code + } + expected_android_manifest_version_code_offset = _version_code_offset + expected_android_manifest_library_version_offset = _version_code_offset } omit_dex = true
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index a7907d8..e5d8c6d 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -168,6 +168,7 @@ #include "components/trusted_vault/features.h" #include "components/ui_devtools/switches.h" #include "components/variations/variations_switches.h" +#include "components/version_info/channel.h" #include "components/version_info/version_info.h" #include "components/viz/common/features.h" #include "components/viz/common/switches.h" @@ -3044,37 +3045,9 @@ "clipboard-history-url-titles"; constexpr char kBluetoothUseFlossInternalName[] = "bluetooth-use-floss"; constexpr char kEnableSuspendToDiskInternalName[] = "enable-suspend-to-disk"; +constexpr char kSeaPenInternalName[] = "sea-pen"; #endif // BUILDFLAG(IS_CHROMEOS_ASH) -#if BUILDFLAG(IS_ANDROID) -const FeatureEntry::FeatureParam kBookmarksRefreshVisuals[] = { - {"bookmark_visuals_enabled", "true"}}; -const FeatureEntry::FeatureParam kBookmarksRefreshCompactVisuals[] = { - {"bookmark_visuals_enabled", "true"}, - {"bookmark_compact_visuals_enabled", "true"}}; -const FeatureEntry::FeatureParam kBookmarksRefreshAppMenu[] = { - {"bookmark_in_app_menu", "true"}}; -const FeatureEntry::FeatureParam kBookmarksRefreshNormal[] = { - {"bookmark_visuals_enabled", "true"}, - {"bookmark_in_app_menu", "true"}}; -const FeatureEntry::FeatureParam kBookmarksRefreshCompact[] = { - {"bookmark_visuals_enabled", "true"}, - {"bookmark_compact_visuals_enabled", "true"}, - {"bookmark_in_app_menu", "true"}}; - -const FeatureEntry::FeatureVariation kBookmarksRefreshVariations[] = { - {"(enabled w/ visuals)", kBookmarksRefreshNormal, - std::size(kBookmarksRefreshNormal), nullptr}, - {"(enabled w/ compact visuals)", kBookmarksRefreshCompact, - std::size(kBookmarksRefreshCompact), nullptr}, - {"(visuals only)", kBookmarksRefreshVisuals, - std::size(kBookmarksRefreshVisuals), nullptr}, - {"(compact visuals only)", kBookmarksRefreshCompactVisuals, - std::size(kBookmarksRefreshCompactVisuals), nullptr}, - {"(app menu item only)", kBookmarksRefreshAppMenu, - std::size(kBookmarksRefreshAppMenu), nullptr}}; -#endif // BUILDFLAG(IS_ANDROID) - const FeatureEntry::FeatureParam kLargeFaviconFromGoogle96[] = { {"favicon_size_in_dip", "96"}}; const FeatureEntry::FeatureParam kLargeFaviconFromGoogle128[] = { @@ -6003,11 +5976,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_ANDROID) - {"omnibox-cache-suggestion-resources", - flag_descriptions::kOmniboxCacheSuggestionResourcesName, - flag_descriptions::kOmniboxCacheSuggestionResourcesDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kOmniboxCacheSuggestionResources)}, - {"omnibox-match-toolbar-and-status-bar-color", flag_descriptions::kOmniboxMatchToolbarAndStatusBarColorName, flag_descriptions::kOmniboxMatchToolbarAndStatusBarColorDescription, @@ -6035,11 +6003,6 @@ kOmniboxQueryTilesVariations, "OmniboxQueryTilesInZPSOnNTP")}, - {"omnibox-warm-recycled-view-pool", - flag_descriptions::kOmniboxWarmRecycledViewPoolName, - flag_descriptions::kOmniboxWarmRecycledViewPoolDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kOmniboxWarmRecycledViewPool)}, - {"android-app-integration", flag_descriptions::kAndroidAppIntegrationName, flag_descriptions::kAndroidAppIntegrationDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegration)}, @@ -8449,6 +8412,9 @@ {"scanning-app-jelly", flag_descriptions::kScanningAppJellyName, flag_descriptions::kScanningAppJellyDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kScanningAppJelly)}, + {kSeaPenInternalName, flag_descriptions::kSeaPenName, + flag_descriptions::kSeaPenDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSeaPen)}, {"shelf-auto-hide-separation", flag_descriptions::kShelfAutoHideSeparationName, flag_descriptions::kShelfAutoHideSeparationDescription, kOsCrOS, @@ -9427,12 +9393,6 @@ flag_descriptions::kBookmarksImprovedSaveFlowName, flag_descriptions::kBookmarksImprovedSaveFlowDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kBookmarksImprovedSaveFlow)}, - - {"bookmarks-refresh", flag_descriptions::kBookmarksRefreshName, - flag_descriptions::kBookmarksRefreshDescription, kOsAndroid, - FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kBookmarksRefresh, - kBookmarksRefreshVariations, - "Collections")}, #endif {"enable-tab-audio-muting", flag_descriptions::kTabAudioMutingName, @@ -11460,6 +11420,14 @@ channel != version_info::Channel::CANARY && channel != version_info::Channel::UNKNOWN; } + + // Only show sea-pen flag if channel is one of Beta/Dev/Canary/Unknown. + if (!strcmp(kSeaPenInternalName, entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } #endif // BUILDFLAG(IS_CHROMEOS_ASH) // enable-unsafe-webgpu is only available on Dev/Canary channels.
diff --git a/chrome/browser/apps/app_service/media_access_browsertest.cc b/chrome/browser/apps/app_service/media_access_browsertest.cc index 0224202..290861b8 100644 --- a/chrome/browser/apps/app_service/media_access_browsertest.cc +++ b/chrome/browser/apps/app_service/media_access_browsertest.cc
@@ -383,7 +383,7 @@ // Launch |app_id| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the camera for |app_id| in the new tab. content::WebContents* web_content1 = GetWebContents(); @@ -420,7 +420,7 @@ // Launch |app_id| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the microphone for |app_id| in the new tab. content::WebContents* web_content1 = GetWebContents(); @@ -457,7 +457,7 @@ // Launch |app_id| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the camera and the microphone for |app_id| in the new // tab. @@ -499,7 +499,7 @@ // Launch |app_id1| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id1); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the camera and the microphone for |app_id1| in the new // tab. @@ -575,7 +575,7 @@ // Launch |app_id| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request DEVICE_VIDEO_CAPTURE accessing the camera for |app_id| in the new // tab. @@ -608,7 +608,7 @@ // Launch |app_id| in a new tab. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request GUM_DESKTOP_VIDEO_CAPTURE accessing the camera for |app_id| in the // new tab. @@ -653,7 +653,7 @@ RequestAccessingCamera) { std::string shortcut_id = CreateShortcut(GetUrl1()); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the camera for |shortcut_id| in the new tab. content::WebContents* web_content = GetWebContents(); @@ -679,7 +679,7 @@ RequestAccessingMicrophone) { std::string shortcut_id = CreateShortcut(GetUrl1()); - web_app::NavigateToURLAndWait(browser(), GetUrl1()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetUrl1()); // Request accessing the microphone for |shortcut_id| in the new tab. content::WebContents* web_content = GetWebContents();
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index 6cf1a9b..27b3b1e 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -3064,6 +3064,8 @@ "remote_apps/remote_apps_model.cc", "remote_apps/remote_apps_model.h", "remote_apps/remote_apps_types.h", + "report_controller_initializer.cc", + "report_controller_initializer.h", "scalable_iph/scalable_iph_delegate_impl.cc", "scalable_iph/scalable_iph_delegate_impl.h", "scanning/chrome_scanning_app_delegate.cc", @@ -4117,6 +4119,7 @@ "//chromeos/ash/components/peripheral_notification", "//chromeos/ash/components/power", "//chromeos/ash/components/report", + "//chromeos/ash/components/report:fresnel_service_proto", "//chromeos/ash/components/scalable_iph:buildflags", "//chromeos/ash/components/scalable_iph:constants", "//chromeos/ash/components/scalable_iph:iph_session", @@ -5947,6 +5950,7 @@ "release_notes/release_notes_notification_unittest.cc", "release_notes/release_notes_storage_unittest.cc", "remote_apps/remote_apps_model_unittest.cc", + "report_controller_initializer_unittest.cc", "scanning/chrome_scanning_app_delegate_unittest.cc", "scanning/lorgnette_scanner_manager_unittest.cc", "scanning/lorgnette_scanner_manager_util_unittest.cc", @@ -6257,6 +6261,7 @@ "//chromeos/ash/components/policy", "//chromeos/ash/components/proximity_auth", "//chromeos/ash/components/proximity_auth:test_support", + "//chromeos/ash/components/report:fresnel_service_proto", "//chromeos/ash/components/scanning", "//chromeos/ash/components/settings", "//chromeos/ash/components/smbfs",
diff --git a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc index 8a33a5f..bffbb13 100644 --- a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc +++ b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc
@@ -135,8 +135,7 @@ command_proto.set_command_id(next_id_); command_proto.set_age_of_command(0); - std::string der_cert64; - base::Base64Encode(der_cert, &der_cert64); + std::string der_cert64 = base::Base64Encode(der_cert); crypto::RSAPrivateKey* rsa = certificate.placeholder_key.get(); std::string pkcs12 = CreatePkcs12ForKey(name, rsa->key());
diff --git a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer_utils.cc b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer_utils.cc index 11242dc..4e6deef 100644 --- a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer_utils.cc +++ b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer_utils.cc
@@ -40,10 +40,8 @@ } bssl::UniquePtr<uint8_t> free_pkcs12_key(pkcs12_key); - std::string encoded_pkcs12_key; - base::Base64Encode(base::StringPiece((char*)pkcs12_key, pkcs12_key_len), - &encoded_pkcs12_key); - return encoded_pkcs12_key; + return base::Base64Encode( + base::StringPiece((char*)pkcs12_key, pkcs12_key_len)); } std::string ExportSpki(crypto::RSAPrivateKey* rsa) { @@ -53,9 +51,7 @@ LOG(ERROR) << "Key export has failed."; return ""; } - std::string encoded_spki; - base::Base64Encode(std::string(spki.begin(), spki.end()), &encoded_spki); - return encoded_spki; + return base::Base64Encode(std::string(spki.begin(), spki.end())); } } // namespace arc
diff --git a/chrome/browser/ash/arc/enterprise/cert_store/cert_store_service_browsertest.cc b/chrome/browser/ash/arc/enterprise/cert_store/cert_store_service_browsertest.cc index 0b650541..98e1e78 100644 --- a/chrome/browser/ash/arc/enterprise/cert_store/cert_store_service_browsertest.cc +++ b/chrome/browser/ash/arc/enterprise/cert_store/cert_store_service_browsertest.cc
@@ -110,9 +110,7 @@ std::string GetDerCert64(CERTCertificate* cert) { std::string der_cert; EXPECT_TRUE(net::x509_util::GetDEREncoded(cert, &der_cert)); - std::string der_cert64; - base::Base64Encode(der_cert, &der_cert64); - return der_cert64; + return base::Base64Encode(der_cert); } class FakeArcCertInstaller : public ArcCertInstaller {
diff --git a/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc b/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc index c2d1825..a0bf635 100644 --- a/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc +++ b/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc
@@ -590,9 +590,7 @@ if (!app_icon_png_.empty()) { const std::string png_data_as_string( reinterpret_cast<const char*>(&app_icon_png_[0]), app_icon_png_.size()); - std::string icon_content; - base::Base64Encode(png_data_as_string, &icon_content); - information.Set(kKeyIcon, icon_content); + information.Set(kKeyIcon, base::Base64Encode(png_data_as_string)); } root.Set(kKeyInformation, std::move(information));
diff --git a/chrome/browser/ash/attestation/tpm_challenge_key_result.cc b/chrome/browser/ash/attestation/tpm_challenge_key_result.cc index ca04be0..7f80575b 100644 --- a/chrome/browser/ash/attestation/tpm_challenge_key_result.cc +++ b/chrome/browser/ash/attestation/tpm_challenge_key_result.cc
@@ -15,9 +15,7 @@ namespace attestation { namespace { std::string Base64EncodeStr(const std::string& str) { - std::string result; - base::Base64Encode(str, &result); - return result; + return base::Base64Encode(str); } } // namespace
diff --git a/chrome/browser/ash/borealis/borealis_features_util.cc b/chrome/browser/ash/borealis/borealis_features_util.cc index 0b0c81d..a412cbfa 100644 --- a/chrome/browser/ash/borealis/borealis_features_util.cc +++ b/chrome/browser/ash/borealis/borealis_features_util.cc
@@ -135,7 +135,7 @@ std::string ret = std::move(input); for (unsigned i = 0; i < kHashIterations; ++i) { std::string raw_sha = crypto::SHA256HashString(ret + salt); - base::Base64Encode(raw_sha, &ret); + ret = base::Base64Encode(raw_sha); } return ret; }
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index a76f1b93..fa8c728 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -152,6 +152,7 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/profiles/signin_profile_handler.h" #include "chrome/browser/ash/quick_pair/quick_pair_browser_delegate_impl.h" +#include "chrome/browser/ash/report_controller_initializer.h" #include "chrome/browser/ash/scheduler_configuration_manager.h" #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/ash/settings/shutdown_policy_forwarder.h" @@ -231,7 +232,6 @@ #include "chromeos/ash/components/power/dark_resume_controller.h" #include "chromeos/ash/components/report/device_metrics/use_case/real_psm_client_manager.h" #include "chromeos/ash/components/report/device_metrics/use_case/use_case.h" -#include "chromeos/ash/components/report/report_controller.h" #include "chromeos/ash/components/settings/cros_settings_names.h" #include "chromeos/ash/components/system/statistics_provider.h" #include "chromeos/ash/components/tpm/tpm_token_loader.h" @@ -304,29 +304,6 @@ base::SetLinuxDistro("CrOS " + version.value_or("0.0.0.0")); } -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - -// Returns the device mode. For Chrome OS this function will return the mode -// stored in the lockbox, or DEVICE_MODE_CONSUMER if the lockbox has been -// locked empty, or DEVICE_MODE_UNKNOWN if the device has not been owned yet. -// For other OSes the function will always return DEVICE_MODE_CONSUMER. -policy::DeviceMode GetDeviceMode() { - return g_browser_process->platform_part() - ->browser_policy_connector_ash() - ->GetDeviceMode(); -} - -// Returns device's market segment if enterprise enrolled, as delivered by the -// device management server. If the device is not enterprise-enrolled, -// it will return UNKNOWN. -policy::MarketSegment GetEnterpriseMarketSegment() { - return g_browser_process->platform_part() - ->browser_policy_connector_ash() - ->GetEnterpriseMarketSegment(); -} - -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Creates an instance of the NetworkPortalDetector implementation or a stub. void InitializeNetworkPortalDetector() { if (network_portal_detector::SetForTesting()) { @@ -1362,7 +1339,13 @@ } void ChromeBrowserMainPartsAsh::PostBrowserStart() { - StartReportController(); +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + // Instantiate report controller if the feature is enabled. + if (base::FeatureList::IsEnabled(features::kDeviceActiveClient)) { + report_controller_initializer_ = + std::make_unique<ReportControllerInitializer>(); + } +#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) // Construct a delegate to connect the accessibility component extensions and // AccessibilityEventRewriter. @@ -1514,7 +1497,7 @@ apn_migrator_.reset(); SystemProxyManager::Shutdown(); - report_controller_.reset(); + report_controller_initializer_.reset(); crostini_unsupported_action_notifier_.reset(); carrier_lock_manager_.reset(); @@ -1798,60 +1781,4 @@ attestation::AttestationFeatures::Shutdown(); } -void ChromeBrowserMainPartsAsh::StartReportController() { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Terminate immediately if feature is turned off. - if (!base::FeatureList::IsEnabled(features::kDeviceActiveClient)) { - return; - } - - CrosSettingsProvider::TrustedStatus status = - CrosSettings::Get()->PrepareTrustedValues( - base::BindOnce(&ChromeBrowserMainPartsAsh::StartReportController, - weak_ptr_factory_.GetWeakPtr())); - - if (status == CrosSettingsProvider::TEMPORARILY_UNTRUSTED || - status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) { - // When status is TEMPORARILY_UNTRUSTED, PrepareTrustedValues method takes - // ownership of the start report controller callback. - // It will retry later when the TRUSTED status becomes available. - // - // When status is PERMANENTLY_UNTRUSTED, client assumes this status is final - // until browser restarts. Client does not proceed without signature - // verification, so retry is not attempted. This status may be caused - // if the policy proto blob fails the signature check. - return; - } - - // Create a repeating callback to check the time delta that elapsed since the - // oobe completed file was written. - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback = - base::BindRepeating(&StartupUtils::GetTimeSinceOobeFlagFileCreation); - - // Create callbacks to retrieve the policy device mode and market segment. - // These callbacks are executed after oobe is completed to get correct values. - base::RepeatingCallback<policy::DeviceMode()> check_device_mode_callback = - base::BindRepeating(&GetDeviceMode); - base::RepeatingCallback<policy::MarketSegment()> - check_market_segment_callback = - base::BindRepeating(&GetEnterpriseMarketSegment); - - // CrosSettingsProvider::TRUSTED: device policies are loaded and trusted. - report_controller_ = std::make_unique<report::ReportController>( - ash::report::device_metrics::ChromeDeviceMetadataParameters{ - chrome::GetChannel() /* chromeos_channel */}, - g_browser_process->local_state(), - g_browser_process->system_network_context_manager() - ->GetSharedURLLoaderFactory(), - first_run::GetFirstRunSentinelCreationTime(), - std::move(check_oobe_completed_callback), - std::move(check_device_mode_callback), - std::move(check_market_segment_callback), - std::make_unique<ash::report::device_metrics::PsmClientManager>( - std::make_unique< - report::device_metrics::RealPsmClientManagerDelegate>())); - -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) -} - } // namespace ash
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.h b/chrome/browser/ash/chrome_browser_main_parts_ash.h index 6c13541..4ea5ea69 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.h +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.h
@@ -86,6 +86,7 @@ class MisconfiguredUserCleaner; class PowerMetricsReporter; class RendererFreezer; +class ReportControllerInitializer; class SessionTerminationManager; class ShortcutMappingPrefService; class ShutdownPolicyForwarder; @@ -104,10 +105,6 @@ class DataCollector; } -namespace report { -class ReportController; -} - namespace internal { class DBusServices; } @@ -174,9 +171,6 @@ void PostDestroyThreads() override; private: - // Load device policies before initializing the |report_controller_|. - void StartReportController(); - std::unique_ptr<chromeos::default_app_order::ExternalLoader> app_order_loader_; std::unique_ptr<NetworkPrefStateObserver> network_pref_state_observer_; @@ -256,7 +250,7 @@ std::unique_ptr<AshUsbDetector> ash_usb_detector_; std::unique_ptr<CrosUsbDetector> cros_usb_detector_; - std::unique_ptr<report::ReportController> report_controller_; + std::unique_ptr<ReportControllerInitializer> report_controller_initializer_; std::unique_ptr<crostini::CrostiniUnsupportedActionNotifier> crostini_unsupported_action_notifier_;
diff --git a/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc b/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc index 087964c..c61f8361 100644 --- a/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc +++ b/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc
@@ -82,10 +82,8 @@ DiskMountManager::InitializeForTesting(disk_manager_); - std::string known_hosts; - base::Base64Encode("[hostname]:2222 pubkey", &known_hosts); - std::string identity; - base::Base64Encode("privkey", &identity); + std::string known_hosts = base::Base64Encode("[hostname]:2222 pubkey"); + std::string identity = base::Base64Encode("privkey"); } CrostiniSshfsHelperTest(const CrostiniSshfsHelperTest&) = delete;
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc index bfa5454..731b1c9 100644 --- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc +++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_test_utils.cc
@@ -39,7 +39,7 @@ std::string CreateServerResponse(const std::vector<uint8_t>& expected_output) { std::string encoded_output(expected_output.begin(), expected_output.end()); - base::Base64Encode(encoded_output, &encoded_output); + encoded_output = base::Base64Encode(encoded_output); return base::StringPrintf(kTemplateResponse, encoded_output.c_str()); }
diff --git a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc index 5d9a7417..8381ffe 100644 --- a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
@@ -729,10 +729,9 @@ std::string GetPngDataAsString(scoped_refptr<base::RefCountedMemory> png_data) { // Base64 encode the result so we can return it as a string. - std::string base64Png(png_data->front(), + std::string base64_png(png_data->front(), png_data->front() + png_data->size()); - base::Base64Encode(base64Png, &base64Png); - return base64Png; + return base::Base64Encode(base64_png); } display::Display::Rotation ToRotation(
diff --git a/chrome/browser/ash/extensions/file_manager/private_api_media_parser.cc b/chrome/browser/ash/extensions/file_manager/private_api_media_parser.cc index 38dc6405..73bfabcf 100644 --- a/chrome/browser/ash/extensions/file_manager/private_api_media_parser.cc +++ b/chrome/browser/ash/extensions/file_manager/private_api_media_parser.cc
@@ -184,8 +184,8 @@ } if (image && size && !image->type.empty()) { // Attach thumbnail image. - std::string url; - base::Base64Encode(base::StringPiece(image->data.data(), size), &url); + std::string url = + base::Base64Encode(base::StringPiece(image->data.data(), size)); url.insert(0, base::StrCat({"data:", image->type, ";base64,"})); base::Value::Dict media_thumbnail_image;
diff --git a/chrome/browser/ash/file_manager/documents_provider_root_manager.cc b/chrome/browser/ash/file_manager/documents_provider_root_manager.cc index 08ec96d..686bbeea 100644 --- a/chrome/browser/ash/file_manager/documents_provider_root_manager.cc +++ b/chrome/browser/ash/file_manager/documents_provider_root_manager.cc
@@ -55,11 +55,8 @@ // bitmaps without resizing in Chrome side. std::vector<unsigned char> output; gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &output); - std::string encoded; - base::Base64Encode( - base::StringPiece(reinterpret_cast<const char*>(output.data()), - output.size()), - &encoded); + std::string encoded = base::Base64Encode(base::StringPiece( + reinterpret_cast<const char*>(output.data()), output.size())); return GURL("data:image/png;base64," + encoded); }
diff --git a/chrome/browser/ash/lock_screen_apps/state_controller.cc b/chrome/browser/ash/lock_screen_apps/state_controller.cc index df9d1e4d..a4b43515 100644 --- a/chrome/browser/ash/lock_screen_apps/state_controller.cc +++ b/chrome/browser/ash/lock_screen_apps/state_controller.cc
@@ -202,10 +202,7 @@ if (key->empty()) return false; - std::string base64_encoded_key; - base::Base64Encode(*key, &base64_encoded_key); - - profile->GetPrefs()->SetString(kDataCryptoKeyPref, base64_encoded_key); + profile->GetPrefs()->SetString(kDataCryptoKeyPref, base::Base64Encode(*key)); return true; }
diff --git a/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc index d59c8e8..7bbdeee 100644 --- a/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc +++ b/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc
@@ -897,11 +897,8 @@ TEST_F(LockScreenAppStateTest, InitLockScreenDataLockScreenItemStorage_CryptoKeyExists) { std::string crypto_key_in_prefs = "0123456789ABCDEF0123456789ABCDEF"; - std::string crypto_key_in_prefs_encoded; - base::Base64Encode(crypto_key_in_prefs, &crypto_key_in_prefs_encoded); - profile()->GetPrefs()->SetString(kDataCryptoKeyPref, - crypto_key_in_prefs_encoded); + base::Base64Encode(crypto_key_in_prefs)); SetPrimaryProfileAndWaitUntilReady(); CreateLockScreenProfile();
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc index 6eb04d8..0327604 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc
@@ -393,10 +393,8 @@ std::string shared_secret_str(kSecondarySharedSecret.begin(), kSecondarySharedSecret.end()); - std::string shared_secret_base64; - base::Base64Encode(shared_secret_str, &shared_secret_base64); EXPECT_EQ(*wifi_request_payload.FindString("shared_secret"), - shared_secret_base64); + base::Base64Encode(shared_secret_str)); const std::optional<mojom::WifiCredentials>& credentials = future.Get(); ASSERT_TRUE(credentials.has_value()); @@ -618,9 +616,8 @@ std::string shared_secret_str(kSecondarySharedSecret.begin(), kSecondarySharedSecret.end()); - std::string shared_secret_base64; - base::Base64Encode(shared_secret_str, &shared_secret_base64); - EXPECT_EQ(*parsed_payload.FindString("shared_secret"), shared_secret_base64); + EXPECT_EQ(*parsed_payload.FindString("shared_secret"), + base::Base64Encode(shared_secret_str)); EXPECT_TRUE(future.Get()); TestMessageMetrics(
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/session_context.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/session_context.cc index 12cb7bf..f92fd00 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/session_context.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/session_context.cc
@@ -75,14 +75,12 @@ advertising_id_.ToString()); std::string secondary_shared_secret_bytes(secondary_shared_secret_.begin(), secondary_shared_secret_.end()); - std::string secondary_shared_secret_base64; // The secondary_shared_secret_bytes string likely contains non-UTF-8 // characters, which are disallowed in pref values. Base64Encode the string // for compatibility with prefs. - base::Base64Encode(secondary_shared_secret_bytes, - &secondary_shared_secret_base64); - prepare_for_update_info.Set(kPrepareForUpdateSecondarySharedSecretKey, - secondary_shared_secret_base64); + prepare_for_update_info.Set( + kPrepareForUpdateSecondarySharedSecretKey, + base::Base64Encode(secondary_shared_secret_bytes)); return prepare_for_update_info; }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc index 2edccfe..ef8b17f 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl.cc
@@ -91,8 +91,7 @@ std::vector<uint8_t> Base64EncodeOmitPadding( const std::vector<uint8_t>& bytes) { std::string input(bytes.begin(), bytes.end()); - std::string output; - base::Base64Encode(input, &output); + std::string output = base::Base64Encode(input); // Strip padding characters from end. const size_t last_non_padding_pos =
diff --git a/chrome/browser/ash/login/quick_unlock/pin_backend.cc b/chrome/browser/ash/login/quick_unlock/pin_backend.cc index 97eb2ef..db0b808 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_backend.cc +++ b/chrome/browser/ash/login/quick_unlock/pin_backend.cc
@@ -85,7 +85,7 @@ // UTF8 string. std::string salt; crypto::RandBytes(base::WriteInto(&salt, kSaltByteSize + 1), kSaltByteSize); - base::Base64Encode(salt, &salt); + salt = base::Base64Encode(salt); DCHECK(!salt.empty()); return salt; }
diff --git a/chrome/browser/ash/login/saml/fake_saml_idp_mixin.cc b/chrome/browser/ash/login/saml/fake_saml_idp_mixin.cc index 77153ff..d25633b 100644 --- a/chrome/browser/ash/login/saml/fake_saml_idp_mixin.cc +++ b/chrome/browser/ash/login/saml/fake_saml_idp_mixin.cc
@@ -173,7 +173,7 @@ base::ScopedAllowBlockingForTesting allow_io; EXPECT_TRUE(base::ReadFileToString(saml_response_dir_.Append(xml_file), &saml_response_)); - base::Base64Encode(saml_response_, &saml_response_); + saml_response_ = base::Base64Encode(saml_response_); } bool FakeSamlIdpMixin::DeviceTrustHeaderRecieved() const {
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc index cef6bc4b..1e4b7ba 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -820,19 +820,6 @@ base::Value(hostname), nullptr); } - if (policy.has_device_kerberos_encryption_types()) { - const em::DeviceKerberosEncryptionTypesProto& container( - policy.device_kerberos_encryption_types()); - if (container.has_types()) { - std::unique_ptr<base::Value> value(DecodeIntegerValue(container.types())); - if (value) { - policies->Set(key::kDeviceKerberosEncryptionTypes, - POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, - POLICY_SOURCE_CLOUD, std::move(*value), nullptr); - } - } - } - if (policy.has_system_proxy_settings()) { const em::SystemProxySettingsProto& settings_proto( policy.system_proxy_settings()); @@ -1890,19 +1877,6 @@ } } - if (policy.has_device_user_policy_loopback_processing_mode()) { - const em::DeviceUserPolicyLoopbackProcessingModeProto& container( - policy.device_user_policy_loopback_processing_mode()); - if (container.has_mode()) { - std::unique_ptr<base::Value> value(DecodeIntegerValue(container.mode())); - if (value) { - policies->Set(key::kDeviceUserPolicyLoopbackProcessingMode, - POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, - POLICY_SOURCE_CLOUD, std::move(*value), nullptr); - } - } - } - if (policy.has_virtual_machines_allowed()) { const em::VirtualMachinesAllowedProto& container( policy.virtual_machines_allowed()); @@ -1913,59 +1887,6 @@ } } - if (policy.has_device_machine_password_change_rate()) { - const em::DeviceMachinePasswordChangeRateProto& container( - policy.device_machine_password_change_rate()); - if (container.has_rate_days()) { - std::unique_ptr<base::Value> value( - DecodeIntegerValue(container.rate_days())); - if (value) { - policies->Set(key::kDeviceMachinePasswordChangeRate, - POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, - POLICY_SOURCE_CLOUD, std::move(*value), nullptr); - } - } - } - - if (policy.has_device_gpo_cache_lifetime()) { - const em::DeviceGpoCacheLifetimeProto& container( - policy.device_gpo_cache_lifetime()); - if (container.has_lifetime_hours()) { - std::unique_ptr<base::Value> value( - DecodeIntegerValue(container.lifetime_hours())); - if (value) { - policies->Set(key::kDeviceGpoCacheLifetime, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - std::move(*value), nullptr); - } - } - } - - if (policy.has_device_auth_data_cache_lifetime()) { - const em::DeviceAuthDataCacheLifetimeProto& container( - policy.device_auth_data_cache_lifetime()); - if (container.has_lifetime_hours()) { - std::unique_ptr<base::Value> value( - DecodeIntegerValue(container.lifetime_hours())); - if (value) { - policies->Set(key::kDeviceAuthDataCacheLifetime, POLICY_LEVEL_MANDATORY, - POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, - std::move(*value), nullptr); - } - } - } - - if (policy.has_chromad_to_cloud_migration_enabled()) { - const em::BooleanPolicyProto& container( - policy.chromad_to_cloud_migration_enabled()); - if (container.has_value()) { - policies->Set(key::kChromadToCloudMigrationEnabled, - POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, - POLICY_SOURCE_CLOUD, base::Value(container.value()), - nullptr); - } - } - if (policy.has_device_unaffiliated_crostini_allowed()) { const em::DeviceUnaffiliatedCrostiniAllowedProto& container( policy.device_unaffiliated_crostini_allowed());
diff --git a/chrome/browser/ash/policy/rsu/lookup_key_uploader.cc b/chrome/browser/ash/policy/rsu/lookup_key_uploader.cc index 3168733a..d67f5e2 100644 --- a/chrome/browser/ash/policy/rsu/lookup_key_uploader.cc +++ b/chrome/browser/ash/policy/rsu/lookup_key_uploader.cc
@@ -87,8 +87,7 @@ const std::string rsu_device_id = result->rsu_device_id(); // Making it printable so we can store it in prefs. - std::string encoded_rsu_device_id; - base::Base64Encode(rsu_device_id, &encoded_rsu_device_id); + std::string encoded_rsu_device_id = base::Base64Encode(rsu_device_id); // If this ID was uploaded previously -- we are not uploading it. if (rsu_device_id == prefs_->GetString(prefs::kLastRsuDeviceIdUploaded))
diff --git a/chrome/browser/ash/policy/status_collector/activity_storage.cc b/chrome/browser/ash/policy/status_collector/activity_storage.cc index 701dd38..4742f24 100644 --- a/chrome/browser/ash/policy/status_collector/activity_storage.cc +++ b/chrome/browser/ash/policy/status_collector/activity_storage.cc
@@ -232,9 +232,7 @@ if (activity_id.empty()) return day_key; - std::string encoded_activity_id; - base::Base64Encode(activity_id, &encoded_activity_id); - return day_key + kActivityKeySeparator + encoded_activity_id; + return day_key + kActivityKeySeparator + base::Base64Encode(activity_id); } // static
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc index e40bfb43..cbe42c6d 100644 --- a/chrome/browser/ash/preferences.cc +++ b/chrome/browser/ash/preferences.cc
@@ -165,7 +165,6 @@ registry->RegisterBooleanPref( prefs::kLocalStateDevicePeripheralDataAccessEnabled, false); registry->RegisterBooleanPref(prefs::kDeviceI18nShortcutsEnabled, true); - registry->RegisterBooleanPref(prefs::kChromadToCloudMigrationEnabled, false); registry->RegisterBooleanPref(prefs::kLoginScreenWebUILazyLoading, false); registry->RegisterBooleanPref(::prefs::kConsumerAutoUpdateToggle, true); registry->RegisterBooleanPref(prefs::kDeviceEphemeralNetworkPoliciesEnabled,
diff --git a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc index d4d520e8..4abc97f 100644 --- a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc +++ b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc
@@ -59,9 +59,7 @@ std::string CodeChallengeS256(const std::string& code_verifier) { DCHECK_GE(code_verifier.size(), 43u); DCHECK_LE(code_verifier.size(), 128u); - std::string output; - base::Base64Encode(crypto::SHA256HashString(code_verifier), &output); - return output; + return base::Base64Encode(crypto::SHA256HashString(code_verifier)); } // Builds and returns URL for Authorization Request (see RFC6749-4.1) with
diff --git a/chrome/browser/ash/report_controller_initializer.cc b/chrome/browser/ash/report_controller_initializer.cc new file mode 100644 index 0000000..7ccc34e --- /dev/null +++ b/chrome/browser/ash/report_controller_initializer.cc
@@ -0,0 +1,287 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/report_controller_initializer.h" + +#include <memory> +#include <string> +#include <unordered_set> +#include <utility> + +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/location.h" +#include "base/logging.h" +#include "base/task/single_thread_task_runner.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "base/time/time.h" +#include "chrome/browser/ash/login/startup_utils.h" +#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" +#include "chrome/browser/ash/settings/cros_settings.h" +#include "chrome/browser/ash/settings/device_settings_service.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_platform_part_ash.h" +#include "chrome/browser/first_run/first_run.h" +#include "chrome/browser/net/system_network_context_manager.h" +#include "chrome/common/channel_info.h" +#include "chromeos/ash/components/report/device_metrics/use_case/real_psm_client_manager.h" +#include "chromeos/ash/components/report/proto/fresnel_service.pb.h" +#include "chromeos/ash/components/settings/cros_settings_provider.h" +#include "components/policy/core/common/cloud/cloud_policy_constants.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace ash { + +namespace { + +// Number of minutes to wait before retrying +// reading the .oobe_completed file again. +constexpr base::TimeDelta kOobeReadFailedRetryDelay = base::Minutes(60); + +// Number of times to retry before failing to report any device actives. +constexpr int kNumberOfRetriesBeforeFail = 120; + +// Determine market segment from the loaded ChromeOS device policies. +report::MarketSegment GetMarketSegment( + policy::DeviceMode device_mode, + policy::MarketSegment device_market_segment) { + // Policy device modes that should be classified as not being set. + const std::unordered_set<policy::DeviceMode> kDeviceModeNotSet{ + policy::DeviceMode::DEVICE_MODE_PENDING, + policy::DeviceMode::DEVICE_MODE_NOT_SET}; + + // Policy device modes that should be classified as consumer devices. + const std::unordered_set<policy::DeviceMode> kDeviceModeConsumer{ + policy::DeviceMode::DEVICE_MODE_CONSUMER, + policy::DeviceMode::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH}; + + // Policy device modes that should be classified as enterprise devices. + const std::unordered_set<policy::DeviceMode> kDeviceModeEnterprise{ + policy::DeviceMode::DEVICE_MODE_ENTERPRISE}; + + // Policy device modes that should be classified as demo devices. + const std::unordered_set<policy::DeviceMode> kDeviceModeDemoEnterprise{ + policy::DeviceMode::DEVICE_MODE_DEMO}; + + // Determine Fresnel market segment using the retrieved device policy + // |device_mode| and |device_market_segment|. + if (kDeviceModeNotSet.count(device_mode)) { + return report::MARKET_SEGMENT_UNKNOWN; + } + + if (kDeviceModeConsumer.count(device_mode)) { + return report::MARKET_SEGMENT_CONSUMER; + } + + if (kDeviceModeDemoEnterprise.count(device_mode)) { + return report::MARKET_SEGMENT_ENTERPRISE_DEMO; + } + + if (kDeviceModeEnterprise.count(device_mode)) { + if (device_market_segment == policy::MarketSegment::ENTERPRISE) { + return report::MARKET_SEGMENT_ENTERPRISE; + } + + if (device_market_segment == policy::MarketSegment::EDUCATION) { + return report::MARKET_SEGMENT_EDUCATION; + } + + return report::MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN; + } + + return report::MARKET_SEGMENT_UNKNOWN; +} + +} // namespace + +ReportControllerInitializer::ReportControllerInitializer() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + state_ = State::kWaitingForOwnership; + + // Adds observer for device ownership status changes in this class. + device_settings_observation_.Observe(DeviceSettingsService::Get()); + + OwnershipStatusChanged(); +} + +ReportControllerInitializer::~ReportControllerInitializer() = default; + +report::MarketSegment ReportControllerInitializer::GetMarketSegmentForTesting( + const policy::DeviceMode& device_mode, + const policy::MarketSegment& device_market_segment) { + return GetMarketSegment(device_mode, device_market_segment); +} + +void ReportControllerInitializer::OwnershipStatusChanged() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Device should only get ownership taken at most once on a browser start up. + if (state_ != State::kWaitingForOwnership) { + return; + } + + if (ash::DeviceSettingsService::Get()->GetOwnershipStatus() != + ash::DeviceSettingsService::OwnershipStatus::kOwnershipTaken) { + return; + } + + state_ = State::kWaitingForStartupDelay; + + // Retrieve chrome first run sentinel time. + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&first_run::GetFirstRunSentinelCreationTime), + base::BindOnce( + &ReportControllerInitializer::OnFirstRunSentinelCreationTimeRead, + weak_factory_.GetWeakPtr())); +} + +void ReportControllerInitializer::OnFirstRunSentinelCreationTimeRead( + base::Time first_chrome_run_time) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(state_, State::kWaitingForStartupDelay); + + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce( + &ReportControllerInitializer::CheckOobeCompleted, + weak_factory_.GetWeakPtr(), + base::BindRepeating(&StartupUtils::GetTimeSinceOobeFlagFileCreation)), + DetermineStartUpDelay(first_chrome_run_time)); +} + +base::TimeDelta ReportControllerInitializer::DetermineStartUpDelay( + base::Time chrome_first_run_ts) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(state_, State::kWaitingForStartupDelay); + + // Wait at least 1 hour from the first chrome run sentinel file creation + // time. This creation time is used as an indicator of when the device last + // reset (powerwash/recovery/RMA). PSM servers can take 1 hour after CheckIn + // to return the correct response for CheckMembership requests, since the PSM + // servers need to update their cache. + // + // This delay avoids the scenario where a device checks in, powerwashes, and + // on device start up, gets the wrong check membership response. + base::TimeDelta delay_on_first_chrome_run; + base::Time current_ts = base::Time::Now(); + if (current_ts < (chrome_first_run_ts + base::Hours(1))) { + delay_on_first_chrome_run = + chrome_first_run_ts + base::Hours(1) - current_ts; + } + + return delay_on_first_chrome_run; +} + +void ReportControllerInitializer::CheckOobeCompleted( + base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) { + state_ = State::kWaitingForOobeCompleted; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // We block if the oobe completed file is not written. + // ChromeOS devices should go through oobe to be considered a real device. + // The ActivateDate is also only set after oobe is written. + if (retry_oobe_completed_count_ >= kNumberOfRetriesBeforeFail) { + LOG(ERROR) << "Retry failed - .oobe_completed file was not written for " + << "1 minute after retrying 120 times. " + << "There was a 60 minute wait between each retry and spanned " + << "5 days."; + return; + } + + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(check_oobe_completed_callback), + base::BindOnce(&ReportControllerInitializer::OnOobeFileWritten, + weak_factory_.GetWeakPtr(), + check_oobe_completed_callback)); +} + +void ReportControllerInitializer::OnOobeFileWritten( + base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, + base::TimeDelta time_since_oobe_file_written) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(state_, State::kWaitingForOobeCompleted); + + // If the OOBE completed file isn't created yet, + // time_since_oobe_file_written returns base::TimeDelta(). + if (time_since_oobe_file_written == base::TimeDelta() || + time_since_oobe_file_written < base::Minutes(1)) { + ++retry_oobe_completed_count_; + + LOG(ERROR) << "Time since oobe file created was less than 1 minute. " + << "Wait and retry again after 1 minute to ensure that " + << "the ActivateDate VPD field is set. " + << "TimeDelta since oobe flag file was created = " + << time_since_oobe_file_written + << ". Retry count = " << retry_oobe_completed_count_; + + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&ReportControllerInitializer::CheckOobeCompleted, + weak_factory_.GetWeakPtr(), + std::move(check_oobe_completed_callback)), + kOobeReadFailedRetryDelay); + + return; + } + + state_ = State::kWaitingForDeviceSettingsTrusted; + CheckTrustedStatus(); +} + +void ReportControllerInitializer::CheckTrustedStatus() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK_EQ(state_, State::kWaitingForDeviceSettingsTrusted); + + // Device is owned, confirm the settings can be trusted. + CrosSettingsProvider::TrustedStatus status = + CrosSettings::Get()->PrepareTrustedValues( + base::BindOnce(&ReportControllerInitializer::CheckTrustedStatus, + weak_factory_.GetWeakPtr())); + + if (status == CrosSettingsProvider::TEMPORARILY_UNTRUSTED || + status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) { + // When status is TEMPORARILY_UNTRUSTED, PrepareTrustedValues method takes + // ownership of the start report controller callback. + // It will retry later when the TRUSTED status becomes available. + // + // When status is PERMANENTLY_UNTRUSTED, client assumes this status is final + // until browser restarts. Client does not proceed without signature + // verification, so retry is not attempted. This status may be caused + // if the policy proto blob fails the signature check. + return; + } + + // OOBE is completed, so we can safely calculate the device market segment. + report::MarketSegment device_market_segment = + GetMarketSegment(g_browser_process->platform_part() + ->browser_policy_connector_ash() + ->GetDeviceMode(), + g_browser_process->platform_part() + ->browser_policy_connector_ash() + ->GetEnterpriseMarketSegment()); + + state_ = State::kReportControllerInitialized; + + // At this step we have checked for 3 conditions. + // 1. The device is owned. + // 2. OOBE is completed and .oobe_completed file is written > 1 minute ago. + // 3. CrosSettingsProvider::TRUSTED: device policies are loaded and trusted. + report_controller_ = std::make_unique<report::ReportController>( + ash::report::device_metrics::ChromeDeviceMetadataParameters{ + chrome::GetChannel() /* chromeos_channel */, device_market_segment}, + g_browser_process->local_state(), + g_browser_process->system_network_context_manager() + ->GetSharedURLLoaderFactory(), + std::make_unique<ash::report::device_metrics::PsmClientManager>( + std::make_unique< + report::device_metrics::RealPsmClientManagerDelegate>())); +} + +} // namespace ash
diff --git a/chrome/browser/ash/report_controller_initializer.h b/chrome/browser/ash/report_controller_initializer.h new file mode 100644 index 0000000..0caa6c59 --- /dev/null +++ b/chrome/browser/ash/report_controller_initializer.h
@@ -0,0 +1,99 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_REPORT_CONTROLLER_INITIALIZER_H_ +#define CHROME_BROWSER_ASH_REPORT_CONTROLLER_INITIALIZER_H_ + +#include <memory> + +#include "base/functional/callback_forward.h" +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "chrome/browser/ash/settings/device_settings_service.h" +#include "chromeos/ash/components/report/report_controller.h" + +namespace ash { + +// Checks that preconditions are met, including device ownership and device +// settings trusted status. +// Then initializes |ReportController|. +class ReportControllerInitializer : public DeviceSettingsService::Observer { + public: + // State machine for preconditions this class will be in. + enum class State { + kWaitingForOwnership = 0, // Wait for ownership to be taken. + kWaitingForStartupDelay = 1, // Wait to read first chrome run time & + // startup delay to be completed. + kWaitingForOobeCompleted = 2, // Wait for oobe completed conditions. + kWaitingForDeviceSettingsTrusted = 3, // Wait for policies to be trusted. + kReportControllerInitialized = 4, // Nothing left to do. + kMaxValue = kReportControllerInitialized, + }; + + // Trigger checks for preconditions before construction of |ReportController|. + ReportControllerInitializer(); + ReportControllerInitializer(const ReportControllerInitializer&) = delete; + ReportControllerInitializer& operator=(const ReportControllerInitializer&) = + delete; + ~ReportControllerInitializer() override; + + private: + // Grant friend access for comprehensive testing of private/protected members. + friend class ReportControllerInitializerValidateSegment; + + // Method is used for testing: + report::MarketSegment GetMarketSegmentForTesting( + const policy::DeviceMode& device_mode, + const policy::MarketSegment& device_market_segment); + + // DeviceSettingsService::Observer: + void OwnershipStatusChanged() override; + + // Handler after reading first run chrome time in ThreadPool task. + // This is done to avoid blocking the main browser thread. + void OnFirstRunSentinelCreationTimeRead(base::Time first_chrome_run_time); + + // Determine start up delay before reporting should start. + base::TimeDelta DetermineStartUpDelay(base::Time chrome_first_run_ts); + + // Wrapper method for the PostTaskAndReplyWithResult, which is used to spawn + // a worker thread to check oobe completed file time delta. + void CheckOobeCompleted( + base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback); + + // Retry method every kOobeReadFailedRetryDelay minute until confirming + // 1 minute has passed since /home/chronos/.oobe_completed file was written. + // Maximum retry count is kNumberOfRetriesBeforeFail. + void OnOobeFileWritten( + base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, + base::TimeDelta time_since_oobe_file_written); + + // Determines whether the CrosSettings is trusted. + // If it is trusted, ReportController is initialized. + void CheckTrustedStatus(); + + // Store the current state this class is in. + State state_ = State::kWaitingForOwnership; + + // Number of retry attempts at reading the oobe completed file. + int retry_oobe_completed_count_ = 0; + + // Class maintains ownership of |report_controller_| after it is initialized. + std::unique_ptr<report::ReportController> report_controller_; + + // Sanity check to check methods are called in same sequence. + SEQUENCE_CHECKER(sequence_checker_); + + // Scoped observation to automatically manage the observer registration + // and unregistration with DeviceSettingsService. + base::ScopedObservation<DeviceSettingsService, + DeviceSettingsService::Observer> + device_settings_observation_{this}; + + base::WeakPtrFactory<ReportControllerInitializer> weak_factory_{this}; +}; + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_REPORT_CONTROLLER_INITIALIZER_H_
diff --git a/chrome/browser/ash/report_controller_initializer_unittest.cc b/chrome/browser/ash/report_controller_initializer_unittest.cc new file mode 100644 index 0000000..2228521 --- /dev/null +++ b/chrome/browser/ash/report_controller_initializer_unittest.cc
@@ -0,0 +1,90 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/report_controller_initializer.h" + +#include "base/memory/ptr_util.h" +#include "chrome/browser/ash/settings/device_settings_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +class ReportControllerInitializerValidateSegment + : public testing::TestWithParam<std::tuple<policy::DeviceMode, + policy::MarketSegment, + report::MarketSegment>> { + public: + void SetUp() override { + // Initialize CrOS device settings for ReportControllerInitializer. + DeviceSettingsService::Initialize(); + + // Create ReportControllerInitializer for unit testing. + report_controller_initializer_ = + std::make_unique<ReportControllerInitializer>(); + } + + void TearDown() override { + // Destruct ReportControllerInitializer before cleaning up dependencies. + report_controller_initializer_.reset(); + + // Clean up CrOS device settings after testing. + DeviceSettingsService::Shutdown(); + } + + ReportControllerInitializer* GetReportControllerInitializer() { + return report_controller_initializer_.get(); + } + + protected: + report::MarketSegment GetMarketSegmentForTesting( + const policy::DeviceMode& device_mode, + const policy::MarketSegment& device_market_segment) { + return report_controller_initializer_->GetMarketSegmentForTesting( + device_mode, device_market_segment); + } + + private: + std::unique_ptr<ReportControllerInitializer> report_controller_initializer_; +}; + +TEST_P(ReportControllerInitializerValidateSegment, ValidateSegment) { + auto [device_mode, device_market_segment, expected_segment] = GetParam(); + ASSERT_EQ(expected_segment, + GetMarketSegmentForTesting(device_mode, device_market_segment)); +} + +INSTANTIATE_TEST_SUITE_P( + ReportControllerInitializerValidateSegmentTests, + ReportControllerInitializerValidateSegment, + testing::Values( + // Unknown DeviceMode + std::make_tuple(policy::DeviceMode::DEVICE_MODE_PENDING, + policy::MarketSegment::UNKNOWN, + report::MARKET_SEGMENT_UNKNOWN), + // Consumer DeviceMode + std::make_tuple(policy::DeviceMode::DEVICE_MODE_CONSUMER, + policy::MarketSegment::UNKNOWN, + report::MARKET_SEGMENT_CONSUMER), + // Demo Enterprise DeviceMode + std::make_tuple(policy::DeviceMode::DEVICE_MODE_DEMO, + policy::MarketSegment::ENTERPRISE, + report::MARKET_SEGMENT_ENTERPRISE_DEMO), + // Enterprise DeviceMode Enterprise Segment + std::make_tuple(policy::DeviceMode::DEVICE_MODE_ENTERPRISE, + policy::MarketSegment::ENTERPRISE, + report::MARKET_SEGMENT_ENTERPRISE), + // Enterprise DeviceMode Education Segment + std::make_tuple(policy::DeviceMode::DEVICE_MODE_ENTERPRISE, + policy::MarketSegment::EDUCATION, + report::MARKET_SEGMENT_EDUCATION), + // Enterprise DeviceMode Unknown Segment + std::make_tuple(policy::DeviceMode::DEVICE_MODE_ENTERPRISE, + policy::MarketSegment::UNKNOWN, + report::MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN), + // Unknown DeviceMode And Segment + std::make_tuple(policy::DeviceMode::DEVICE_MODE_NOT_SET, + policy::MarketSegment::UNKNOWN, + report::MARKET_SEGMENT_UNKNOWN))); + +} // namespace ash
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 00c621a7..10fd076 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -129,6 +129,7 @@ #include "components/password_manager/core/browser/password_store/mock_smart_bubble_stats_store.h" #include "components/password_manager/core/browser/password_store/password_store_consumer.h" #include "components/password_manager/core/browser/password_store/password_store_interface.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/payments/content/mock_payment_manifest_web_data_service.h" #include "components/permissions/features.h" #include "components/permissions/permission_actions_history.h" @@ -647,6 +648,18 @@ if (base::FeatureList::IsEnabled( password_manager::features::kEnablePasswordsAccountStorage)) { +#if BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/1495626): Remove once SetUsesSplitStoresAndUPMForLocal() + // is implemented. + if (base::FeatureList::IsEnabled( + password_manager::features:: + kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration)) { + testing_profile->GetPrefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>(password_manager::prefs:: + UseUpmLocalAndSeparateStoresState::kOn)); + } +#endif AccountPasswordStoreFactory::GetInstance()->SetTestingFactory( testing_profile, base::BindRepeating(
diff --git a/chrome/browser/browsing_topics/browsing_topics_internals_browsertest.cc b/chrome/browser/browsing_topics/browsing_topics_internals_browsertest.cc index 2486914..767eb00 100644 --- a/chrome/browser/browsing_topics/browsing_topics_internals_browsertest.cc +++ b/chrome/browser/browsing_topics/browsing_topics_internals_browsertest.cc
@@ -353,7 +353,7 @@ OverridePrivacySandboxSettingsLocalTesting: disabled BrowsingTopicsBypassIPIsPubliclyRoutableCheck: disabled BrowsingTopicsDocumentAPI: enabled -Configuration version: 1 +Configuration version: 2 BrowsingTopicsParameters: disabled BrowsingTopicsParameters:number_of_epochs_to_expose: 3 BrowsingTopicsParameters:time_period_per_epoch: 7d-0h-0m-0s @@ -466,7 +466,7 @@ OverridePrivacySandboxSettingsLocalTesting: disabled BrowsingTopicsBypassIPIsPubliclyRoutableCheck: disabled BrowsingTopicsDocumentAPI: enabled -Configuration version: 1 +Configuration version: 2 BrowsingTopicsParameters: enabled BrowsingTopicsParameters:number_of_epochs_to_expose: 3 BrowsingTopicsParameters:time_period_per_epoch: 0d-0h-0m-15s
diff --git a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc index eb934f9..d487a2b 100644 --- a/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc +++ b/chrome/browser/chrome_web_platform_security_metrics_browsertest.cc
@@ -60,11 +60,6 @@ // Disabled because some subtests set document.domain and this // feature flag prevents that: blink::features::kOriginAgentClusterDefaultEnabled, - - // Disabled, because the ORBv02* subtests rely on a counter that - // no longer works with ORB "v0.2". (Those subtests should be - // removed once "v0.2" launches.) - network::features::kOpaqueResponseBlockingV02, }); } @@ -143,8 +138,6 @@ } } - void SetUpORBMetricsTest(bool onload, bool onerror); - private: void SetUpOnMainThread() final { host_resolver()->AddRule("*", "127.0.0.1"); @@ -2640,67 +2633,4 @@ // Added by: // https://chromium-review.googlesource.com/c/chromium/src/+/2122140 -// Test ORB "v0.2" compatibility impact metrics. We'll reuse the same setup -// four times the same setup, except with different event handlers being set. -void ChromeWebPlatformSecurityMetricsBrowserTest::SetUpORBMetricsTest( - bool onload, - bool onerror) { - constexpr base::StringPiece probe = R"( - const img = document.createElement("img"); - if ($2) img.onload = _ => 2+2; - if ($3) img.onerror = _ => 3+3; - img.src = $1; - document.body.appendChild(img); - )"; - EXPECT_TRUE(content::NavigateToURL( - web_contents(), https_server().GetURL("a.test", "/defaultresponse"))); - EXPECT_TRUE(content::ExecJs( - web_contents(), - content::JsReplace(probe, - // A cross-origin resource that will be ORB-blocked. - https_server().GetURL("b.test", "/nosniff.xml"), - onload, onerror))); - EXPECT_TRUE(content::WaitForLoadStop(web_contents())); -} - -IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest, - ORBv02WithoutEventHandlers) { - SetUpORBMetricsTest(false, false); - CheckCounter(WebFeature::kORBBlockWithoutAnyEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithAnyEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler, 0); -} - -IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest, - ORBv02WithOnLoad) { - SetUpORBMetricsTest(true, false); - CheckCounter(WebFeature::kORBBlockWithoutAnyEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithAnyEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler, 0); -} - -IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest, - ORBv02WithOnError) { - SetUpORBMetricsTest(false, true); - CheckCounter(WebFeature::kORBBlockWithoutAnyEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithAnyEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler, 0); -} - -IN_PROC_BROWSER_TEST_F(ChromeWebPlatformSecurityMetricsBrowserTest, - ORBv02WithOnLoadAndOnError) { - SetUpORBMetricsTest(true, true); - CheckCounter(WebFeature::kORBBlockWithoutAnyEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithAnyEventHandler, 1); - CheckCounter(WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, 0); - CheckCounter(WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler, 1); -} - } // namespace
diff --git a/chrome/browser/component_updater/component_patcher_operation_browsertest.cc b/chrome/browser/component_updater/component_patcher_operation_browsertest.cc deleted file mode 100644 index 7baeeaa..0000000 --- a/chrome/browser/component_updater/component_patcher_operation_browsertest.cc +++ /dev/null
@@ -1,190 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/functional/bind.h" -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/run_loop.h" -#include "base/task/task_traits.h" -#include "base/task/thread_pool.h" -#include "build/build_config.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "components/services/patch/content/patch_service.h" -#include "components/services/patch/public/cpp/patch.h" -#include "components/update_client/component_patcher_operation.h" -#include "components/update_client/test_utils.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/test/browser_test.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" - -namespace { - -constexpr base::TaskTraits kThreadPoolTaskTraits = { - base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; - -} // namespace - -class PatchTest : public InProcessBrowserTest { - public: - PatchTest() { - EXPECT_TRUE(installed_dir_.CreateUniqueTempDir()); - EXPECT_TRUE(input_dir_.CreateUniqueTempDir()); - EXPECT_TRUE(unpack_dir_.CreateUniqueTempDir()); - } - - PatchTest(const PatchTest&) = delete; - PatchTest& operator=(const PatchTest&) = delete; - - base::FilePath InputFilePath(const char* name) { - base::FilePath path = installed_dir_.GetPath().AppendASCII(name); - - base::RunLoop run_loop; - base::ThreadPool::PostTaskAndReply( - FROM_HERE, kThreadPoolTaskTraits, - base::BindOnce(&PatchTest::CopyFile, - update_client::GetTestFilePath(name), path), - run_loop.QuitClosure()); - - run_loop.Run(); - return path; - } - - base::FilePath PatchFilePath(const char* name) { - base::FilePath path = input_dir_.GetPath().AppendASCII(name); - - base::RunLoop run_loop; - base::ThreadPool::PostTaskAndReply( - FROM_HERE, kThreadPoolTaskTraits, - base::BindOnce(&PatchTest::CopyFile, - update_client::GetTestFilePath(name), path), - run_loop.QuitClosure()); - - run_loop.Run(); - return path; - } - - base::FilePath OutputFilePath(const char* name) { - return unpack_dir_.GetPath().AppendASCII(name); - } - - base::FilePath InvalidPath(const char* name) { - return input_dir_.GetPath().AppendASCII("nonexistent").AppendASCII(name); - } - - void RunPatchTest(const std::string& operation, - const base::FilePath& input, - const base::FilePath& patch, - const base::FilePath& output, - int expected_result) { - base::RunLoop run_loop; - quit_closure_ = run_loop.QuitClosure(); - done_called_ = false; - - base::ThreadPool::CreateSequencedTaskRunner(kThreadPoolTaskTraits) - ->PostTask(FROM_HERE, - base::BindOnce(&PatchTest::PatchAsyncSequencedTaskRunner, - base::Unretained(this), operation, input, - patch, output, expected_result)); - run_loop.Run(); - EXPECT_TRUE(done_called_); - } - - private: - void PatchAsyncSequencedTaskRunner( - const std::string& operation, - const base::FilePath& input, - const base::FilePath& patch, - const base::FilePath& output, - int expected_result) { - patch::Patch(patch::LaunchFilePatcher(), operation, input, patch, output, - base::BindOnce(&PatchTest::PatchDone, base::Unretained(this), - expected_result)); - } - - void PatchDone(int expected, int result) { - EXPECT_EQ(expected, result); - done_called_ = true; - content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, - std::move(quit_closure_)); - } - - static void CopyFile(const base::FilePath& source, - const base::FilePath& target) { - EXPECT_TRUE(base::CopyFile(source, target)); - } - - base::ScopedTempDir installed_dir_; - base::ScopedTempDir input_dir_; - base::ScopedTempDir unpack_dir_; - base::OnceClosure quit_closure_; - bool done_called_; -}; - -IN_PROC_BROWSER_TEST_F(PatchTest, CheckBsdiffOperation) { - constexpr int kExpectedResult = bsdiff::OK; - - base::FilePath input_file = InputFilePath("binary_input.bin"); - base::FilePath patch_file = PatchFilePath("binary_bsdiff_patch.bin"); - base::FilePath output_file = OutputFilePath("output.bin"); - - RunPatchTest(update_client::kBsdiff, input_file, patch_file, output_file, - kExpectedResult); - - EXPECT_TRUE(base::ContentsEqual( - update_client::GetTestFilePath("binary_output.bin"), output_file)); -} - -IN_PROC_BROWSER_TEST_F(PatchTest, CheckCourgetteOperation) { - constexpr int kExpectedResult = courgette::C_OK; - - base::FilePath input_file = InputFilePath("binary_input.bin"); - base::FilePath patch_file = PatchFilePath("binary_courgette_patch.bin"); - base::FilePath output_file = OutputFilePath("output.bin"); - - RunPatchTest(update_client::kCourgette, input_file, patch_file, output_file, - kExpectedResult); - - EXPECT_TRUE(base::ContentsEqual( - update_client::GetTestFilePath("binary_output.bin"), output_file)); -} - -IN_PROC_BROWSER_TEST_F(PatchTest, InvalidInputFile) { - constexpr int kInvalidInputFile = -1; - - base::FilePath invalid = InvalidPath("binary_input.bin"); - base::FilePath patch_file = PatchFilePath("binary_courgette_patch.bin"); - base::FilePath output_file = OutputFilePath("output.bin"); - - RunPatchTest(update_client::kCourgette, invalid, patch_file, output_file, - kInvalidInputFile); -} - -IN_PROC_BROWSER_TEST_F(PatchTest, InvalidPatchFile) { - constexpr int kInvalidPatchFile = -1; - - base::FilePath input_file = InputFilePath("binary_input.bin"); - base::FilePath invalid = InvalidPath("binary_courgette_patch.bin"); - base::FilePath output_file = OutputFilePath("output.bin"); - - RunPatchTest(update_client::kCourgette, input_file, invalid, output_file, - kInvalidPatchFile); -} - -IN_PROC_BROWSER_TEST_F(PatchTest, InvalidOutputFile) { - constexpr int kInvalidOutputFile = -1; - - base::FilePath input_file = InputFilePath("binary_input.bin"); - base::FilePath patch_file = PatchFilePath("binary_courgette_patch.bin"); - base::FilePath invalid = InvalidPath("output.bin"); - - RunPatchTest(update_client::kCourgette, input_file, patch_file, invalid, - kInvalidOutputFile); -}
diff --git a/chrome/browser/component_updater/recovery_improved_component_installer.cc b/chrome/browser/component_updater/recovery_improved_component_installer.cc index c2d298a..6b7bc62 100644 --- a/chrome/browser/component_updater/recovery_improved_component_installer.cc +++ b/chrome/browser/component_updater/recovery_improved_component_installer.cc
@@ -77,15 +77,13 @@ auto unzipper = base::MakeRefCounted<update_client::UnzipChromiumFactory>( base::BindRepeating(&unzip::LaunchUnzipper)) ->Create(); - auto unpacker = base::MakeRefCounted<update_client::ComponentUnpacker>( - key_hash_, crx_path_, nullptr, std::move(unzipper), nullptr, - verifier_format_); - unpacker->Unpack( + update_client::PuffinComponentUnpacker::Unpack( + key_hash_, crx_path_, std::move(unzipper), verifier_format_, base::BindOnce(&RecoveryComponentActionHandler::UnpackComplete, this)); } void RecoveryComponentActionHandler::UnpackComplete( - const update_client::ComponentUnpacker::Result& result) { + const update_client::PuffinComponentUnpacker::Result& result) { if (result.error != update_client::UnpackerError::kNone) { DCHECK(!base::DirectoryExists(result.unpack_path)); main_task_runner_->PostTask(
diff --git a/chrome/browser/component_updater/recovery_improved_component_installer.h b/chrome/browser/component_updater/recovery_improved_component_installer.h index a89fad57..d8baeee8 100644 --- a/chrome/browser/component_updater/recovery_improved_component_installer.h +++ b/chrome/browser/component_updater/recovery_improved_component_installer.h
@@ -20,7 +20,7 @@ #include "base/values.h" #include "components/component_updater/component_installer.h" #include "components/crx_file/crx_verifier.h" -#include "components/update_client/component_unpacker.h" +#include "components/update_client/puffin_component_unpacker.h" #include "components/update_client/update_client.h" namespace base { @@ -115,7 +115,8 @@ virtual void Elevate(Callback callback) = 0; void Unpack(); - void UnpackComplete(const update_client::ComponentUnpacker::Result& result); + void UnpackComplete( + const update_client::PuffinComponentUnpacker::Result& result); void RunCommand(const base::CommandLine& cmdline); // `process` contains the process object, if the process was successfully
diff --git a/chrome/browser/extensions/api/printing/printing_test_utils.cc b/chrome/browser/extensions/api/printing/printing_test_utils.cc index 977764482..266322c 100644 --- a/chrome/browser/extensions/api/printing/printing_test_utils.cc +++ b/chrome/browser/extensions/api/printing/printing_test_utils.cc
@@ -223,7 +223,8 @@ capabilities->duplex_default = printing::mojom::DuplexMode::kSimplex; capabilities->duplex_modes.push_back(printing::mojom::DuplexMode::kSimplex); capabilities->copies_max = 2; - capabilities->dpis.emplace_back(kHorizontalDpi, kVerticalDpi); + capabilities->default_dpi = {kHorizontalDpi, kVerticalDpi}; + capabilities->dpis.emplace_back(capabilities->default_dpi); printing::PrinterSemanticCapsAndDefaults::Paper paper( /*display_name=*/"", kMediaSizeVendorId, {kMediaSizeWidth, kMediaSizeHeight});
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 0b51e78f..7e28bed 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -3645,7 +3645,7 @@ { "name": "enable-throttle-display-none-and-visibility-hidden-cross-origin-iframes", "owners": [ "wjmaclean@chromium.org", "alexmos@chromium.org", "creis@chromium.org" ], - "expiry_milestone": 122 + "expiry_milestone": 128 }, { "name": "enable-tls13-early-data", @@ -5787,11 +5787,6 @@ "expiry_milestone": 130 }, { - "name": "omnibox-cache-suggestion-resources", - "owners": ["pnoland@chromium.org", "chrome-omnibox-team@google.com"], - "expiry_milestone": 120 - }, - { "name": "omnibox-calc-provider", "owners": ["manukh@chromium.org", "chrome-omnibox-team@google.com"], "expiry_milestone": 125 @@ -6088,11 +6083,6 @@ "expiry_milestone": 120 }, { - "name": "omnibox-warm-recycled-view-pool", - "owners": [ "pnoland@chromium.org", "chrome-omnibox-team@google.com" ], - "expiry_milestone": 120 - }, - { "name": "omnibox-zero-suggest-in-memory-caching", "owners": [ "khalidpeer@chromium.org", "mahmadi@chromium.org", "chrome-omnibox-team@google.com" ], "expiry_milestone": 130 @@ -7064,7 +7054,7 @@ "thefrog@chromium.org", "chrome-counter-abuse-alerts@google.com" ], - "expiry_milestone": 122 + "expiry_milestone": 125 }, { "name": "safe-browsing-new-gms-core-api-for-browse-url-database-check", @@ -7181,6 +7171,14 @@ "expiry_milestone": 92 }, { + "name": "sea-pen", + "owners": [ + "//ash/webui/personalization_app/OWNERS", + "assistive-eng@google.com" + ], + "expiry_milestone": 125 + }, + { "name": "seal-key", "owners": [ "greywang@google.com", "essential-inputs-team@google.com" ], "expiry_milestone": 130
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index b2992e30..fb32eaa2 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2372,12 +2372,6 @@ "flag to adjust the limit of offered suggestions. The number of shown " "suggestions will be no less than the platform default limit."; -const char kOmniboxCacheSuggestionResourcesName[] = - "Omnibox cache suggestion resources"; -const char kOmniboxCacheSuggestionResourcesDescription[] = - "When enabled, the omnibox will cache frequently used drawables and " - "strings rather than loading them from Android every time they're needed."; - const char kOmniboxCalcProviderName[] = "Omnibox calc provider"; const char kOmniboxCalcProviderDescription[] = "When enabled, suggests recent calculator results in the omnibox."; @@ -2499,12 +2493,6 @@ "Updates the logic constructing MV tiles to use horizontal render group. " "No user-facing changes expected."; -const char kOmniboxWarmRecycledViewPoolName[] = - "Omnibox warm recycled view pool"; -const char kOmniboxWarmRecycledViewPoolDescription[] = - "Pre-warms the Android Omnibox's RecyclerView pool by inflating " - "views before the omnibox is focused."; - const char kOmniboxZeroSuggestPrefetchingName[] = "Omnibox Zero Prefix Suggestion Prefetching on NTP"; const char kOmniboxZeroSuggestPrefetchingDescription[] = @@ -2888,10 +2876,6 @@ const char kBookmarksImprovedSaveFlowDescription[] = "Enabled an improved save flow for bookmarks."; -const char kBookmarksRefreshName[] = "Bookmarks refresh"; -const char kBookmarksRefreshDescription[] = - "Enable various changes to bookmarks."; - const char kSpeculationRulesPrerenderingTargetHintName[] = "Speculation Rules API target hint"; const char kSpeculationRulesPrerenderingTargetHintDescription[] = @@ -7013,6 +6997,9 @@ const char kScreencastV2Name[] = "Screencast V2"; const char kScreencastV2Description[] = "Enable V2 features for Screencast app"; +const char kSeaPenName[] = "SeaPen"; +const char kSeaPenDescription[] = "Enable SeaPen Wallpaper"; + const char kSealKeyName[] = "Secret key for Seal feature"; const char kSealKeyDescription[] = "Secret key for Seal feature.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index ad76d83..aeb4a27 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1354,9 +1354,6 @@ extern const char kOmniboxAdaptiveSuggestionsCountName[]; extern const char kOmniboxAdaptiveSuggestionsCountDescription[]; -extern const char kOmniboxCacheSuggestionResourcesName[]; -extern const char kOmniboxCacheSuggestionResourcesDescription[]; - extern const char kOmniboxCalcProviderName[]; extern const char kOmniboxCalcProviderDescription[]; @@ -1461,9 +1458,6 @@ extern const char kOmniboxSuppressClipboardSuggestionAfterFirstUsedDescription[]; -extern const char kOmniboxWarmRecycledViewPoolName[]; -extern const char kOmniboxWarmRecycledViewPoolDescription[]; - extern const char kOmniboxRichAutocompletionPromisingName[]; extern const char kOmniboxRichAutocompletionPromisingDescription[]; @@ -1630,9 +1624,6 @@ extern const char kBookmarksImprovedSaveFlowName[]; extern const char kBookmarksImprovedSaveFlowDescription[]; -extern const char kBookmarksRefreshName[]; -extern const char kBookmarksRefreshDescription[]; - extern const char kAutoWebContentsDarkModeName[]; extern const char kAutoWebContentsDarkModeDescription[]; @@ -4026,6 +4017,9 @@ extern const char kSealKeyName[]; extern const char kSealKeyDescription[]; +extern const char kSeaPenName[]; +extern const char kSeaPenDescription[]; + extern const char kShelfAutoHideSeparationName[]; extern const char kShelfAutoHideSeparationDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 42f84513..40868e2 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -82,7 +82,6 @@ &autofill::features::kAutofillEnableRankingFormulaAddressProfiles, &autofill::features::kAutofillEnableRankingFormulaCreditCards, &autofill::features::kAutofillEnableManualFallbackForVirtualCards, - &autofill::features::kAutofillKeyboardAccessory, &autofill::features::kAutofillEnableNewCardArtAndNetworkImages, &autofill::features::kAutofillEnableCardArtServerSideStretching, &autofill::features::kAutofillEnableSupportForHonorificPrefixes, @@ -254,12 +253,9 @@ &kPriceChangeModule, &kPwaRestoreUi, &kBookmarksImprovedSaveFlow, - &kBookmarksRefresh, &kOmahaMinSdkVersionAndroid, &kShortCircuitUnfocusAnimation, - &kOmniboxCacheSuggestionResources, &kOmniboxNoopEditUrlSuggestionClicks, - &kOmniboxWarmRecycledViewPool, &kPartnerCustomizationsUma, &kProbabilisticCryptidRenderer, &kQuickDeleteForAndroid, @@ -783,10 +779,6 @@ "BookmarksImprovedSaveFlow", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kBookmarksRefresh, - "BookmarksRefresh", - base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kBackGestureActivityTabProvider, "BackGestureActivityTabProvider", base::FEATURE_DISABLED_BY_DEFAULT); @@ -807,18 +799,10 @@ "ShortCircuitUnfocusAnimation", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kOmniboxCacheSuggestionResources, - "OmniboxCacheSuggestionResources", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kOmniboxNoopEditUrlSuggestionClicks, "OmniboxNoopEditUrlSuggestionClicks", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kOmniboxWarmRecycledViewPool, - "OmniboxWarmRecycledViewPool", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kPartnerCustomizationsUma, "PartnerCustomizationsUma", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 73b0523..f9ee267 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -115,10 +115,8 @@ BASE_DECLARE_FEATURE(kOmahaMinSdkVersionAndroid); BASE_DECLARE_FEATURE(kAvoidRelayoutDuringFocusAnimation); BASE_DECLARE_FEATURE(kShortCircuitUnfocusAnimation); -BASE_DECLARE_FEATURE(kOmniboxCacheSuggestionResources); BASE_DECLARE_FEATURE(kOmniboxNoopEditUrlSuggestionClicks); BASE_DECLARE_FEATURE(kOmniboxModernizeVisualUpdate); -BASE_DECLARE_FEATURE(kOmniboxWarmRecycledViewPool); BASE_DECLARE_FEATURE(kOptimizeGeolocationHeaderGeneration); BASE_DECLARE_FEATURE(kPageAnnotationsService); BASE_DECLARE_FEATURE(kPaintPreviewNewColdStartHeuristic); @@ -126,7 +124,6 @@ BASE_DECLARE_FEATURE(kPriceChangeModule); BASE_DECLARE_FEATURE(kPwaRestoreUi); BASE_DECLARE_FEATURE(kBookmarksImprovedSaveFlow); -BASE_DECLARE_FEATURE(kBookmarksRefresh); BASE_DECLARE_FEATURE(kPartnerCustomizationsUma); BASE_DECLARE_FEATURE(kProbabilisticCryptidRenderer); BASE_DECLARE_FEATURE(kQuickDeleteForAndroid);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index aebedbee..b456dea 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -173,7 +173,6 @@ public static final String BASELINE_GM3_SURFACE_COLORS = "BaselineGM3SurfaceColors"; public static final String BLOCK_INTENTS_WHILE_LOCKED = "BlockIntentsWhileLocked"; public static final String BOARDING_PASS_DETECTOR = "BoardingPassDetector"; - public static final String BOOKMARKS_REFRESH = "BookmarksRefresh"; public static final String CACHE_ACTIVITY_TASKID = "CacheActivityTaskID"; public static final String CAPTIVE_PORTAL_CERTIFICATE_LIST = "CaptivePortalCertificateList"; public static final String CCT_AUTO_TRANSLATE = "CCTAutoTranslate"; @@ -743,16 +742,10 @@ newMutableFlagWithSafeDefault(INCOGNITO_SCREENSHOT, false); public static final MutableFlagWithSafeDefault sNoVisibleHintForTablets = newMutableFlagWithSafeDefault(ANDROID_NO_VISIBLE_HINT_FOR_TABLETS, false); - public static final MutableFlagWithSafeDefault sOmniboxCacheSuggestionResources = - newMutableFlagWithSafeDefault(OMNIBOX_CACHE_SUGGESTION_RESOURCES, true); public static final MutableFlagWithSafeDefault sOmniboxHistoryClusterProvider = newMutableFlagWithSafeDefault(OMNIBOX_HISTORY_CLUSTER_PROVIDER, false); - public static final MutableFlagWithSafeDefault sOmniboxJourneysActionChipFlag = - newMutableFlagWithSafeDefault(OMNIBOX_HISTORY_CLUSTER_ACTION_CHIP, false); public static final MutableFlagWithSafeDefault sOmniboxNoopEditUrlSuggestionClicks = newMutableFlagWithSafeDefault(OMNIBOX_NOOP_EDIT_URL_SUGGESTION_CLICKS, false); - public static final MutableFlagWithSafeDefault sOmniboxWarmRecycledViewPool = - newMutableFlagWithSafeDefault(OMNIBOX_WARM_RECYCLED_VIEW_POOL, true); public static final MutableFlagWithSafeDefault sQuickDeleteForAndroid = newMutableFlagWithSafeDefault(QUICK_DELETE_FOR_ANDROID, false); public static final MutableFlagWithSafeDefault sReaderModeCct = @@ -761,8 +754,6 @@ newMutableFlagWithSafeDefault(RECORD_SUPPRESSION_METRICS, true); public static final MutableFlagWithSafeDefault sSearchReadyOmniboxAllowQueryEdit = newMutableFlagWithSafeDefault(SEARCH_READY_OMNIBOX_ALLOW_QUERY_EDIT, false); - public static final MutableFlagWithSafeDefault sShortCircuitUnfocusAnimation = - newMutableFlagWithSafeDefault(SHORT_CIRCUIT_UNFOCUS_ANIMATION, false); public static final MutableFlagWithSafeDefault sSuppressionToolbarCaptures = newMutableFlagWithSafeDefault(SUPPRESS_TOOLBAR_CAPTURES, false); public static final MutableFlagWithSafeDefault sThumbnailPlaceholder =
diff --git a/chrome/browser/installable/ml_promotion_browsertest.cc b/chrome/browser/installable/ml_promotion_browsertest.cc index ef2ba8a..e9fcd222 100644 --- a/chrome/browser/installable/ml_promotion_browsertest.cc +++ b/chrome/browser/installable/ml_promotion_browsertest.cc
@@ -426,7 +426,8 @@ // Restart the pipeline by navigating to about::blank and then navigating back // to the no manifest page. - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); NavigateUpdateManifestAndAwaitDelayedTaskPending( GetUrlWithNoManifest(), GetManifestUrlForNoManifestTestPage()); @@ -614,7 +615,8 @@ // Navigate to a different page to reset the site URL the pipeline needs to be // triggered from. - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); // Add favicons to page after loading and trigger pipeline for testing. UpdateFaviconAndRunPipelinePendingDelayedTask(GetUrlWithNoManifest()); @@ -680,7 +682,8 @@ ExpectTrainingResult(TrainingRequestId(1ll), MlInstallResponse::kBlockedGuardrails); // Doing another navigation should now trigger the guardrail blocked signal. - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); } // Test for crbug.com/1472629, where an already open dialog would cause @@ -706,7 +709,7 @@ task_runner_->RunPendingTasks(); // Refreshing the page should exit the pipeline early, and should not crash. - web_app::NavigateToURLAndWait(browser(), GetInstallableAppURL()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); task_runner_->RunPendingTasks(); } @@ -844,7 +847,8 @@ ExpectTrainingResult(TrainingRequestId(1ll), MlInstallResponse::kIgnored); views::test::WidgetDestroyedWaiter destroyed(widget); - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); destroyed.Wait(); provider().command_manager().AwaitAllCommandsCompleteForTesting(); @@ -1008,7 +1012,8 @@ provider().command_manager().AwaitAllCommandsCompleteForTesting(); EXPECT_TRUE(provider().registrar_unsafe().is_empty()); - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); // Test that guardrails now block the install. NavigateAndAwaitMetricsCollectionPending(GetUrlBasedOnDialogState()); @@ -1025,7 +1030,8 @@ ExpectTrainingResult(TrainingRequestId(2ll), MlInstallResponse::kBlockedGuardrails, web_contents()); // Doing another navigation should now trigger the guardrail blocked signal. - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); } IN_PROC_BROWSER_TEST_P(MLPromotionInstallDialogBrowserTest, @@ -1062,7 +1068,8 @@ provider().command_manager().AwaitAllCommandsCompleteForTesting(); EXPECT_TRUE(provider().registrar_unsafe().is_empty()); - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); // Navigate back to the app url to re-trigger the ml pipeline. ExpectClasificationCallReturnResult( @@ -1113,7 +1120,8 @@ provider().command_manager().AwaitAllCommandsCompleteForTesting(); EXPECT_TRUE(provider().registrar_unsafe().is_empty()); - web_app::NavigateToURLAndWait(browser(), GURL(url::kAboutBlankURL)); + web_app::NavigateViaLinkClickToURLAndWait(browser(), + GURL(url::kAboutBlankURL)); // Navigate back to the app url to re-trigger the ml pipeline. ExpectClasificationCallReturnResult(
diff --git a/chrome/browser/installable/ml_promotion_browsertest_base.cc b/chrome/browser/installable/ml_promotion_browsertest_base.cc index 991e869..1beadc0 100644 --- a/chrome/browser/installable/ml_promotion_browsertest_base.cc +++ b/chrome/browser/installable/ml_promotion_browsertest_base.cc
@@ -146,7 +146,7 @@ return false; #else auto* manager = TestAppBannerManagerDesktop::FromWebContents(web_contents()); - web_app::NavigateToURLAndWait(browser(), url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), url); return manager->WaitForInstallableCheck(); #endif // BUILDFLAG(IS_ANDROID) }
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc index db70791..0059a16d 100644 --- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc +++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
@@ -374,8 +374,6 @@ url::Origin::Create(GURL(features::kKAnonymityServiceAuthServer.Get())); network::mojom::TrustTokenParamsPtr params = network::mojom::TrustTokenParams::New(); - params->version = - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; params->operation = network::mojom::TrustTokenOperationType::kRedemption; params->refresh_policy = network::mojom::TrustTokenRefreshPolicy::kRefresh; params->custom_key_commitment = key_and_id.key_commitment;
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc index 488cfc3..a233bde 100644 --- a/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc +++ b/chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc
@@ -447,8 +447,6 @@ network::mojom::TrustTokenParamsPtr params = network::mojom::TrustTokenParams::New(); - params->version = - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; params->operation = network::mojom::TrustTokenOperationType::kIssuance; params->custom_key_commitment = key_commitment->key_and_id.key_commitment; resource_request->trust_token_params = *params;
diff --git a/chrome/browser/lacros/lacros_apps_publisher_browsertest.cc b/chrome/browser/lacros/lacros_apps_publisher_browsertest.cc index c16aa1d..673ebb5 100644 --- a/chrome/browser/lacros/lacros_apps_publisher_browsertest.cc +++ b/chrome/browser/lacros/lacros_apps_publisher_browsertest.cc
@@ -196,7 +196,7 @@ // Launch |app_id| for the web app. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), url); content::WebContents* web_content = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_content);
diff --git a/chrome/browser/lacros/lacros_extension_apps_publisher_browsertest.cc b/chrome/browser/lacros/lacros_extension_apps_publisher_browsertest.cc index 452b798..5bb8ac77 100644 --- a/chrome/browser/lacros/lacros_extension_apps_publisher_browsertest.cc +++ b/chrome/browser/lacros/lacros_extension_apps_publisher_browsertest.cc
@@ -433,7 +433,7 @@ // Launch `app_id` for the web app. web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(browser(), url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), url); content::WebContents* web_content = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_content);
diff --git a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc index 32ee550..d3ff323 100644 --- a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -125,52 +125,6 @@ return browser->tab_strip_model()->GetActiveWebContents(); } -std::vector<double> ParseGoogMaxDecodeFromWebrtcInternalsTab( - const std::string& webrtc_internals_stats_json) { - std::vector<double> goog_decode_ms; - - absl::optional<base::Value> parsed_json = - base::JSONReader::Read(webrtc_internals_stats_json); - if (!parsed_json || !parsed_json->is_dict()) - return goog_decode_ms; - const base::Value::Dict& dictionary = parsed_json->GetDict(); - - // |dictionary| should have exactly two entries, one per ssrc. - if (dictionary.size() != 2u) - return goog_decode_ms; - - // Only a given |dictionary| entry will have a "stats" entry that has a key - // that ends with "recv-googMaxDecodeMs" inside (it will start with the ssrc - // id, but we don't care about that). Then collect the string of "values" out - // of that key and convert those into the |goog_decode_ms| vector of doubles. - for (auto dictionary_entry : dictionary) { - for (auto ssrc_entry : dictionary_entry.second.GetDict()) { - if (ssrc_entry.first != "stats") - continue; - - for (auto stat_entry : ssrc_entry.second.GetDict()) { - if (!base::EndsWith(stat_entry.first, "recv-googMaxDecodeMs", - base::CompareCase::SENSITIVE)) { - continue; - } - const std::string* values_entry = - stat_entry.second.GetDict().FindString("values"); - if (!values_entry) { - continue; - } - base::StringTokenizer values_tokenizer(*values_entry, "[,]"); - while (values_tokenizer.GetNext()) { - if (values_tokenizer.token_is_delim()) - continue; - goog_decode_ms.push_back(atof(values_tokenizer.token().c_str()) * - base::Time::kMicrosecondsPerMillisecond); - } - } - } - } - return goog_decode_ms; -} - } // anonymous namespace // Tests the performance of Chrome displaying remote video. @@ -219,9 +173,6 @@ // connection(s) are up. content::WebContents* webrtc_internals_tab = OpenWebrtcInternalsTab(browser()); - EXPECT_TRUE( - content::ExecJs(webrtc_internals_tab, - "currentGetStatsMethod = OPTION_GETSTATS_LEGACY")); content::WebContents* left_tab = OpenPageAndGetUserMediaInNewTabWithConstraints( @@ -263,11 +214,8 @@ ASSERT_TRUE(tracing::BeginTracing("media,viz,webrtc")); // Run the connection for 5 seconds to collect metrics. test::SleepInJavascript(left_tab, 5000); - - const std::string webrtc_internals_stats_json = ExecuteJavascript( - "JSON.stringify(peerConnectionDataStore);", webrtc_internals_tab); - webrtc_decode_latencies_ = - ParseGoogMaxDecodeFromWebrtcInternalsTab(webrtc_internals_stats_json); + ExecuteJavascript("JSON.stringify(peerConnectionDataStore);", + webrtc_internals_tab); chrome::CloseWebContents(browser(), webrtc_internals_tab, false); std::string json_events; @@ -468,15 +416,14 @@ testing::Values(30, 60), testing::Bool())); -// TODO(crbug.com/1509755): Rewrite these tests to not use legacy GetStats API. IN_PROC_BROWSER_TEST_P(WebRtcVideoDisplayPerfBrowserTest, - DISABLED_TestVideoDisplayPerfVP9) { + TestVideoDisplayPerfVP9) { TestVideoDisplayPerf("VP9"); } #if BUILDFLAG(RTC_USE_H264) IN_PROC_BROWSER_TEST_P(WebRtcVideoDisplayPerfBrowserTest, - DISABLED_TestVideoDisplayPerfH264) { + TestVideoDisplayPerfH264) { if (!base::FeatureList::IsEnabled( blink::features::kWebRtcH264WithOpenH264FFmpeg)) { LOG(WARNING) << "Run-time feature WebRTC-H264WithOpenH264FFmpeg disabled. "
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc index d7e867d..61ffca7 100644 --- a/chrome/browser/metrics/ukm_browsertest.cc +++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -743,17 +743,14 @@ ukm_test_helper.BuildAndStoreLog(); EXPECT_TRUE(ukm_test_helper.HasUnsentLogs()); - // Check the log's content and the histogram. + // Check the log's content. std::unique_ptr<ukm::Report> report = ukm_test_helper.GetUkmReport(); if (param.expect_reported_demographics) { EXPECT_EQ(test::GetNoisedBirthYear(local_state(), test_birth_year), report->user_demographics().birth_year()); EXPECT_EQ(test_gender, report->user_demographics().gender()); - histogram.ExpectUniqueSample("UKM.UserDemographics.Status", - UserDemographicsStatus::kSuccess, 1); } else { EXPECT_FALSE(report->has_user_demographics()); - histogram.ExpectTotalCount("UKM.UserDemographics.Status", /*count=*/0); } #if !BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/password_manager/account_password_store_factory.cc b/chrome/browser/password_manager/account_password_store_factory.cc index 3f8918ef..ba9a274 100644 --- a/chrome/browser/password_manager/account_password_store_factory.cc +++ b/chrome/browser/password_manager/account_password_store_factory.cc
@@ -33,6 +33,7 @@ #include "components/password_manager/core/browser/password_store/password_store_built_in_backend.h" #include "components/password_manager/core/browser/password_store/password_store_interface.h" #include "components/password_manager/core/browser/password_store_factory_util.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/network_service_instance.h" @@ -178,9 +179,21 @@ } #if BUILDFLAG(IS_ANDROID) - if (!password_manager_android_util::UsesSplitStoresAndUPMForLocal( - profile->GetPrefs())) { - return nullptr; + // UsesSplitStoresAndUPMForLocal() doesn't fit here, it returns false for + // kOffAndMigrationPending. + switch (profile->GetPrefs()->GetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores)) { + case static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOff): + return nullptr; + case static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState:: + kOffAndMigrationPending): + case static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn): + break; + default: + NOTREACHED_NORETURN(); } #endif
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupClientHelper.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupClientHelper.java index f45b2132..1acea49 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupClientHelper.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordCheckupClientHelper.java
@@ -22,13 +22,15 @@ } } + // TODO(crbug.com/1504551): Delete the variant of getPasswordCheckupIntent taking + // Optional<String> as accountName and switch the one using String. /** * Retrieves a pending intent that can be used to launch the Password Checkup UI in the * credential manager. The intent is to either be used immediately or discarded. * * @param referrer the place that will launch the password checkup UI * @param accountName the account name that is syncing passwords. If no value was provided local - * account will be used. + * account will be used. * @param successCallback callback called with the intent if the retrieving was successful * @param failureCallback callback called if the retrieving failed with the encountered error. */ @@ -39,12 +41,30 @@ Callback<Exception> failureCallback); /** + * Retrieves a pending intent that can be used to launch the Password Checkup UI in the + * credential manager. The intent is to either be used immediately or discarded. + * + * @param referrer the place that will launch the password checkup UI + * @param accountName the account name that is syncing passwords. If it's empty, local account + * will be used. + * @param successCallback callback called with the intent if the retrieving was successful + * @param failureCallback callback called if the retrieving failed with the encountered error. + */ + default void getPasswordCheckupIntent( + @PasswordCheckReferrer int referrer, + String accountName, + Callback<PendingIntent> successCallback, + Callback<Exception> failureCallback) {} + + // TODO(crbug.com/1504551): Delete the variant of runPasswordCheckupInBackground taking + // Optional<String> as accountName and switch the one using String. + /** * Asynchronously runs Password Checkup and stores the result in PasswordSpecifics then saves it * to the ChromeSync module. * * @param referrer the place that requested to start a check. * @param accountName the account name that is syncing passwords. If no value was provided local - * account will be used. + * account will be used. * @param successCallback callback called with Password Check started successful * @param failureCallback callback called if encountered an error. */ @@ -55,11 +75,29 @@ Callback<Exception> failureCallback); /** + * Asynchronously runs Password Checkup and stores the result in PasswordSpecifics then saves it + * to the ChromeSync module. + * + * @param referrer the place that requested to start a check. + * @param accountName the account name that is syncing passwords. If no value was provided local + * account will be used. + * @param successCallback callback called with Password Check started successful + * @param failureCallback callback called if encountered an error. + */ + default void runPasswordCheckupInBackground( + @PasswordCheckReferrer int referrer, + String accountName, + Callback<Void> successCallback, + Callback<Exception> failureCallback) {} + + // TODO(crbug.com/1504551): Delete the variant of getBreachedCredentialsCount taking + // Optional<String> as accountName and switch the one using String. + /** * Asynchronously returns the number of breached credentials for the provided account. * * @param referrer the place that requested number of breached credentials. * @param accountName the account name that is syncing passwords. If no value was provided local - * account will be used. + * account will be used. * @param successCallback callback called with the number of breached passwords. * @param failureCallback callback called if encountered an error. */ @@ -68,4 +106,19 @@ Optional<String> accountName, Callback<Integer> successCallback, Callback<Exception> failureCallback); + + /** + * Asynchronously returns the number of breached credentials for the provided account. + * + * @param referrer the place that requested number of breached credentials. + * @param accountName the account name that is syncing passwords. If no value was provided local + * account will be used. + * @param successCallback callback called with the number of breached passwords. + * @param failureCallback callback called if encountered an error. + */ + default void getBreachedCredentialsCount( + @PasswordCheckReferrer int referrer, + String accountName, + Callback<Integer> successCallback, + Callback<Exception> failureCallback) {} }
diff --git a/chrome/browser/password_manager/android/password_manager_android_util.cc b/chrome/browser/password_manager/android/password_manager_android_util.cc index 1ba947d..503e423 100644 --- a/chrome/browser/password_manager/android/password_manager_android_util.cc +++ b/chrome/browser/password_manager/android/password_manager_android_util.cc
@@ -8,16 +8,24 @@ #include "base/notreached.h" #include "chrome/browser/password_manager/android/password_manager_eviction_util.h" #include "components/password_manager/core/browser/features/password_features.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" namespace password_manager_android_util { bool UsesSplitStoresAndUPMForLocal(PrefService* pref_service) { - bool is_upm_local_enabled = base::FeatureList::IsEnabled( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - // TODO(crbug.com/1495626): Replace the flag check with the readiness pref - // check. - return is_upm_local_enabled; + auto value = + static_cast<password_manager::prefs::UseUpmLocalAndSeparateStoresState>( + pref_service->GetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores)); + switch (value) { + case password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOff: + case password_manager::prefs::UseUpmLocalAndSeparateStoresState:: + kOffAndMigrationPending: + return false; + case password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn: + return true; + } + NOTREACHED_NORETURN(); } bool CanUseUPMBackend(bool is_pwd_sync_enabled, PrefService* pref_service) {
diff --git a/chrome/browser/password_manager/android/password_manager_android_util_unittest.cc b/chrome/browser/password_manager/android/password_manager_android_util_unittest.cc index 42a0ac8..ee85438 100644 --- a/chrome/browser/password_manager/android/password_manager_android_util_unittest.cc +++ b/chrome/browser/password_manager/android/password_manager_android_util_unittest.cc
@@ -17,6 +17,10 @@ pref_service_.registry()->RegisterBooleanPref( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); + pref_service_.registry()->RegisterIntegerPref( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOff)); } protected: @@ -24,53 +28,41 @@ }; TEST_F(PasswordManagerAndroidUtilTest, - UsesSplitStoresAndUPMForLocalFalseWhenFeatureDisabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - - EXPECT_FALSE(UsesSplitStoresAndUPMForLocal(&pref_service_)); + CanUseUPMBackendFalseWhenNotSyncingAndSplitStoresOff) { + EXPECT_FALSE( + CanUseUPMBackend(/*is_pwd_sync_enabled = */ false, &pref_service_)); } TEST_F(PasswordManagerAndroidUtilTest, - UsesSplitStoresAndUPMForLocalTrueWhenFeatureEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - - EXPECT_TRUE(UsesSplitStoresAndUPMForLocal(&pref_service_)); -} - -TEST_F(PasswordManagerAndroidUtilTest, - CanUseUPMBackendFalseWhenNotSyncingAndFeatureDisabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + CanUseUPMBackendFalseWhenNotSyncingAndSplitStoresMigrationPending) { + pref_service_.SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState:: + kOffAndMigrationPending)); EXPECT_FALSE( CanUseUPMBackend(/*is_pwd_sync_enabled = */ false, &pref_service_)); } TEST_F(PasswordManagerAndroidUtilTest, - CanUseUPMBackendTrueWhenNotSyncingAndFeatureEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + CanUseUPMBackendTrueWhenNotSyncingAndSplitStoresOn) { + pref_service_.SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); EXPECT_TRUE( CanUseUPMBackend(/*is_pwd_sync_enabled = */ false, &pref_service_)); } TEST_F(PasswordManagerAndroidUtilTest, - CanUseUPMBackendTrueWhenNotSyncingAndFeatureEnabledAndUnenrolled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + CanUseUPMBackendTrueWhenNotSyncingAndSplitStoresEnabledAndUnenrolled) { + pref_service_.SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); + pref_service_.SetBoolean( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, true); @@ -90,22 +82,17 @@ } TEST_F(PasswordManagerAndroidUtilTest, - CanUseUPMBackendTrueWhenSyncingAndFeatureDisabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - + CanUseUPMBackendTrueWhenSyncingAndSplitStoresDisabled) { EXPECT_TRUE( CanUseUPMBackend(/*is_pwd_sync_enabled = */ true, &pref_service_)); } TEST_F(PasswordManagerAndroidUtilTest, - CanUseUPMBackendTrueWhenSyncingAndFeatureEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + CanUseUPMBackendTrueWhenSyncingAndSplitStoresEnabled) { + pref_service_.SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); EXPECT_TRUE( CanUseUPMBackend(/*is_pwd_sync_enabled = */ true, &pref_service_));
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc index ed49207..0058a2e 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
@@ -9,8 +9,6 @@ #include "base/memory/weak_ptr.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/with_feature_override.h" #include "chrome/browser/password_manager/android/fake_password_manager_lifecycle_helper.h" #include "chrome/browser/password_manager/android/password_settings_updater_android_bridge_helper.h" #include "components/password_manager/core/browser/features/password_features.h" @@ -216,10 +214,13 @@ test_pref_service_.registry()->RegisterBooleanPref( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); + test_pref_service_.registry()->RegisterIntegerPref( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOff)); } -// The tests in this suite start with the -// `UnifiedPasswordManagerLocalPasswordsAndroidNoMigration` feature disabled. +// This suite starts with the pref `kPasswordsUseUPMLocalAndSeparateStores` off. class PasswordManagerSettingsServiceAndroidImplTest : public PasswordManagerSettingsServiceAndroidImplBaseTest {}; @@ -1030,19 +1031,16 @@ sync_service()->FireStateChanged(); } -// The tests in this suite start with the feature -// `UnifiedPasswordManagerLocalPasswordsAndroidNoMigration` enabled. +// This suite starts with the pref `kPasswordsUseUPMLocalAndSeparateStores` on. class PasswordManagerSettingsServiceAndroidImplTestLocalUsers : public PasswordManagerSettingsServiceAndroidImplBaseTest { protected: - PasswordManagerSettingsServiceAndroidImplTestLocalUsers() - : feature_list_( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration) {} - base::test::ScopedFeatureList* feature_list() { return &feature_list_; } - - private: - base::test::ScopedFeatureList feature_list_; + PasswordManagerSettingsServiceAndroidImplTestLocalUsers() { + pref_service()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); + } }; TEST_F(PasswordManagerSettingsServiceAndroidImplTestLocalUsers,
diff --git a/chrome/browser/password_manager/android/password_store_proxy_backend_unittest.cc b/chrome/browser/password_manager/android/password_store_proxy_backend_unittest.cc index c9bd957..73223a4 100644 --- a/chrome/browser/password_manager/android/password_store_proxy_backend_unittest.cc +++ b/chrome/browser/password_manager/android/password_store_proxy_backend_unittest.cc
@@ -13,7 +13,6 @@ #include "base/strings/strcat.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" #include "components/password_manager/core/browser/features/password_features.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_form_digest.h" @@ -114,6 +113,10 @@ prefs::kCurrentMigrationVersionToGoogleMobileServices, 0); prefs_.registry()->RegisterBooleanPref( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); + prefs_.registry()->RegisterIntegerPref( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOff)); } void SetUp() override { @@ -157,7 +160,6 @@ StrictMock<MockPasswordStoreBackend> android_backend_; private: - base::test::ScopedFeatureList feature_list_; TestingPrefServiceSimple prefs_; std::unique_ptr<PasswordStoreProxyBackend> proxy_backend_; syncer::TestSyncService sync_service_; @@ -241,9 +243,10 @@ TEST_F(PasswordStoreProxyBackendBaseTest, ProfileLocalSupportCallRemoteChangesOnlyFromAndroidBackend) { - base::test::ScopedFeatureList scoped_feature_list{ - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration}; + prefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); base::MockCallback<RemoveChangesReceived> original_callback; // Both backends receive a callback that they trigger for new remote changes. @@ -281,9 +284,10 @@ TEST_F(PasswordStoreProxyBackendBaseTest, AccountCallRemoteChangesOnlyForMainBackend) { // The account backend only exists if there is support for local passwords. - base::test::ScopedFeatureList scoped_feature_list{ - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration}; + prefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); base::MockCallback<RemoveChangesReceived> original_callback; @@ -347,9 +351,10 @@ TEST_F(PasswordStoreProxyBackendBaseTest, AccountCallSyncCallbackForTheBuiltInBackend) { // The account backend only exists if there is support for local passwords. - base::test::ScopedFeatureList scoped_feature_list{ - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration}; + prefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); base::MockCallback<base::RepeatingClosure> original_callback; // Both backends receive a callback that they trigger for new remote changes. @@ -403,13 +408,10 @@ prefs()->SetBoolean(prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, GetParam().is_unenrolled); if (GetParam().is_using_split_account_local_stores) { - scoped_feature_list_.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - } else { - scoped_feature_list_.InitAndDisableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + prefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); } } @@ -428,9 +430,6 @@ return GetParam().android_is_main_backend ? built_in_backend() : android_backend(); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; TEST_P(PasswordStoreProxyBackendTest, UseMainBackendToGetAllLoginsAsync) { @@ -721,13 +720,10 @@ void SetUp() override { PasswordStoreProxyBackendBaseTest::SetUp(); if (GetParam().is_using_split_account_local_stores) { - scoped_feature_list_.InitAndEnableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); - } else { - scoped_feature_list_.InitAndDisableFeature( - password_manager::features:: - kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration); + prefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); } } @@ -736,9 +732,6 @@ &built_in_backend_, &android_backend_, prefs(), IsAccountStore(GetParam().is_account_store)); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; TEST_P(PasswordStoreProxyBackendTestWithErrorsForFallbacks,
diff --git a/chrome/browser/password_manager/password_store_backend_factory.cc b/chrome/browser/password_manager/password_store_backend_factory.cc index 129753a0..b87bf43 100644 --- a/chrome/browser/password_manager/password_store_backend_factory.cc +++ b/chrome/browser/password_manager/password_store_backend_factory.cc
@@ -87,13 +87,13 @@ password_manager::CreateLoginDatabaseForAccountStorage( login_db_directory)); #if BUILDFLAG(IS_ANDROID) - // The min GMS Core version required by the account backend is larger than - // the one checked by `CanCreateBackend`. If an account backend is being - // created, it means that the version check already passed before, so no - // need to check `CanCreateBackend` here. - CHECK(password_manager::PasswordStoreAndroidBackendBridgeHelper:: - CanCreateBackend()); - CHECK(password_manager_android_util::UsesSplitStoresAndUPMForLocal(prefs)); + if (!password_manager::PasswordStoreAndroidBackendBridgeHelper:: + CanCreateBackend()) { + // Can happen if the downstream code is not available. + return std::make_unique<password_manager::PasswordStoreBuiltInBackend>( + std::move(login_db), + syncer::WipeModelUponSyncDisabledBehavior::kAlways); + } // Note: The built-in backend is backed by the login database and Chrome // syncs it. As such, it expects local data to be cleared every time when
diff --git a/chrome/browser/payments/webapps/payment_request_lacros_browsertest.cc b/chrome/browser/payments/webapps/payment_request_lacros_browsertest.cc index b42257df..d6cf85d 100644 --- a/chrome/browser/payments/webapps/payment_request_lacros_browsertest.cc +++ b/chrome/browser/payments/webapps/payment_request_lacros_browsertest.cc
@@ -156,7 +156,7 @@ }; IN_PROC_BROWSER_TEST_P(PaymentRequestLacrosBrowserTest, BrowserTab) { - web_app::NavigateToURLAndWait(browser(), GetAppURL()); + web_app::NavigateViaLinkClickToURLAndWait(browser(), GetAppURL()); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); content::RenderFrameHost* render_frame_host = contents->GetPrimaryMainFrame(); @@ -197,7 +197,7 @@ IN_PROC_BROWSER_TEST_P(PaymentRequestLacrosBrowserTest, OutOfScope) { Browser* app_browser = web_app::LaunchWebAppBrowserAndWait(browser()->profile(), app_id()); - web_app::NavigateToURLAndWait( + web_app::NavigateViaLinkClickToURLAndWait( app_browser, https_server()->GetURL("another.test.site", "/")); content::WebContents* contents = app_browser->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index a3e65c1..95d04c4 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1488,9 +1488,6 @@ { key::kQuickAnswersUnitConversionEnabled, quick_answers::prefs::kQuickAnswersUnitConversionEnabled, base::Value::Type::BOOLEAN }, - { key::kChromadToCloudMigrationEnabled, - ash::prefs::kChromadToCloudMigrationEnabled, - base::Value::Type::BOOLEAN }, { key::kProjectorEnabled, ash::prefs::kProjectorAllowByPolicy, base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index ead0e2a..e727ea5 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -657,10 +657,6 @@ */ public static final String PWA_RESTORE_PROMO_STAGE = "Chrome.PwaRestore.PromoStage"; - /** The next timestamp to decide whether to show query tiles. */ - public static final String QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS = - "Chrome.Querytiles.NextDecisionTime"; - /** Whether query tiles should be shown on NTP. Default value is false. */ public static final String QUERY_TILES_SHOW_ON_NTP = "Chrome.Querytiles.ShowOnNTP"; @@ -728,7 +724,6 @@ // Segmentation platform related prefs. public static final String SEGMENTATION_FEED_ACTIVE_USER = "Chrome.Segmentation.FeedActiveUser"; - public static final String SEGMENTATION_SHOW_QUERY_TILES = "Chrome.Segmentation.ShowQueryTiles"; // Tracks which GUIDs there is an active notification for. public static final String SEND_TAB_TO_SELF_ACTIVE_NOTIFICATIONS = @@ -1049,14 +1044,12 @@ PROMO_TIMES_SEEN.pattern(), PWA_RESTORE_APPS_AVAILABLE, PWA_RESTORE_PROMO_STAGE, - QUERY_TILES_NEXT_DISPLAY_DECISION_TIME_MS, QUERY_TILES_SHOW_ON_NTP, QUERY_TILES_SHOW_SEGMENTATION_RESULT, QUERY_TILES_SHOWN_ON_START_SURFACE, REGULAR_TAB_COUNT, SEARCH_ENGINE_CHOICE_OS_CHOICE_APPLIED_TIMESTAMP, SEGMENTATION_FEED_ACTIVE_USER, - SEGMENTATION_SHOW_QUERY_TILES, SETTINGS_SAFETY_CHECK_LAST_RUN_TIMESTAMP, SETTINGS_SAFETY_CHECK_RUN_COUNTER, SHARING_LAST_SHARED_COMPONENT_NAME,
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java index 0e92a0d..f984d19 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
@@ -46,10 +46,12 @@ "Chrome.Querytiles.RecentMvClicks", "Chrome.Querytiles.RecentQueryTileClicks", "Chrome.PriceTracking.PriceDropAlerts", + "Chrome.Querytiles.NextDecisionTime", "Chrome.RequestDesktopSiteExceptionsDowngrade.GlobalSettingEnabled", "Chrome.RequestDesktopSiteExceptionsDowngrade.TabSettingSet", "Chrome.RequestDesktopSiteGlobalSetting.DefaultEnabledShowMessage", "Chrome.RequestDesktopSiteGlobalSetting.OptInMessageShown", + "Chrome.Segmentation.ShowQueryTiles", "Chrome.SigninPromo.NTPImpressions", "Chrome.UMA.OnPreCreateCounter", "Chrome.UMA.OnResumeCounter",
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc index 24fe09f..b25f474 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -3261,9 +3261,7 @@ class GooglePFTestDefaultFieldTrialValue : public GooglePFTest { public: GooglePFTestDefaultFieldTrialValue() { - feature_list_.InitAndEnableFeatureWithParameters( - kSearchNavigationPrefetch, - {{"suggest_prefetch_param", ""}, {"navigation_prefetch_param", ""}}); + feature_list_.InitAndEnableFeature(kSearchNavigationPrefetch); } private:
diff --git a/chrome/browser/printing/web_api/web_printing_browsertest.cc b/chrome/browser/printing/web_api/web_printing_browsertest.cc index 5dec9b6..60a09ae 100644 --- a/chrome/browser/printing/web_api/web_printing_browsertest.cc +++ b/chrome/browser/printing/web_api/web_printing_browsertest.cc
@@ -236,6 +236,16 @@ "separate-documents-uncollated-copies", "separate-documents-collated-copies" ], + "printerResolutionDefault": { + "crossFeedDirectionResolution": 300, + "feedDirectionResolution": 400, + "units": "dots-per-inch", + }, + "printerResolutionSupported": [{ + "crossFeedDirectionResolution": 300, + "feedDirectionResolution": 400, + "units": "dots-per-inch", + }], "printColorModeDefault": "monochrome", "printColorModeSupported": [ "monochrome", "color" ], "printerName": "name",
diff --git a/chrome/browser/printing/web_api/web_printing_mojom_traits.cc b/chrome/browser/printing/web_api/web_printing_mojom_traits.cc index 4155a9c..567607b 100644 --- a/chrome/browser/printing/web_api/web_printing_mojom_traits.cc +++ b/chrome/browser/printing/web_api/web_printing_mojom_traits.cc
@@ -107,6 +107,16 @@ break; } } + { + std::optional<gfx::Size> printer_resolution; + if (!data.ReadPrinterResolution(&printer_resolution)) { + return false; + } + if (printer_resolution) { + settings->set_dpi_xy(printer_resolution->width(), + printer_resolution->height()); + } + } if (auto print_color_mode = data.print_color_mode()) { settings->set_color(PrintColorModeToColorModel(*print_color_mode)); }
diff --git a/chrome/browser/printing/web_api/web_printing_mojom_traits.h b/chrome/browser/printing/web_api/web_printing_mojom_traits.h index 03589a2..ee32bdf 100644 --- a/chrome/browser/printing/web_api/web_printing_mojom_traits.h +++ b/chrome/browser/printing/web_api/web_printing_mojom_traits.h
@@ -13,6 +13,7 @@ #include "mojo/public/cpp/bindings/struct_traits.h" #include "printing/print_settings.h" #include "third_party/blink/public/mojom/printing/web_printing.mojom-forward.h" +#include "ui/gfx/geometry/size.h" namespace mojo { @@ -48,6 +49,10 @@ const std::unique_ptr<printing::PrintSettings>& ptr) { NOTREACHED_NORETURN(); } + static const std::optional<gfx::Size>& printer_resolution( + const std::unique_ptr<printing::PrintSettings>& ptr) { + NOTREACHED_NORETURN(); + } static const std::optional<blink::mojom::WebPrintColorMode>& print_color_mode( const std::unique_ptr<printing::PrintSettings>& ptr) { NOTREACHED_NORETURN();
diff --git a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc index 093f66f..8a8c0bfe 100644 --- a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc +++ b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
@@ -69,6 +69,10 @@ !IsDuplexModeKnown(printer_attributes.duplex_default)) { return false; } + if (!pjt_attributes.dpi_size().IsZero() && + !base::Contains(printer_attributes.dpis, pjt_attributes.dpi_size())) { + return false; + } return true; }
diff --git a/chrome/browser/printing/web_api/web_printing_type_converters.cc b/chrome/browser/printing/web_api/web_printing_type_converters.cc index ded030c2..9c5edee 100644 --- a/chrome/browser/printing/web_api/web_printing_type_converters.cc +++ b/chrome/browser/printing/web_api/web_printing_type_converters.cc
@@ -57,6 +57,12 @@ } } +void ProcessPrinterResolution(const PrinterSemanticCapsAndDefaults& caps, + blink::mojom::WebPrinterAttributes* attributes) { + attributes->printer_resolution_default = caps.default_dpi; + attributes->printer_resolution_supported = caps.dpis; +} + void ProcessPrintColorMode(const PrinterSemanticCapsAndDefaults& caps, blink::mojom::WebPrinterAttributes* attributes) { attributes->print_color_mode_default = @@ -103,6 +109,7 @@ printing::ProcessCopies(capabilities, attributes.get()); printing::ProcessMultipleDocumentHandling(capabilities, attributes.get()); + printing::ProcessPrinterResolution(capabilities, attributes.get()); printing::ProcessPrintColorMode(capabilities, attributes.get()); printing::ProcessSides(capabilities, attributes.get());
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h index 22af958..53b8708 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -40,12 +40,10 @@ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.privacy_sandbox enum class PromptType { kNone = 0, - kNotice = 1, - kConsent = 2, - kM1Consent = 3, - kM1NoticeROW = 4, - kM1NoticeEEA = 5, - kM1NoticeRestricted = 6, + kM1Consent = 1, + kM1NoticeROW = 2, + kM1NoticeEEA = 3, + kM1NoticeRestricted = 4, kMaxValue = kM1NoticeRestricted, };
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h index 52eb459..e71eef720 100644 --- a/chrome/browser/profiles/profile.h +++ b/chrome/browser/profiles/profile.h
@@ -422,6 +422,9 @@ // Returns whether it is an Incognito profile. An Incognito profile is an // off-the-record profile that is used for incognito mode. + // + // TODO(crbug.com/1348572): Also returns true for Lacros in a Ash guest + // profile. bool IsIncognitoProfile() const; // Returns true if this is a primary OffTheRecord profile, which covers the
diff --git a/chrome/browser/quick_delete/android/javatests/src/org/chromium/chrome/browser/quick_delete/QuickDeleteControllerTest.java b/chrome/browser/quick_delete/android/javatests/src/org/chromium/chrome/browser/quick_delete/QuickDeleteControllerTest.java index 5648fee..7a7a1e0c 100644 --- a/chrome/browser/quick_delete/android/javatests/src/org/chromium/chrome/browser/quick_delete/QuickDeleteControllerTest.java +++ b/chrome/browser/quick_delete/android/javatests/src/org/chromium/chrome/browser/quick_delete/QuickDeleteControllerTest.java
@@ -170,6 +170,7 @@ @Test @MediumTest + @DisabledTest(message = "https://crbug.com/1507183") public void testNavigateToTabSwitcher_WhenClickingDelete() throws IOException { openQuickDeleteDialog(); onViewWaiting(withId(R.id.positive_button)).perform(click()); @@ -181,6 +182,7 @@ @Test @MediumTest @Feature({"RenderTest"}) + public void testSnackbarShown_WhenClickingDelete() throws IOException { openQuickDeleteDialog(); onViewWaiting(withId(R.id.positive_button)).perform(click());
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 345535e1..8de5b7a 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -303,6 +303,7 @@ definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] deps = [ "//third_party/polymer/v3_0:library", + "//ui/webui/resources/cr_elements:build_ts", "//ui/webui/resources/js:build_ts", ] extra_deps = [
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index ed42b05..b231390 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -12,7 +12,6 @@ ":html_wrapper_files", ":web_components_local", "./behaviors:copy_js", - "./buttons:copy_js", "./buttons:web_components", "./common_styles:css_wrapper_files", "./dialogs:web_components", @@ -23,7 +22,6 @@ group("closure_compile") { deps = [ "behaviors:closure_compile", - "buttons:closure_compile", "common_styles:closure_compile", "dialogs:closure_compile", "oobe_vars:closure_compile", @@ -98,8 +96,6 @@ ":oobe_types", "./behaviors:oobe_dialog_host_behavior", "./behaviors:oobe_i18n_behavior", - "./buttons:oobe_back_button", - "./buttons:oobe_text_button", "./dialogs:oobe_content_dialog", "//ash/webui/common/resources:cr.m", "//ash/webui/common/resources:load_time_data.m", @@ -288,7 +284,6 @@ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/quick_start_entry_point.js" ] deps = [ "./behaviors:oobe_i18n_behavior", - "./buttons:oobe_icon_button", "./dialogs:oobe_modal_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ]
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js index 79f9825..22cda5ca 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js +++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
@@ -52,7 +52,7 @@ * @param {...string|number} var_args * @return {string} */ - i18n(id, var_args) {} + i18n(id, ...var_args) {} i18nUpdateLocale() {} /**
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/BUILD.gn b/chrome/browser/resources/chromeos/login/components/buttons/BUILD.gn index 0ae88af..e5d95532 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/buttons/BUILD.gn
@@ -2,79 +2,22 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//third_party/closure_compiler/compile_js.gni") -import("//tools/polymer/html_to_js.gni") +import("//tools/polymer/html_to_wrapper.gni") +import("../../login.gni") -js_type_check("closure_compile") { - is_polymer3 = true - deps = [ - ":oobe_back_button", - ":oobe_base_button", - ":oobe_icon_button", - ":oobe_next_button", - ":oobe_text_button", +group("web_components") { + public_deps = [ + ":copy_ts", + ":generate_web_component_html_wrapper_files", ] } -#### Polymer3 / JS Modules libraries - -js_library("oobe_back_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js" ] - deps = [ - ":oobe_base_button", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":web_components" ] -} - -js_library("oobe_base_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.js" ] - deps = [ - "../behaviors:oobe_i18n_behavior", - "//ash/webui/common/resources:assert", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":copy_js" ] -} - -js_library("oobe_next_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js" ] - deps = [ - ":oobe_base_button", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":web_components" ] -} - -js_library("oobe_text_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js" ] - deps = [ - ":oobe_base_button", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":web_components" ] -} - -js_library("oobe_icon_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js" ] - deps = [ - ":oobe_base_button", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":web_components" ] -} - -html_to_js("web_components") { - js_files = [ - "oobe_back_button.js", - "oobe_icon_button.js", - "oobe_next_button.js", - "oobe_text_button.js", - ] +html_to_wrapper("generate_web_component_html_wrapper_files") { + in_files = rebase_path(buttons_html_files, "./components/buttons", ".") } # Copy to target_gen_dir for closure compilation. -copy("copy_js") { - sources = [ "oobe_base_button.js" ] +copy("copy_ts") { + sources = rebase_path(buttons_ts_files, "./components/buttons", ".") outputs = [ "$target_gen_dir/{{source_file_part}}" ] }
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html index f9e68f2..5e240f3 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.html
@@ -36,7 +36,7 @@ --text-color: var(--cros-sys-primary); } </style> -<cr-button id="button" on-click="onClick_" disabled="[[disabled]]" +<cr-button id="button" on-click="onClick" disabled="[[disabled]]" aria-label$="[[labelForAria_]]"> <div class="flex horizontal layout center-justified center"> <iron-icon icon="oobe-20:button-arrow-forward"></iron-icon>
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.ts similarity index 82% rename from chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js rename to chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.ts index b73572c2..f94bea3 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.js +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_back_button.ts
@@ -43,22 +43,21 @@ import '../oobe_vars/oobe_custom_vars.css.js'; import '../oobe_icons.html.js'; -import {html} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {getTemplate} from './oobe_back_button.html.js'; import {OobeBaseButton} from './oobe_base_button.js'; - -/** @polymer */ export class OobeBackButton extends OobeBaseButton { static get is() { - return 'oobe-back-button'; + return 'oobe-back-button' as const; } - static get template() { - return html`{__html_template__}`; + static get template(): HTMLTemplateElement { + return getTemplate(); } - static get properties() { + static override get properties(): PolymerElementProperties { return { /* The ID of the localized string to be used as button text. */ @@ -68,6 +67,14 @@ }, }; } + + textKey: string; +} + +declare global { + interface HTMLElementTagNameMap { + [OobeBackButton.is]: OobeBackButton; + } } customElements.define(OobeBackButton.is, OobeBackButton);
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.js deleted file mode 100644 index b7845c7..0000000 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.js +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {assert} from '//resources/ash/common/assert.js'; -import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../behaviors/oobe_i18n_behavior.js'; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {OobeI18nBehaviorInterface} - */ -const OobeBaseButtonBase = mixinBehaviors([OobeI18nBehavior], PolymerElement); - -/** - * @polymer - */ -export class OobeBaseButton extends OobeBaseButtonBase { - static get properties() { - return { - disabled: { - type: Boolean, - value: false, - reflectToAttribute: true, - }, - - /* The ID of the localized string to be used as button text. - */ - textKey: { - type: String, - }, - - labelForAria: { - type: String, - }, - - labelForAria_: { - type: String, - computed: 'ariaLabel_(labelForAria, locale, textKey)', - }, - }; - } - - focus() { - this.$.button.focus(); - } - - ariaLabel_(labelForAria, locale, textKey) { - if (labelForAria) { - return labelForAria; - } - return (!textKey) ? '' : this.i18n(textKey); - } - - onClick_(e) { - // Just checking here. The event is propagated further. - assert(!this.disabled); - } -} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.ts b/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.ts new file mode 100644 index 0000000..1ca36d8 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_base_button.ts
@@ -0,0 +1,72 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '//resources/cr_elements/cr_button/cr_button.js'; + +import type {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js'; +import {assert} from '//resources/js/assert.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../behaviors/oobe_i18n_behavior.js'; + +export interface OobeBaseButton { + $: { + button: CrButtonElement, + }; +} + +export const OobeBaseButtonBase = + mixinBehaviors([OobeI18nBehavior], PolymerElement) as { + new (): PolymerElement & OobeI18nBehaviorInterface, + }; + +export abstract class OobeBaseButton extends OobeBaseButtonBase { + static get properties(): PolymerElementProperties { + return { + disabled: { + type: Boolean, + value: false, + reflectToAttribute: true, + }, + + /* + * The ID of the localized string to be used as button text. + */ + textKey: { + type: String, + }, + + labelForAria: { + type: String, + }, + + labelForAria_: { + type: String, + computed: 'computeAriaLabel(labelForAria, locale, textKey)', + }, + }; + } + + disabled: boolean; + labelForAria: string; + private labelForAria_: string; + + override focus(): void { + this.$.button.focus(); + } + + private computeAriaLabel( + labelForAria: string, _locale: string, textKey: string): string { + if (labelForAria) { + return labelForAria; + } + return (!textKey) ? '' : this.i18n(textKey); + } + + private onClick(): void { + // Just checking here. The event is propagated further. + assert(!this.disabled); + } +}
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.ts similarity index 68% rename from chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js rename to chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.ts index 1c072ff..f035d30 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.js +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_icon_button.ts
@@ -32,33 +32,52 @@ import '//resources/cr_elements/cr_icons.css.js'; import '//resources/cr_elements/cr_shared_style.css.js'; import '../common_styles/oobe_common_styles.css.js'; -import '../hd_iron_icon.js'; import '../oobe_vars/oobe_custom_vars.css.js'; +import '../hd_iron_icon.js'; -import {html} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import type {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; + +import type {HdIronIcon} from '../hd_iron_icon.js'; import {OobeBaseButton} from './oobe_base_button.js'; +import {getTemplate} from './oobe_icon_button.html.js'; -/** @polymer */ +export interface OobeIconButton extends OobeBaseButton { + $: { + button: CrButtonElement, + icon: HdIronIcon, + }; +} + export class OobeIconButton extends OobeBaseButton { static get is() { - return 'oobe-icon-button'; + return 'oobe-icon-button' as const; } - static get template() { - return html`{__html_template__}`; + static get template(): HTMLTemplateElement { + return getTemplate(); } - static get properties() { + static override get properties(): PolymerElementProperties { return { - icon1x: {type: String, observer: 'updateIconVisibility_'}, + icon1x: {type: String, observer: 'updateIconVisibility'}, icon2x: String, }; } - updateIconVisibility_() { + icon1x: string; + icon2x: string; + + private updateIconVisibility(): void { this.$.icon.hidden = (this.icon1x === undefined || this.icon1x.length == 0); } } +declare global { + interface HTMLElementTagNameMap { + [OobeIconButton.is]: OobeIconButton; + } +} + customElements.define(OobeIconButton.is, OobeIconButton);
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html index 0dc498e..a3f2bf7 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.html
@@ -34,7 +34,7 @@ pointer-events: none; } </style> -<cr-button id="button" on-click="onClick_" disabled="[[disabled]]" +<cr-button id="button" on-click="onClick" disabled="[[disabled]]" aria-label$="[[labelForAria_]]" class="action-button"> <div class="flex horizontal layout center-justified center"> <slot name="text">
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.ts similarity index 82% rename from chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js rename to chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.ts index d0307bf..a016420 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.js +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_next_button.ts
@@ -43,22 +43,21 @@ import '../oobe_vars/oobe_custom_vars.css.js'; import '../oobe_icons.html.js'; -import {html} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {getTemplate} from './oobe_next_button.html.js'; import {OobeBaseButton} from './oobe_base_button.js'; - -/** @polymer */ export class OobeNextButton extends OobeBaseButton { static get is() { - return 'oobe-next-button'; + return 'oobe-next-button' as const; } - static get template() { - return html`{__html_template__}`; + static get template(): HTMLTemplateElement { + return getTemplate(); } - static get properties() { + static override get properties(): PolymerElementProperties { return { /* The ID of the localized string to be used as button text. */ @@ -70,4 +69,10 @@ } } +declare global { + interface HTMLElementTagNameMap { + [OobeNextButton.is]: OobeNextButton; + } +} + customElements.define(OobeNextButton.is, OobeNextButton);
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html index 943088d..c416edc 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.html
@@ -24,7 +24,7 @@ pointer-events: none; } </style> -<cr-button id="button" on-click="onClick_" disabled="[[disabled]]" +<cr-button id="button" on-click="onClick" disabled="[[disabled]]" inverse$="[[inverse]]" aria-label$="[[labelForAriaText_]]" border$="[[border]]"> <div id="container"
diff --git a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.ts similarity index 77% rename from chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js rename to chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.ts index 922bf41..29b9fc7 100644 --- a/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.js +++ b/chrome/browser/resources/chromeos/login/components/buttons/oobe_text_button.ts
@@ -36,35 +36,43 @@ import '../common_styles/oobe_common_styles.css.js'; import '../oobe_vars/oobe_custom_vars.css.js'; -import {html} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {getTemplate} from './oobe_text_button.html.js'; import {OobeBaseButton} from './oobe_base_button.js'; - -/** @polymer */ export class OobeTextButton extends OobeBaseButton { static get is() { - return 'oobe-text-button'; + return 'oobe-text-button' as const; } - static get template() { - return html`{__html_template__}`; + static get template(): HTMLTemplateElement { + return getTemplate(); } - static get properties() { + static override get properties(): PolymerElementProperties { return { inverse: { type: Boolean, - observer: 'onInverseChanged_', + observer: 'onInverseChanged', }, border: Boolean, }; } - onInverseChanged_() { + inverse: boolean; + border: boolean; + + private onInverseChanged(): void { this.$.button.classList.toggle('action-button', this.inverse); } } +declare global { + interface HTMLElementTagNameMap { + [OobeTextButton.is]: OobeTextButton; + } +} + customElements.define(OobeTextButton.is, OobeTextButton);
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn index c67c5b71..f5f1afa 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn
@@ -53,7 +53,6 @@ deps = [ "../behaviors:oobe_focus_behavior", "../behaviors:oobe_i18n_behavior", - "../buttons:oobe_text_button", "//ash/webui/common/resources:cr.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ]
diff --git a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js index 7365915..a751132 100644 --- a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js +++ b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js
@@ -27,7 +27,7 @@ /** * @polymer */ -class HdIronIcon extends PolymerElement { +export class HdIronIcon extends PolymerElement { static get is() { return 'hd-iron-icon'; }
diff --git a/chrome/browser/resources/chromeos/login/login.gni b/chrome/browser/resources/chromeos/login/login.gni index 6868d17..65e8608 100644 --- a/chrome/browser/resources/chromeos/login/login.gni +++ b/chrome/browser/resources/chromeos/login/login.gni
@@ -44,11 +44,6 @@ "components/behaviors/oobe_scrollable_behavior.js", "components/behaviors/login_screen_behavior.js", "components/behaviors/multi_step_behavior.js", - "components/buttons/oobe_back_button.js", - "components/buttons/oobe_base_button.js", - "components/buttons/oobe_icon_button.js", - "components/buttons/oobe_next_button.js", - "components/buttons/oobe_text_button.js", "components/common_styles/cr_card_radio_group_styles.css.js", "components/common_styles/oobe_common_styles.css.js", "components/common_styles/oobe_dialog_host_styles.css.js", @@ -206,7 +201,27 @@ login_screens_html_wrapped_files += [ string_replace(f, ".html", ".html.js") ] } +buttons_ts_files = [ + "components/buttons/oobe_back_button.ts", + "components/buttons/oobe_icon_button.ts", + "components/buttons/oobe_next_button.ts", + "components/buttons/oobe_text_button.ts", +] + +buttons_html_files = [] +foreach(f, buttons_ts_files) { + buttons_html_files += [ string_replace(f, ".ts", ".html") ] +} + +buttons_html_wrapped_files = [] +foreach(f, buttons_html_files) { + buttons_html_wrapped_files += [ string_replace(f, ".html", ".html.ts") ] +} + +buttons_ts_files += [ "components/buttons/oobe_base_button.ts" ] + unconditional_autogenerated_files += oobe_screens_js_files + oobe_screens_html_wrapped_files + common_screens_js_files + common_screens_html_wrapped_files + - login_screens_js_files + login_screens_html_wrapped_files + login_screens_js_files + login_screens_html_wrapped_files + + buttons_ts_files + buttons_html_wrapped_files
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index 990da47..ec4bdc2 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -85,7 +85,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -97,7 +96,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -110,7 +108,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -137,7 +134,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -153,9 +149,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:cr.m", ] @@ -174,9 +167,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "../../components/dialogs:oobe_modal_dialog", @@ -209,8 +199,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] externs_list = @@ -224,8 +212,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -238,7 +224,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -250,7 +235,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -264,9 +248,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:cr.m", ] @@ -301,9 +282,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "../../components/dialogs:oobe_modal_dialog", @@ -323,7 +301,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", ] extra_deps = [ ":web_components" ] } @@ -334,7 +311,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -348,8 +324,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -385,8 +359,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "//ash/webui/common/resources/multidevice_setup:mojo_api", "//ash/webui/common/resources/multidevice_setup:multidevice_setup", "//ash/webui/common/resources/multidevice_setup:multidevice_setup_delegate", @@ -404,9 +376,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:load_time_data.m", ] @@ -424,7 +393,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_modal_dialog", "//ash/webui/common/resources:util", @@ -442,8 +410,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "../../components/dialogs:oobe_modal_dialog", @@ -461,7 +427,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -488,8 +453,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -535,7 +498,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "//ash/webui/common/resources:assert", @@ -551,7 +513,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -563,8 +524,6 @@ deps = [ "../../:login_ui_tools", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "../../components/dialogs:oobe_modal_dialog", @@ -580,7 +539,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -593,7 +551,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:load_time_data.m", ] @@ -606,7 +563,6 @@ "../../components:display_manager_types", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "//ash/webui/common/resources:assert", @@ -622,8 +578,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:load_time_data.m", ] @@ -636,7 +590,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -648,7 +601,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -664,8 +616,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:parse_html_subset", ]
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js index 2fefcee..30b9d8bc 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js +++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js
@@ -10,6 +10,7 @@ import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; import '../../components/common_styles/oobe_dialog_host_styles.css.js'; +import '../../components/buttons/oobe_text_button.js'; import {assert, assertNotReached} from '//resources/ash/common/assert.js'; import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; @@ -19,7 +20,6 @@ import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; import {OobeDialogHostBehavior} from '../../components/behaviors/oobe_dialog_host_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OobeAdaptiveDialog} from '../../components/dialogs/oobe_adaptive_dialog.js'; import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; import {OobeAppsList} from '../../components/oobe_apps_list.js'; @@ -60,7 +60,6 @@ * appsDialog: OobeAdaptiveDialog, * appView: WebView, * appsList: OobeAppsList, - * installButton: OobeTextButton, * }} */ RecommendAppsElementBase.$;
diff --git a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js index 901d68c2..81016d8a 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js +++ b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js
@@ -12,13 +12,13 @@ import '../../components/common_styles/oobe_common_styles.css.js'; import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {OobeDialogHostBehavior} from '../../components/behaviors/oobe_dialog_host_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OOBE_UI_STATE, SCREEN_GAIA_SIGNIN} from '../../components/display_manager_types.js'; import {OobeTypes} from '../../components/oobe_types.js'; @@ -36,13 +36,6 @@ PolymerElement); /** - * @typedef {{ - * actionButton: OobeTextButton, - * }} - */ -SigninFatalErrorBase.$; - -/** * Data that is passed to the screen during onBeforeShow. * @typedef {{ * errorState: OobeTypes.FatalErrorCode,
diff --git a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn index c1ada08..be375f11 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
@@ -43,8 +43,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -79,8 +77,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_modal_dialog", ] extra_deps = [ ":web_components" ] @@ -92,8 +88,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_modal_dialog", ] extra_deps = [ ":web_components" ] @@ -110,8 +104,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_modal_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -124,8 +116,6 @@ deps = [ "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ]
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn index 4f0d2be..5f9bf05 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -53,8 +53,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -67,8 +65,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -83,8 +79,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -97,7 +91,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -113,9 +106,6 @@ "../../components:keyboard_utils_oobe", "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", "../../components/dialogs:oobe_modal_dialog", @@ -174,8 +164,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] @@ -193,7 +181,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_modal_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -212,8 +199,6 @@ "../../components:oobe_cr_lottie", "../../components:quick_start_entry_point", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_icon_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_modal_dialog", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ]
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js index d95c0846..bd7fa9e4 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js
@@ -16,13 +16,13 @@ import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; import '../../components/dialogs/oobe_loading_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {getTemplate} from './enable_debugging.html.js'; @@ -53,10 +53,7 @@ /** * @typedef {{ - * removeProtectionProceedButton: OobeTextButton, * password: CrInputElement, - * okButton: OobeTextButton, - * errorOkButton: OobeTextButton * }} */ EnableDebuggingBase.$;
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn index 7dc502df..87bc30bd 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn
@@ -67,7 +67,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -81,7 +80,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:load_time_data.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -99,8 +97,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -116,8 +112,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -131,7 +125,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -143,8 +136,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -157,8 +148,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", "../../components/dialogs:oobe_loading_dialog", ] @@ -171,8 +160,6 @@ "../../components/behaviors:login_screen_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", "../../components/dialogs:oobe_adaptive_dialog", ] extra_deps = [ ":web_components" ] @@ -186,9 +173,6 @@ "../../components/behaviors:multi_step_behavior", "../../components/behaviors:oobe_dialog_host_behavior", "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_next_button", - "../../components/buttons:oobe_text_button", "../../components/dialogs:oobe_adaptive_dialog", "//ash/webui/common/resources:cr.m", ]
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js index 2ccbc991..98a219cb 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js +++ b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js
@@ -12,6 +12,7 @@ import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; import '../../components/dialogs/oobe_loading_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -19,7 +20,6 @@ import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; import {addSubmitListener} from '../../login_ui_tools.js'; @@ -46,7 +46,6 @@ /** * @typedef {{ * oldPasswordInput: CrInputElement, - * proceedAnyway: OobeTextButton, * }} */ EnterOldPasswordBase.$;
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/factor_setup_success.js b/chrome/browser/resources/chromeos/login/screens/osauth/factor_setup_success.js index 296c8bae..fb5c9222 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/factor_setup_success.js +++ b/chrome/browser/resources/chromeos/login/screens/osauth/factor_setup_success.js
@@ -12,13 +12,13 @@ import '../../components/common_styles/oobe_common_styles.css.js'; import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {OobeDialogHostBehavior} from '../../components/behaviors/oobe_dialog_host_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; /** @@ -31,13 +31,6 @@ [OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior], PolymerElement); -/** - * @typedef {{ - * retryButton: OobeTextButton, - * }} - */ -FactorSetupSuccessBase.$; - // LINT.IfChange /** * Set of modified factors, determine title/subtitle.
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/gaia_password_changed.js b/chrome/browser/resources/chromeos/login/screens/osauth/gaia_password_changed.js index 3531cdf..1858420 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/gaia_password_changed.js +++ b/chrome/browser/resources/chromeos/login/screens/osauth/gaia_password_changed.js
@@ -16,6 +16,7 @@ import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; import '../../components/dialogs/oobe_loading_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -23,7 +24,6 @@ import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; import {addSubmitListener} from '../../login_ui_tools.js'; @@ -52,7 +52,6 @@ /** * @typedef {{ * oldPasswordInput: CrInputElement, - * proceedAnyway: OobeTextButton, * }} */ GaiaPasswordChangedBase.$;
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/osauth_error.js b/chrome/browser/resources/chromeos/login/screens/osauth/osauth_error.js index cdfb54a..84942bab 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/osauth_error.js +++ b/chrome/browser/resources/chromeos/login/screens/osauth/osauth_error.js
@@ -12,13 +12,13 @@ import '../../components/common_styles/oobe_common_styles.css.js'; import '../../components/common_styles/oobe_dialog_host_styles.css.js'; import '../../components/dialogs/oobe_adaptive_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; import {OobeDialogHostBehavior} from '../../components/behaviors/oobe_dialog_host_behavior.js'; import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; /** @@ -32,13 +32,6 @@ PolymerElement); /** - * @typedef {{ - * retryButton: OobeTextButton, - * }} - */ -OSAuthErrorBase.$; - -/** * @polymer */ class OSAuthErrorScreen extends OSAuthErrorBase {
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc index d8fbd14..45cc803 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -39,6 +39,7 @@ #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/password_reuse_detector.h" #include "components/password_manager/core/browser/password_store/mock_password_store_interface.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/safe_browsing/content/browser/password_protection/password_protection_commit_deferring_condition.h" @@ -252,6 +253,18 @@ if (base::FeatureList::IsEnabled( password_manager::features::kEnablePasswordsAccountStorage)) { +#if BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/1495626): Remove once SetUsesSplitStoresAndUPMForLocal() + // is implemented. + if (base::FeatureList::IsEnabled( + password_manager::features:: + kUnifiedPasswordManagerLocalPasswordsAndroidNoMigration)) { + profile()->GetPrefs()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>(password_manager::prefs:: + UseUpmLocalAndSeparateStoresState::kOn)); + } +#endif account_password_store_ = base::WrapRefCounted( static_cast<password_manager::MockPasswordStoreInterface*>( AccountPasswordStoreFactory::GetInstance()
diff --git a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java index ea0279e..9d99e79 100644 --- a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java +++ b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java
@@ -81,6 +81,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.Optional; /** Unit tests for {@link SafetyCheckMediator}. */ @RunWith(ParameterizedRobolectricTestRunner.class) @@ -204,7 +205,8 @@ return null; }) .when(mPasswordCheckupHelper) - .getBreachedCredentialsCount(anyInt(), any(), any(Callback.class), any()); + .getBreachedCredentialsCount( + anyInt(), any(Optional.class), any(Callback.class), any()); setPasswordCountOnStoreBridge(passwordCount); } else { doAnswer( @@ -244,7 +246,7 @@ }) .when(mPasswordCheckupHelper) .getBreachedCredentialsCount( - anyInt(), any(), any(Callback.class), any(Callback.class)); + anyInt(), any(Optional.class), any(Callback.class), any(Callback.class)); } private void captureRunPasswordCheckCallback() { @@ -257,7 +259,7 @@ }) .when(mPasswordCheckupHelper) .runPasswordCheckupInBackground( - anyInt(), any(), any(Callback.class), any(Callback.class)); + anyInt(), any(Optional.class), any(Callback.class), any(Callback.class)); } private void configureMockSyncService() {
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc index be8d2811..b27dd4ede 100644 --- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc +++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -45,7 +45,6 @@ #include "components/segmentation_platform/embedder/default_model/intentional_user_model.h" #include "components/segmentation_platform/embedder/default_model/most_visited_tiles_user.h" #include "components/segmentation_platform/embedder/default_model/power_user_segment.h" -#include "components/segmentation_platform/embedder/default_model/query_tiles_model.h" #include "components/segmentation_platform/embedder/default_model/tablet_productivity_user_model.h" #endif @@ -157,7 +156,6 @@ configs.emplace_back(GetConfigForContextualPageActions(context)); } - configs.emplace_back(QueryTilesModel::GetConfig()); configs.emplace_back(ChromeStartModelV2::GetConfig()); configs.emplace_back(IntentionalUserModel::GetConfig()); configs.emplace_back(PowerUserSegment::GetConfig());
diff --git a/chrome/browser/sync/test/integration/web_apps_sync_test_base.cc b/chrome/browser/sync/test/integration/web_apps_sync_test_base.cc index bdbc42c..4dd8791 100644 --- a/chrome/browser/sync/test/integration/web_apps_sync_test_base.cc +++ b/chrome/browser/sync/test/integration/web_apps_sync_test_base.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/sync/test/integration/web_apps_sync_test_base.h" #include "base/containers/extend.h" +#include "chrome/common/chrome_features.h" #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/apps/link_capturing/link_capturing_features.h" @@ -12,7 +13,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_features.h" -#include "chrome/common/chrome_features.h" #include "chromeos/ash/components/standalone_browser/feature_refs.h" #endif @@ -30,6 +30,9 @@ #if BUILDFLAG(IS_CHROMEOS) // TODO(crbug.com/1357905): Update test driver to work with new UI. disabled_features.push_back(apps::features::kLinkCapturingUiUpdate); +#else + // TOOD(b/313492499): Update test driver to work with new intent picker UI. + disabled_features.push_back(features::kDesktopPWAsLinkCapturing); #endif #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 3bb8677..346b7a2 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -4812,6 +4812,8 @@ "autofill/save_update_address_profile_icon_controller.cc", "autofill/save_update_address_profile_icon_controller.h", "bubble_anchor_util.h", + "commerce/commerce_page_action_controller.cc", + "commerce/commerce_page_action_controller.h", "commerce/commerce_ui_tab_helper.cc", "commerce/commerce_ui_tab_helper.h", "dialogs/outdated_upgrade_bubble.cc",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java index 7768314a5..30f69ea 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -105,7 +105,6 @@ private final @ColorInt int mDropdownIncognitoBackgroundColor; private final @ColorInt int mSuggestionStandardBackgroundColor; private final @ColorInt int mSuggestionIncognitoBackgroundColor; - private boolean mShortCircuitUnfocusAnimation; /** * Creates {@link LocationBarCoordinator} and its subcoordinator: {@link @@ -500,8 +499,6 @@ @Override public void loadUrl(String url, int transition, long inputStart, boolean openInNewTab) { - mShortCircuitUnfocusAnimation = - isUrlBarFocused() && OmniboxFeatures.shouldShortCircuitUnfocusAnimation(); mLocationBarMediator.loadUrl(url, transition, inputStart, openInNewTab); } @@ -753,19 +750,6 @@ mLocationBarMediator.setShouldShowButtonsWhenUnfocusedForTablet(shouldShowButtons); } - /** - * Whether the unfocus animation should be skipped to speed up navigation. If short circuiting - * occurs, the caller should immediately call {@link #onUnfocusAnimationShortCircuited()}. - */ - public boolean shouldShortCircuitUnfocusAnimation() { - return mShortCircuitUnfocusAnimation; - } - - /** Call to report that the focus animation was short circuited. */ - public void onUnfocusAnimationShortCircuited() { - mShortCircuitUnfocusAnimation = false; - } - // End tablet-specific methods. public void setVoiceRecognitionHandlerForTesting(
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxFeatures.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxFeatures.java index f3b697e..2d30fda 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxFeatures.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxFeatures.java
@@ -127,29 +127,16 @@ return ChromeFeatureList.sOmniboxMatchToolbarAndStatusBarColor.isEnabled(); } - /** Whether Journeys suggestions should be shown as an action chip. */ - public static boolean isJourneysActionChipEnabled() { - return ChromeFeatureList.sOmniboxJourneysActionChipFlag.isEnabled(); - } - /** Whether Journeys suggestions should be shown in a dedicated row. */ public static boolean isJourneysRowUiEnabled() { return ChromeFeatureList.sOmniboxHistoryClusterProvider.isEnabled(); } /** - * Returns whether suggestion resources should be cached directly instead of relying on Android - * system caching. - */ - public static boolean shouldCacheSuggestionResources() { - return ChromeFeatureList.sOmniboxCacheSuggestionResources.isEnabled(); - } - - /** * Returns whether the omnibox's recycler view pool should be pre-warmed prior to initial use. */ public static boolean shouldPreWarmRecyclerViewPool() { - return !isLowMemoryDevice() && ChromeFeatureList.sOmniboxWarmRecycledViewPool.isEnabled(); + return !isLowMemoryDevice(); } /** @@ -174,14 +161,6 @@ } /** - * Whether the omnibox unfocus animation should be short-circuited when navigating to a - * suggestion in order to speed up navigation. - */ - public static boolean shouldShortCircuitUnfocusAnimation() { - return ChromeFeatureList.sShortCircuitUnfocusAnimation.isEnabled(); - } - - /** * Returns whether a touch down event on a search suggestion should send a signal to prefetch * the corresponding page. */
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java index 732ebfc..e029f462 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxResourceProvider.java
@@ -48,16 +48,13 @@ */ public static @NonNull Drawable getDrawable(Context context, @DrawableRes int res) { ThreadUtils.assertOnUiThread(); - boolean cacheResources = OmniboxFeatures.shouldCacheSuggestionResources(); - ConstantState constantState = cacheResources ? sDrawableCache.get(res, null) : null; + ConstantState constantState = sDrawableCache.get(res, null); if (constantState != null) { return constantState.newDrawable(context.getResources()); } Drawable drawable = AppCompatResources.getDrawable(context, res); - if (cacheResources) { - sDrawableCache.put(res, drawable.getConstantState()); - } + sDrawableCache.put(res, drawable.getConstantState()); return drawable; } @@ -69,13 +66,10 @@ */ public static @NonNull String getString(Context context, @StringRes int res, Object... args) { ThreadUtils.assertOnUiThread(); - boolean cacheResources = OmniboxFeatures.shouldCacheSuggestionResources(); - String string = cacheResources ? sStringCache.get(res, null) : null; + String string = sStringCache.get(res, null); if (string == null) { string = context.getResources().getString(res); - if (cacheResources) { - sStringCache.put(res, string); - } + sStringCache.put(res, string); } return args.length == 0
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPoolTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPoolTest.java index e4709a9..f17bccb 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPoolTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPoolTest.java
@@ -12,7 +12,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; import android.content.Context; import android.os.Handler; @@ -36,7 +35,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.omnibox.suggestions.OmniboxSuggestionUiType; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -113,22 +111,6 @@ } } - @DisableFeatures(ChromeFeatureList.OMNIBOX_WARM_RECYCLED_VIEW_POOL) - @Test - public void testCreateViews_featureDisabled() { - doAnswer( - (invocation -> { - ((Runnable) invocation.getArgument(0)).run(); - return null; - })) - .when(mHandler) - .postDelayed(any(Runnable.class), anyLong()); - mPool.onNativeInitialized(); - - verifyNoMoreInteractions(mAdapter); - verifyNoMoreInteractions(mHandler); - } - @EnableFeatures(ChromeFeatureList.OMNIBOX_WARM_RECYCLED_VIEW_POOL) @Test public void testStopCreating() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java index 9e2c110..ebbd5e4 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinder.java
@@ -31,7 +31,6 @@ import androidx.core.view.ViewCompat; import androidx.core.widget.ImageViewCompat; -import org.chromium.chrome.browser.omnibox.OmniboxFeatures; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.styles.OmniboxDrawableState; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; @@ -251,14 +250,9 @@ /** * Access the BaseSuggestionViewMetadata for the given view, creating and attaching a new one if - * none is currently associated. Returns an unattached metadata if {@link - * OmniboxFeatures#shouldCacheSuggestionResources} returns false. + * none is currently associated. */ private static @NonNull BaseSuggestionViewMetadata ensureViewMetadata(View view) { - if (!OmniboxFeatures.shouldCacheSuggestionResources()) { - return new BaseSuggestionViewMetadata(); - } - BaseSuggestionViewMetadata metadata = (BaseSuggestionViewMetadata) view.getTag(R.id.base_suggestion_view_metadata_key); if (metadata == null) {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 17e4dcf..aae7fad 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -2438,9 +2438,8 @@ } }); mUrlFocusLayoutAnimator.start(); - if (!hasFocus && mLocationBar.shouldShortCircuitUnfocusAnimation()) { + if (!hasFocus) { TraceEvent.instant("ToolbarPhone.ShortCircuitUnfocusAnimation"); - mLocationBar.onUnfocusAnimationShortCircuited(); mUrlFocusLayoutAnimator.end(); } TraceEvent.end("ToolbarPhone.triggerUrlFocusAnimation");
diff --git a/chrome/browser/ui/ash/capture_mode/recording_service_browsertest.cc b/chrome/browser/ui/ash/capture_mode/recording_service_browsertest.cc index 29e8db1..5865951 100644 --- a/chrome/browser/ui/ash/capture_mode/recording_service_browsertest.cc +++ b/chrome/browser/ui/ash/capture_mode/recording_service_browsertest.cc
@@ -346,7 +346,14 @@ VerifyVideoFileAndDelete(video_path); } -IN_PROC_BROWSER_TEST_F(RecordingServiceBrowserTest, InvalidDownloadsPath) { +// TODO(b/273521375): Flaky on ChromeOS MSAN builds. +#if defined(MEMORY_SANITIZER) +#define MAYBE_InvalidDownloadsPath DISABLED_InvalidDownloadsPath +#else +#define MAYBE_InvalidDownloadsPath InvalidDownloadsPath +#endif +IN_PROC_BROWSER_TEST_F(RecordingServiceBrowserTest, + MAYBE_InvalidDownloadsPath) { auto* download_prefs = DownloadPrefs::FromBrowserContext(browser()->profile()); const base::FilePath removable_path =
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index c2d1964d3..b23f9823 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -570,8 +570,6 @@ void ShowPrivacySandboxAdMeasurementSettings(Browser* browser) { base::RecordAction(UserMetricsAction("Options_ShowPrivacySandbox")); - CHECK( - base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4)); ShowSettingsSubPage(browser, kPrivacySandboxMeasurementSubpage); }
diff --git a/chrome/browser/ui/color/material_tab_strip_color_mixer.cc b/chrome/browser/ui/color/material_tab_strip_color_mixer.cc index 93a18e5f..7cd4e69 100644 --- a/chrome/browser/ui/color/material_tab_strip_color_mixer.cc +++ b/chrome/browser/ui/color/material_tab_strip_color_mixer.cc
@@ -55,7 +55,7 @@ mixer[kColorTabBackgroundSelectedHoverFrameInactive] = { ui::GetResultingPaintColor(ui::kColorSysStateHoverDimBlendProtection, kColorTabBackgroundSelectedFrameInactive)}; - mixer[kColorTabDiscardRingFrameActive] = {ui::kColorSysStateDisabled}; + mixer[kColorTabDiscardRingFrameActive] = {ui::kColorSysOutline}; mixer[kColorTabDiscardRingFrameInactive] = {kColorTabDiscardRingFrameActive}; mixer[kColorTabForegroundActiveFrameActive] = {ui::kColorSysOnSurface}; mixer[kColorTabForegroundActiveFrameInactive] = {
diff --git a/chrome/browser/ui/commerce/commerce_page_action_controller.cc b/chrome/browser/ui/commerce/commerce_page_action_controller.cc new file mode 100644 index 0000000..df8ce16 --- /dev/null +++ b/chrome/browser/ui/commerce/commerce_page_action_controller.cc
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/commerce/commerce_page_action_controller.h" + +#include "url/gurl.h" + +namespace commerce { + +CommercePageActionController::CommercePageActionController( + base::RepeatingCallback<void()> host_update_callback) + : host_update_callback_(host_update_callback) {} + +CommercePageActionController::~CommercePageActionController() = default; + +void CommercePageActionController::NotifyHost() { + host_update_callback_.Run(); +} + +} // namespace commerce
diff --git a/chrome/browser/ui/commerce/commerce_page_action_controller.h b/chrome/browser/ui/commerce/commerce_page_action_controller.h new file mode 100644 index 0000000..0db96df --- /dev/null +++ b/chrome/browser/ui/commerce/commerce_page_action_controller.h
@@ -0,0 +1,48 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_COMMERCE_COMMERCE_PAGE_ACTION_CONTROLLER_H_ +#define CHROME_BROWSER_UI_COMMERCE_COMMERCE_PAGE_ACTION_CONTROLLER_H_ + +#include <optional> + +#include "base/functional/callback.h" + +class GURL; + +namespace commerce { + +class CommercePageActionController { + public: + explicit CommercePageActionController( + base::RepeatingCallback<void()> host_update_callback); + CommercePageActionController(const CommercePageActionController&) = delete; + CommercePageActionController& operator=(const CommercePageActionController&) = + delete; + virtual ~CommercePageActionController(); + + // Returns whether the UI should show for the current navigation. A nullopt + // implies that the UI does not have enough information to definitively + // respond true or false. + virtual std::optional<bool> ShouldShowForNavigation() = 0; + + // Whether the page action wants to expand, based on its own rules. + virtual bool WantsExpandedUi() = 0; + + // Automatically called when a relevant event on the active web contents + // happens. + virtual void ResetForNewNavigation(const GURL& url) = 0; + + protected: + // Notify the host that is coordinating the icons that some state in the + // implementation has changed. + void NotifyHost(); + + private: + base::RepeatingCallback<void()> host_update_callback_; +}; + +} // namespace commerce + +#endif // CHROME_BROWSER_UI_COMMERCE_COMMERCE_PAGE_ACTION_CONTROLLER_H_
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc index d7384563..44b97de 100644 --- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc +++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -111,7 +111,7 @@ using web_app::kEnabled; using web_app::kNotPresent; using web_app::NavigateAndCheckForToolbar; -using web_app::NavigateToURLAndWait; +using web_app::NavigateViaLinkClickToURLAndWait; namespace { @@ -820,7 +820,7 @@ GURL url = embedded_test_server()->GetURL("foo.com", "/iframe.html"); content::WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); - NavigateToURLAndWait(browser(), url); + NavigateViaLinkClickToURLAndWait(browser(), url); // Navigate the subframe to a URL that redirects to a URL in the hosted app's // web extent.
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc index 8b8b459..59f01fe 100644 --- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc +++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper_browsertest.cc
@@ -162,10 +162,6 @@ switch (test_prompt_type_) { case PrivacySandboxService::PromptType::kNone: [[fallthrough]]; - case PrivacySandboxService::PromptType::kNotice: - [[fallthrough]]; - case PrivacySandboxService::PromptType::kConsent: - NOTREACHED_NORETURN(); case PrivacySandboxService::PromptType::kM1Consent: [[fallthrough]]; case PrivacySandboxService::PromptType::kM1NoticeROW:
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index 62b5a00..5d74ae1 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -401,14 +401,12 @@ bool privacy_sandbox_dialog_required = false; if (privacy_sandbox_service) { switch (privacy_sandbox_service->GetRequiredPromptType()) { - case PrivacySandboxService::PromptType::kConsent: case PrivacySandboxService::PromptType::kM1Consent: case PrivacySandboxService::PromptType::kM1NoticeEEA: case PrivacySandboxService::PromptType::kM1NoticeROW: case PrivacySandboxService::PromptType::kM1NoticeRestricted: privacy_sandbox_dialog_required = true; break; - case PrivacySandboxService::PromptType::kNotice: case PrivacySandboxService::PromptType::kNone: break; }
diff --git a/chrome/browser/ui/tabs/organization/request_factory.cc b/chrome/browser/ui/tabs/organization/request_factory.cc index 945def4..20cd233 100644 --- a/chrome/browser/ui/tabs/organization/request_factory.cc +++ b/chrome/browser/ui/tabs/organization/request_factory.cc
@@ -30,9 +30,9 @@ namespace { bool CanUseOptimizationGuide(Profile* profile) { - return OptimizationGuideKeyedServiceFactory::GetForProfile(profile) && - base::FeatureList::IsEnabled( - optimization_guide::features::kOptimizationGuideModelExecution); + return base::FeatureList::IsEnabled( + optimization_guide::features::kOptimizationGuideModelExecution) && + OptimizationGuideKeyedServiceFactory::GetForProfile(profile); } void OnLogResults(Profile* profile,
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc b/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc index 6cfb81a..3fd072a1 100644 --- a/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc +++ b/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc
@@ -5,10 +5,13 @@ #include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h" #include "base/no_destructor.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/tabs/organization/tab_organization_service.h" #include "chrome/browser/ui/ui_features.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/optimization_guide/core/model_quality/feature_type_map.h" +#include "components/optimization_guide/core/optimization_guide_features.h" TabOrganizationServiceFactory::TabOrganizationServiceFactory() : ProfileKeyedServiceFactory( @@ -16,7 +19,12 @@ ProfileSelections::Builder() .WithRegular(ProfileSelection::kOriginalOnly) .WithGuest(ProfileSelection::kOriginalOnly) - .Build()) {} + .Build()) { + if (base::FeatureList::IsEnabled( + optimization_guide::features::kOptimizationGuideModelExecution)) { + DependsOn(OptimizationGuideKeyedServiceFactory::GetInstance()); + } +} TabOrganizationServiceFactory::~TabOrganizationServiceFactory() = default;
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc index 906c69b5..23b5eb6 100644 --- a/chrome/browser/ui/toolbar/app_menu_model.cc +++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -1588,9 +1588,11 @@ if (AddGlobalErrorMenuItems() || need_separator) AddSeparator(ui::NORMAL_SEPARATOR); - AddItemWithStringId(IDC_NEW_TAB, browser_->profile()->IsIncognitoProfile() - ? IDS_NEW_INCOGNITO_TAB - : IDS_NEW_TAB); + AddItemWithStringId(IDC_NEW_TAB, + browser_->profile()->IsIncognitoProfile() && + !browser_->profile()->IsGuestSession() + ? IDS_NEW_INCOGNITO_TAB + : IDS_NEW_TAB); AddItemWithStringId(IDC_NEW_WINDOW, IDS_NEW_WINDOW); // This menu item is not visible in Guest Mode. If incognito mode is not
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc index d210fbb6..7b901cc 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view_interactive_uitest.cc
@@ -288,8 +288,9 @@ WaitForShow(kPriceTrackingBubbleDialogId)); } +// TODO(crbug.com/1510975): fix and re-enable for CR2023. IN_PROC_BROWSER_TEST_F(PriceTrackingIconViewInteractiveTest, - EnablePriceTrackOnPress) { + DISABLED_EnablePriceTrackOnPress) { browser()->profile()->GetPrefs()->SetBoolean( prefs::kShouldShowPriceTrackFUEBubble, false); mock_shopping_service_->SetIsSubscribedCallbackValue(false);
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_browsertest_win.cc b/chrome/browser/ui/views/frame/browser_frame_view_browsertest_win.cc index 9272f3d..fbe481cf 100644 --- a/chrome/browser/ui/views/frame/browser_frame_view_browsertest_win.cc +++ b/chrome/browser/ui/views/frame/browser_frame_view_browsertest_win.cc
@@ -303,7 +303,7 @@ // during testing. app_browser->app_controller()->SetOnUpdateDraggableRegionForTesting( loop.QuitClosure()); - web_app::NavigateToURLAndWait(app_browser, start_url); + web_app::NavigateViaLinkClickToURLAndWait(app_browser, start_url); loop.Run(); navigation_observer.WaitForNavigationFinished();
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc index 563adc2..5c87bd3 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
@@ -297,7 +297,7 @@ Browser* app_browser = web_app::LaunchWebAppBrowser(browser()->profile(), app_id); - web_app::NavigateToURLAndWait(app_browser, start_url); + web_app::NavigateViaLinkClickToURLAndWait(app_browser, start_url); browser_view_ = BrowserView::GetBrowserViewForBrowser(app_browser); views::NonClientFrameView* frame_view =
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc index 1931607..dab94d1 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest.cc
@@ -38,12 +38,7 @@ class IntentPickerBrowserTest : public web_app::WebAppNavigationBrowserTest { public: - IntentPickerBrowserTest() { - std::vector<base::test::FeatureRef> disabled_features = { - // TODO(crbug.com/1001189): Stop disabling Paint Holding. - blink::features::kPaintHolding}; - scoped_feature_list_.InitWithFeatures({}, disabled_features); - } + IntentPickerBrowserTest() = default; template <typename Action> testing::AssertionResult DoAndWaitForIntentPickerIconUpdate(Action action) { @@ -116,9 +111,6 @@ EXPECT_EQ(test_web_app_id(), app_info[0].launch_name); EXPECT_EQ(GetAppName(), app_info[0].display_name); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; // Tests to do with the behavior of the intent picker icon in the omnibox. Does @@ -127,7 +119,31 @@ // separately in intent_chip_button_browsertest.cc. class IntentPickerIconBrowserTest : public IntentPickerBrowserTest, - public ::testing::WithParamInterface<std::string> {}; + public ::testing::WithParamInterface<std::tuple<std::string, bool>> { + public: + // TODO(crbug.com/1001189): Stop disabling Paint Holding. + IntentPickerIconBrowserTest() { + feature_list_.InitWithFeaturesAndParameters( + apps::test::GetFeaturesToEnableLinkCapturingUX( + /*override_captures_by_default=*/IsLinkCapturingEnabled()), + {blink::features::kPaintHolding}); + } + + bool IsLinkCapturingEnabled() { return std::get<bool>(GetParam()); } + + std::string rel() { return std::get<std::string>(GetParam()); } + + bool IsDefaultOnEnabled() { +#if BUILDFLAG(IS_CHROMEOS) + return false; +#else + return IsLinkCapturingEnabled(); +#endif // BUILDFLAG(IS_CHROMEOS) + } + + private: + base::test::ScopedFeatureList feature_list_; +}; // Tests that clicking a link from a tabbed browser to outside the scope of an // installed app does not show the intent picker. @@ -139,7 +155,7 @@ https_server().GetURL(GetAppUrlHost(), GetOutOfScopeUrlPath()); NavigateToLaunchingPage(browser()); ASSERT_TRUE(ExpectLinkClickNotCapturedIntoAppBrowser( - browser(), out_of_scope_url, GetParam())); + browser(), out_of_scope_url, rel())); views::Button* intent_picker_view = GetIntentPickerIcon(); EXPECT_FALSE(intent_picker_view->GetVisible()); @@ -159,6 +175,9 @@ #endif IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, MAYBE_NavigationToInScopeLinkShowsIntentPicker) { + if (IsDefaultOnEnabled()) { + GTEST_SKIP() << "Default On will launch app by default"; + } InstallTestWebApp(); const GURL in_scope_url = @@ -168,8 +187,8 @@ base::RunLoop run_loop; tab_helper->SetIconUpdateCallbackForTesting(run_loop.QuitClosure()); - ASSERT_TRUE(ExpectLinkClickNotCapturedIntoAppBrowser(browser(), in_scope_url, - GetParam())); + ASSERT_TRUE( + ExpectLinkClickNotCapturedIntoAppBrowser(browser(), in_scope_url, rel())); run_loop.Run(); views::Button* intent_picker_icon = GetIntentPickerIcon(); @@ -197,9 +216,9 @@ views::Button* intent_picker_icon = GetIntentPickerIcon(); // OpenNewTab opens a new tab and focus on the new tab. - OpenNewTab(in_scope_url, /*rel=*/GetParam()); + OpenNewTab(in_scope_url, /*rel=*/rel()); EXPECT_TRUE(intent_picker_icon->GetVisible()); - OpenNewTab(out_of_scope_url, /*rel=*/GetParam()); + OpenNewTab(out_of_scope_url, /*rel=*/rel()); EXPECT_FALSE(intent_picker_icon->GetVisible()); chrome::SelectPreviousTab(browser()); @@ -209,7 +228,7 @@ } // Tests that the navigation in iframe doesn't affect intent picker icon -IN_PROC_BROWSER_TEST_F(IntentPickerIconBrowserTest, +IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, IframeNavigationDoesNotAffectIntentPicker) { InstallTestWebApp(); @@ -259,11 +278,11 @@ OpenNewTab(in_scope_url); EXPECT_TRUE(intent_picker_icon->GetVisible()); - ASSERT_TRUE(DoAndWaitForIntentPickerIconUpdate([this, redirect_url, - out_of_scope_url] { - ClickLinkAndWaitForURL(GetWebContents(), redirect_url, out_of_scope_url, - LinkTarget::SELF, GetParam()); - })); + ASSERT_TRUE(DoAndWaitForIntentPickerIconUpdate( + [this, redirect_url, out_of_scope_url] { + ClickLinkAndWaitForURL(GetWebContents(), redirect_url, out_of_scope_url, + LinkTarget::SELF, rel()); + })); EXPECT_FALSE(intent_picker_icon->GetVisible()); } @@ -277,7 +296,7 @@ #define MAYBE_DoNotShowIconAndBubbleOnServicePages \ DoNotShowIconAndBubbleOnServicePages #endif -IN_PROC_BROWSER_TEST_F(IntentPickerIconBrowserTest, +IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, MAYBE_DoNotShowIconAndBubbleOnServicePages) { InstallTestWebApp(); @@ -311,7 +330,7 @@ #else #define MAYBE_DoNotShowIconOnErrorPages DoNotShowIconOnErrorPages #endif // BUILDFLAG(IS_MAC) -IN_PROC_BROWSER_TEST_F(IntentPickerIconBrowserTest, +IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, MAYBE_DoNotShowIconOnErrorPages) { InstallTestWebApp(); InstallTestWebApp("www.google.com", "/"); @@ -348,7 +367,7 @@ #else #define MAYBE_PushStateURLChangeTest PushStateURLChangeTest #endif -IN_PROC_BROWSER_TEST_F(IntentPickerIconBrowserTest, +IN_PROC_BROWSER_TEST_P(IntentPickerIconBrowserTest, MAYBE_PushStateURLChangeTest) { // Note: The test page is served from embedded_test_server() as https_server() // always returns empty responses. @@ -378,17 +397,29 @@ INSTANTIATE_TEST_SUITE_P( All, IntentPickerIconBrowserTest, - testing::Values("", "noopener", "noreferrer", "nofollow")); + testing::Combine(testing::Values("", "noopener", "noreferrer", "nofollow"), +#if BUILDFLAG(IS_CHROMEOS) + testing::Values(false)), +#else + testing::Values(true, false)), +#endif // BUILDFLAG(IS_CHROMEOS) + [](const testing::TestParamInfo<std::tuple<std::string, bool>>& info) { + std::string test_name; + test_name = std::get<std::string>(info.param); + test_name.append(std::get<bool>(info.param) ? "DefaultOn" : "DefaultOff"); + return test_name; + }); class IntentPickerIconBrowserBubbleTest : public IntentPickerBrowserTest, public testing::WithParamInterface<bool> { public: + // TODO(crbug.com/1001189): Stop disabling Paint Holding. IntentPickerIconBrowserBubbleTest() { feature_list_.InitWithFeaturesAndParameters( apps::test::GetFeaturesToEnableLinkCapturingUX( /*override_captures_by_default=*/GetParam()), - {}); + {blink::features::kPaintHolding}); } bool LinkCapturingEnabledByDefault() const { return GetParam(); } @@ -454,6 +485,11 @@ return info.param ? "DefaultOn" : "DefaultOff"; }); +// This test only works when link capturing is set to default off for desktop +// platforms, as prerendering navigations are aborted during link captured app +// launches. See LinkCapturingNavigationThrottle::MaybeCreate for more +// information. +// TODO(b/297256243): Investigate prerendering integration with link capturing. class IntentPickerIconPrerenderingBrowserTest : public IntentPickerIconBrowserTest { public: @@ -522,7 +558,14 @@ INSTANTIATE_TEST_SUITE_P( All, IntentPickerIconPrerenderingBrowserTest, - testing::Values("", "noopener", "noreferrer", "nofollow")); + testing::Combine(testing::Values("", "noopener", "noreferrer", "nofollow"), + testing::Values(false)), + [](const testing::TestParamInfo<std::tuple<std::string, bool>>& info) { + std::string test_name; + test_name = std::get<std::string>(info.param); + test_name.append("DefaultOff"); + return test_name; + }); class IntentPickerIconFencedFrameBrowserTest : public IntentPickerIconBrowserTest { @@ -566,4 +609,15 @@ INSTANTIATE_TEST_SUITE_P( All, IntentPickerIconFencedFrameBrowserTest, - testing::Values("", "noopener", "noreferrer", "nofollow")); + testing::Combine(testing::Values("", "noopener", "noreferrer", "nofollow"), +#if BUILDFLAG(IS_CHROMEOS) + testing::Values(false)), +#else + testing::Values(true, false)), +#endif + [](const testing::TestParamInfo<std::tuple<std::string, bool>>& info) { + std::string test_name; + test_name = std::get<std::string>(info.param); + test_name.append(std::get<bool>(info.param) ? "DefaultOn" : "DefaultOff"); + return test_name; + });
diff --git a/chrome/browser/ui/views/page_info/page_info_main_view.cc b/chrome/browser/ui/views/page_info/page_info_main_view.cc index aa7963ea..3d0e871 100644 --- a/chrome/browser/ui/views/page_info/page_info_main_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_main_view.cc
@@ -502,6 +502,11 @@ PreferredSizeChanged(); } +const std::vector<PermissionToggleRowView*> +PageInfoMainView::GetToggleRowsForTesting() const { + return toggle_rows_; +} + std::unique_ptr<views::View> PageInfoMainView::CreateContainerView() { return std::make_unique<ContainerView>(); }
diff --git a/chrome/browser/ui/views/page_info/page_info_main_view.h b/chrome/browser/ui/views/page_info/page_info_main_view.h index abdc0f9a..ef109a13 100644 --- a/chrome/browser/ui/views/page_info/page_info_main_view.h +++ b/chrome/browser/ui/views/page_info/page_info_main_view.h
@@ -86,6 +86,8 @@ return toggle_rows_.size(); } + const std::vector<PermissionToggleRowView*> GetToggleRowsForTesting() const; + protected: // TODO(olesiamarukhno): Was used for tests, will update it after redesigning // moves forward.
diff --git a/chrome/browser/ui/views/permissions/midi_permissions_flow_interactive_uitest.cc b/chrome/browser/ui/views/permissions/midi_permissions_flow_interactive_uitest.cc new file mode 100644 index 0000000..9cfb3fd --- /dev/null +++ b/chrome/browser/ui/views/permissions/midi_permissions_flow_interactive_uitest.cc
@@ -0,0 +1,162 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_element_identifiers.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/views/controls/rich_controls_container_view.h" +#include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" +#include "chrome/browser/ui/views/page_info/page_info_main_view.h" +#include "chrome/browser/ui/views/page_info/permission_toggle_row_view.h" +#include "chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h" +#include "chrome/grit/generated_resources.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/interaction/interactive_browser_test.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings_types.h" +#include "components/strings/grit/components_strings.h" +#include "components/vector_icons/vector_icons.h" +#include "content/public/common/content_features.h" +#include "content/public/test/browser_test.h" +#include "net/dns/mock_host_resolver.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/views/interaction/interaction_test_util_views.h" +#include "ui/views/interaction/interactive_views_test.h" +#include "ui/views/view_utils.h" + +namespace { + +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); + +} // namespace + +// Test permissions UI behavior when the flag BlockMidiByDefault is enabled. +class MidiPermissionsFlowInteractiveUITest : public InteractiveBrowserTest { + public: + MidiPermissionsFlowInteractiveUITest() { + feature_list_.InitAndEnableFeature(features::kBlockMidiByDefault); + https_server_ = std::make_unique<net::EmbeddedTestServer>( + net::EmbeddedTestServer::TYPE_HTTPS); + } + + ~MidiPermissionsFlowInteractiveUITest() override = default; + MidiPermissionsFlowInteractiveUITest( + const MidiPermissionsFlowInteractiveUITest&) = delete; + void operator=(const MidiPermissionsFlowInteractiveUITest&) = delete; + + void SetUp() override { + https_server()->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); + https_server()->ServeFilesFromSourceDirectory(GetChromeTestDataDir()); + + ASSERT_TRUE(https_server()->InitializeAndListen()); + InteractiveBrowserTest::SetUp(); + } + + void SetUpOnMainThread() override { + InteractiveBrowserTest::SetUpOnMainThread(); + host_resolver()->AddRule("*", "127.0.0.1"); + content::SetupCrossSiteRedirector(https_server()); + https_server()->StartAcceptingConnections(); + } + + void TearDownOnMainThread() override { + EXPECT_TRUE(https_server()->ShutdownAndWaitUntilComplete()); + InteractiveBrowserTest::TearDownOnMainThread(); + } + + net::EmbeddedTestServer* https_server() { return https_server_.get(); } + + ui::ElementContext context() const { + return browser()->window()->GetElementContext(); + } + + auto NavigateAndRequestMidi() { + return Steps( + InstrumentTab(kWebContentsElementId), + NavigateWebContents(kWebContentsElementId, GetURL()), + ExecuteJs(kWebContentsElementId, "navigator.requestMIDIAccess"), + WaitForShow(PermissionPromptBubbleBaseView::kMainViewId)); + } + + protected: + GURL GetURL() { + return https_server()->GetURL("a.test", "/permissions/requests.html"); + } + + void SetPermission(ContentSettingsType type, ContentSetting setting) { + HostContentSettingsMap* map = + HostContentSettingsMapFactory::GetForProfile(browser()->profile()); + + map->SetContentSettingDefaultScope(GetURL(), GetURL(), type, setting); + } + + std::unique_ptr<net::EmbeddedTestServer> https_server_; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Display MIDI permission prompt. +IN_PROC_BROWSER_TEST_F(MidiPermissionsFlowInteractiveUITest, + MidiPermissionPrompt) { + RunTestSequenceInContext( + context(), NavigateAndRequestMidi(), + CheckViewProperty( + PermissionPromptBubbleBaseView::kMainViewId, + &PermissionPromptBubbleBaseView::GetPermissionFragmentForTesting, + l10n_util::GetStringFUTF16( + IDS_PERMISSIONS_BUBBLE_PROMPT_ACCESSIBLE_TITLE_ONE_PERM, u"", + l10n_util::GetStringUTF16(IDS_MIDI_PERMISSION_FRAGMENT)))); +} + +// Display MIDI permission status in page info when denied. +IN_PROC_BROWSER_TEST_F(MidiPermissionsFlowInteractiveUITest, + BlockedMidiPermissionInPageInfo) { + RunTestSequenceInContext( + context(), NavigateAndRequestMidi(), + PressButton(PermissionPromptBubbleBaseView::kBlockButtonElementId), + WaitForHide(PermissionPromptBubbleBaseView::kMainViewId), + PressButton(kLocationIconElementId), // open page info. + AfterShow( + PageInfoMainView::kMainLayoutElementId, + base::BindLambdaForTesting([](ui::TrackedElement* element) { + bool includes_midi = false; + for (auto* permission_toggle_row : + AsView<PageInfoMainView>(element)->GetToggleRowsForTesting()) { + if (permission_toggle_row->GetRowTitleForTesting() == + l10n_util::GetStringUTF16(IDS_SITE_SETTINGS_TYPE_MIDI)) { + includes_midi = true; + break; + } + } + EXPECT_EQ(includes_midi, true); + }))); +} + +// Display MIDI permission status in page info when allowed. +IN_PROC_BROWSER_TEST_F(MidiPermissionsFlowInteractiveUITest, + AllowedMidiPermissionInPageInfo) { + RunTestSequenceInContext( + context(), NavigateAndRequestMidi(), + PressButton(PermissionPromptBubbleBaseView::kAllowButtonElementId), + WaitForHide(PermissionPromptBubbleBaseView::kMainViewId), + PressButton(kLocationIconElementId), // open page info. + AfterShow( + PageInfoMainView::kMainLayoutElementId, + base::BindLambdaForTesting([](ui::TrackedElement* element) { + bool includes_midi = false; + for (auto* permission_toggle_row : + AsView<PageInfoMainView>(element)->GetToggleRowsForTesting()) { + if (permission_toggle_row->GetRowTitleForTesting() == + l10n_util::GetStringUTF16(IDS_SITE_SETTINGS_TYPE_MIDI)) { + includes_midi = true; + break; + } + } + EXPECT_EQ(includes_midi, true); + }))); +}
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc index 82692896..fd9e434 100644 --- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc +++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc
@@ -6,6 +6,7 @@ #include <memory> #include <optional> +#include <string> #include "base/metrics/histogram_functions.h" #include "base/notreached.h" @@ -42,6 +43,8 @@ DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(PermissionPromptBubbleBaseView, kMainViewId); DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(PermissionPromptBubbleBaseView, + kBlockButtonElementId); +DEFINE_CLASS_ELEMENT_IDENTIFIER_VALUE(PermissionPromptBubbleBaseView, kAllowButtonElementId); PermissionPromptBubbleBaseView::PermissionPromptBubbleBaseView( @@ -118,6 +121,8 @@ base::Unretained(this), GetViewId(PermissionDialogButton::kDeny)), l10n_util::GetStringUTF16(block_message_id)); + block_button->SetProperty(views::kElementIdentifierKey, + kBlockButtonElementId); block_button->SetID(GetViewId(PermissionDialogButton::kDeny)); if (features::IsChromeRefresh2023()) { @@ -175,6 +180,8 @@ views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(this); if (!is_one_time_permission_) { + GetCancelButton()->SetProperty(views::kElementIdentifierKey, + kBlockButtonElementId); GetOkButton()->SetProperty(views::kElementIdentifierKey, kAllowButtonElementId); } @@ -273,6 +280,14 @@ NOTREACHED(); } +const std::u16string +PermissionPromptBubbleBaseView::GetPermissionFragmentForTesting() const { + std::u16string origin = + PermissionPromptBaseView::GetUrlIdentity(browser_, *delegate_).name; + return accessible_window_title_.substr(accessible_window_title_.find(origin) + + origin.length()); +} + // static bool PermissionPromptBubbleBaseView::IsOneTimePermission( permissions::PermissionPrompt::Delegate& delegate) {
diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h index 134608faf..4e3336c37 100644 --- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h +++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.h
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/url_identity.h" #include "chrome/browser/ui/views/permissions/permission_prompt_base_view.h" #include "chrome/browser/ui/views/permissions/permission_prompt_style.h" +#include "chrome/grit/generated_resources.h" #include "components/permissions/permission_prompt.h" #include "components/permissions/permission_util.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -41,6 +42,7 @@ public: METADATA_HEADER(PermissionPromptBubbleBaseView); DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kMainViewId); + DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kBlockButtonElementId); DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kAllowButtonElementId); PermissionPromptBubbleBaseView( Browser* browser, @@ -84,6 +86,8 @@ // PermissionPromptBaseView: void RunButtonCallback(int button_id) override; + const std::u16string GetPermissionFragmentForTesting() const; + protected: void CreateWidget();
diff --git a/chrome/browser/ui/views/permissions/permissions_flow_interactive_uitest.cc b/chrome/browser/ui/views/permissions/permissions_flow_interactive_uitest.cc index 6bd1c4e..c3f88a9 100644 --- a/chrome/browser/ui/views/permissions/permissions_flow_interactive_uitest.cc +++ b/chrome/browser/ui/views/permissions/permissions_flow_interactive_uitest.cc
@@ -208,8 +208,9 @@ l10n_util::GetStringUTF16(IDS_SITE_SETTINGS_TYPE_CAMERA))); } +// TODO(crbug.com/1510975): fix and re-enable for CR2023. IN_PROC_BROWSER_TEST_F(PermissionsFlowInteractiveUITest, - CameraActivityIndicatorTest) { + DISABLED_CameraActivityIndicatorTest) { RunTestSequenceInContext( context(), InstrumentTab(kWebContentsElementId), NavigateWebContents(kWebContentsElementId, GetURL()), @@ -230,8 +231,9 @@ &vector_icons::kVideocamIcon)); } +// TODO(crbug.com/1510975): fix and re-enable for CR2023. IN_PROC_BROWSER_TEST_F(PermissionsFlowInteractiveUITest, - MicrophoneActivityIndicatorTest) { + DISABLED_MicrophoneActivityIndicatorTest) { RunTestSequenceInContext( context(), InstrumentTab(kWebContentsElementId), NavigateWebContents(kWebContentsElementId, GetURL()), @@ -252,8 +254,9 @@ &vector_icons::kMicIcon)); } +// TODO(crbug.com/1510975): fix and re-enable for CR2023. IN_PROC_BROWSER_TEST_F(PermissionsFlowInteractiveUITest, - CameraAndMicrophoneActivityIndicatorTest) { + DISABLED_CameraAndMicrophoneActivityIndicatorTest) { RunTestSequenceInContext( context(), InstrumentTab(kWebContentsElementId), NavigateWebContents(kWebContentsElementId, GetURL()),
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc index 98d7631b..101f8b9 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -27,10 +27,8 @@ namespace { -constexpr int kDialogWidth = 512; constexpr int kM1DialogWidth = 600; -constexpr int kDefaultConsentDialogHeight = 569; -constexpr int kDefaultNoticeDialogHeight = 494; +constexpr int kDefaultDialogHeight = 494; constexpr int kMinRequiredDialogHeight = 100; constexpr int kMinRequiredDialogWidth = 400; @@ -39,9 +37,6 @@ GURL combined_dialog_url = base_url.Resolve(chrome::kChromeUIPrivacySandboxDialogCombinedPath); switch (prompt_type) { - case PrivacySandboxService::PromptType::kConsent: - case PrivacySandboxService::PromptType::kNotice: - return base_url; case PrivacySandboxService::PromptType::kM1Consent: return combined_dialog_url; case PrivacySandboxService::PromptType::kM1NoticeROW: @@ -58,9 +53,6 @@ int GetDialogWidth(PrivacySandboxService::PromptType prompt_type) { switch (prompt_type) { - case PrivacySandboxService::PromptType::kConsent: - case PrivacySandboxService::PromptType::kNotice: - return kDialogWidth; case PrivacySandboxService::PromptType::kM1Consent: case PrivacySandboxService::PromptType::kM1NoticeROW: case PrivacySandboxService::PromptType::kM1NoticeEEA: @@ -161,10 +153,8 @@ .width(); const int width = views::LayoutProvider::Get()->GetSnappedDialogWidth( GetDialogWidth(prompt_type)); - const int height = prompt_type == PrivacySandboxService::PromptType::kConsent - ? kDefaultConsentDialogHeight - : kDefaultNoticeDialogHeight; - web_view_->SetPreferredSize(gfx::Size(std::min(width, max_width), height)); + web_view_->SetPreferredSize( + gfx::Size(std::min(width, max_width), kDefaultDialogHeight)); PrivacySandboxDialogUI* web_ui = web_view_->GetWebContents() ->GetWebUI() @@ -224,5 +214,10 @@ chrome::ShowPrivacySandboxAdMeasurementSettings(browser_); } +content::WebContents* PrivacySandboxDialogView::GetWebContentsForTesting() { + CHECK(web_view_); + return web_view_->GetWebContents(); +} + BEGIN_METADATA(PrivacySandboxDialogView, views::View) END_METADATA
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h index 426e2bfb..148170d 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
@@ -12,6 +12,10 @@ class Browser; +namespace content { +class WebContents; +} + namespace views { class WebView; } @@ -31,6 +35,8 @@ void ShowNativeView(); void OpenPrivacySandboxSettings(); void OpenPrivacySandboxAdMeasurementSettings(); + friend class PrivacySandboxDialogViewBrowserTest; + content::WebContents* GetWebContentsForTesting(); raw_ptr<views::WebView> web_view_; raw_ptr<Browser> browser_;
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc index 10a3976c..d0abda6bd 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/test/run_until.h" #include "build/build_config.h" #include "chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h" @@ -39,10 +40,10 @@ PrivacySandboxService::PromptType prompt_type = PrivacySandboxService::PromptType::kNone; if (name == "Consent") { - prompt_type = PrivacySandboxService::PromptType::kConsent; + prompt_type = PrivacySandboxService::PromptType::kM1Consent; } if (name == "Notice") { - prompt_type = PrivacySandboxService::PromptType::kNotice; + prompt_type = PrivacySandboxService::PromptType::kM1NoticeROW; } if (name == "RestrictedNotice") { prompt_type = PrivacySandboxService::PromptType::kM1NoticeRestricted; @@ -57,7 +58,23 @@ views::test::AnyWidgetTestPasskey{}, PrivacySandboxDialogView::kViewClassName); ShowPrivacySandboxDialog(browser(), prompt_type); - waiter.WaitIfNeededAndGet(); + + auto* dialog_widget = static_cast<PrivacySandboxDialogView*>( + waiter.WaitIfNeededAndGet()->widget_delegate()->GetContentsView()); + + // TODO(crbug.com/1510925): Waiting for the document to exist before + // performing the scroll action fixes the flakiness but we should try find a + // better approach. + ASSERT_TRUE(base::test::RunUntil([&] { + return content::EvalJs(dialog_widget->GetWebContentsForTesting(), + "!!document") + .ExtractBool(); + })); + + // Ensure dialog is fully scrolled, this is needed in order for the "*Shown" + // action to be fired. + auto scroll = content::EvalJs(dialog_widget->GetWebContentsForTesting(), + "scrollTo(0, 1500)"); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc index 9bf0923..ef3a793 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc
@@ -20,93 +20,9 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "testing/gmock/include/gmock/gmock.h" -#include "ui/base/ozone_buildflags.h" #include "ui/views/widget/any_widget_observer.h" #include "ui/views/widget/widget.h" -class PrivacySandboxDialogViewInteractiveUiTest : public InProcessBrowserTest { - public: - void SetUpOnMainThread() override { - mock_service_ = static_cast<MockPrivacySandboxService*>( - PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse( - browser()->profile(), - base::BindRepeating(&BuildMockPrivacySandboxService))); - } - - MockPrivacySandboxService* mock_service() { return mock_service_; } - - private: - raw_ptr<MockPrivacySandboxService, DanglingUntriaged> mock_service_; -}; - -// TODO(crbug.com/1315979): Flaky on most release builds. -// TODO(crbug.com/1430490): Broken on macOS -#if defined(NDEBUG) || BUILDFLAG(IS_CHROMEOS_ASH) || \ - BUILDFLAG(IS_OZONE_WAYLAND) || BUILDFLAG(IS_MAC) -#define MAYBE_EscapeClosesNotice DISABLED_EscapeClosesNotice -#else -#define MAYBE_EscapeClosesNotice EscapeClosesNotice -#endif -IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewInteractiveUiTest, - MAYBE_EscapeClosesNotice) { - // Check that when the escape key is pressed, the notice is closed. - EXPECT_CALL( - *mock_service(), - PromptActionOccurred(PrivacySandboxService::PromptAction::kNoticeShown)); - EXPECT_CALL(*mock_service(), - PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeDismiss)); - EXPECT_CALL( - *mock_service(), - PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeClosedNoInteraction)) - .Times(0); - views::NamedWidgetShownWaiter waiter( - views::test::AnyWidgetTestPasskey{}, - PrivacySandboxDialogView::kViewClassName); - ShowPrivacySandboxPrompt(browser(), - PrivacySandboxService::PromptType::kNotice); - auto* dialog = waiter.WaitIfNeededAndGet(); - EXPECT_TRUE(dialog); - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, - false, false, false)); - // The dialog can be in the deletion process at this stage, so don't check - // if the dialog is closed. Instead, rely on the actions logged from the - // service. - base::RunLoop().RunUntilIdle(); - - // Shutting down the browser test will naturally shut the dialog, verify - // expectations before that happens. - testing::Mock::VerifyAndClearExpectations(mock_service()); -} - -IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewInteractiveUiTest, - EscapeDoesntCloseConsent) { - // Check that when the escape key is pressed, the consent is not closed. - EXPECT_CALL( - *mock_service(), - PromptActionOccurred(PrivacySandboxService::PromptAction::kConsentShown)); - EXPECT_CALL( - *mock_service(), - PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentClosedNoDecision)) - .Times(0); - views::NamedWidgetShownWaiter waiter( - views::test::AnyWidgetTestPasskey{}, - PrivacySandboxDialogView::kViewClassName); - ShowPrivacySandboxDialog(browser(), - PrivacySandboxService::PromptType::kConsent); - auto* dialog = waiter.WaitIfNeededAndGet(); - ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_ESCAPE, false, - false, false, false)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(dialog->IsClosed()); - - // Shutting down the browser test will naturally shut the dialog, verify - // expectations before that happens. - testing::Mock::VerifyAndClearExpectations(mock_service()); -} - class PrivacySandboxDialogViewInteractiveUiTestM1 : public InProcessBrowserTest { public:
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc index 2969119..e4a38ea 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc
@@ -102,7 +102,8 @@ // Test that back button is enabled after navigating to another page const GURL another_url("https://anothertest.org"); - web_app::NavigateToURLAndWait(helper()->app_browser(), another_url); + web_app::NavigateViaLinkClickToURLAndWait(helper()->app_browser(), + another_url); helper()->app_browser()->command_controller()->ExecuteCommand( IDC_FOCUS_TOOLBAR); EXPECT_EQ(focus_manager->GetFocusedView()->GetID(), VIEW_ID_BACK_BUTTON);
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index 8ed48f7..74673fa 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -2078,7 +2078,7 @@ content::TestNavigationObserver url_observer(GetUrlForSite(to)); url_observer.StartWatchingNewWebContents(); url_observer.WatchExistingWebContents(); - NavigateToURLAndWait(app_browser(), GetUrlForSite(to), false); + NavigateViaLinkClickToURLAndWait(app_browser(), GetUrlForSite(to), false); url_observer.Wait(); AfterStateChangeAction(); } @@ -4577,6 +4577,9 @@ #if BUILDFLAG(IS_CHROMEOS) // TODO(crbug.com/1357905): Update test driver to work with new UI. disabled_features.push_back(apps::features::kLinkCapturingUiUpdate); +#else + // TOOD(b/313492499): Update test driver to work with new intent picker UI. + disabled_features.push_back(features::kDesktopPWAsLinkCapturing); #endif // BUILDFLAG(IS_CHROMEOS) scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); }
diff --git a/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc index aea0332e..7e91ce1 100644 --- a/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc
@@ -195,7 +195,7 @@ IN_PROC_BROWSER_TEST_F(WebAppTabStripBrowserTest, PopOutTabOnInstall) { GURL start_url = embedded_test_server()->GetURL("/web_apps/basic.html"); - NavigateToURLAndWait(browser(), start_url); + NavigateViaLinkClickToURLAndWait(browser(), start_url); // Install the site with the user display mode set to kTabbed. webapps::AppId app_id; @@ -1370,7 +1370,7 @@ UpdateAwaiter update_awaiter(provider.install_manager()); serve_token = false; - NavigateToURLAndWait(browser(), GURL(kTestWebAppUrl)); + NavigateViaLinkClickToURLAndWait(browser(), GURL(kTestWebAppUrl)); update_awaiter.AwaitUpdate(); }
diff --git a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc index 60bcecc..f00abc0 100644 --- a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc +++ b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
@@ -105,7 +105,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, CreateShortcutForInstallableSite) { base::UserActionTester user_action_tester; - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); EXPECT_EQ(registrar().GetAppShortName(app_id), GetInstallableAppName()); @@ -133,7 +133,7 @@ embedded_test_server()->GetURL( "/web_apps/get_manifest.html?theme_color_only.json")}) { base::HistogramTester histogram_tester; - NavigateToURLAndWait(browser(), url); + NavigateViaLinkClickToURLAndWait(browser(), url); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); EXPECT_EQ(webapps::WebappInstallSource::MENU_CREATE_SHORTCUT, @@ -147,7 +147,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, CanInstallOverTabShortcutApp) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); InstallShortcutAppForCurrentUrl(); Browser* new_browser = @@ -161,7 +161,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, CannotInstallOverWindowShortcutApp) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); // Change launch container to open in window. sync_bridge().SetAppUserDisplayMode(app_id, @@ -202,7 +202,7 @@ // Install the shortcut app that links to the extension's popup page. const GURL popup_url("chrome-extension://" + extension_id + "/popup.html"); - NavigateToURLAndWait(browser(), popup_url); + NavigateViaLinkClickToURLAndWait(browser(), popup_url); // TODO(crbug.com/1253234): IDC_CREATE_SHORTCUT command must become disabled. ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_CREATE_SHORTCUT)); @@ -221,8 +221,9 @@ // iframe load. Context: crbug.com/1046883 IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, WorksAfterDelayedIFrameLoad) { ASSERT_TRUE(embedded_test_server()->Start()); - NavigateToURLAndWait(browser(), embedded_test_server()->GetURL( - "/favicon/page_with_favicon.html")); + NavigateViaLinkClickToURLAndWait( + browser(), + embedded_test_server()->GetURL("/favicon/page_with_favicon.html")); // Append an iframe and wait for it to finish loading. const char script[] = R"( @@ -246,7 +247,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, UseNonPromotableManifestData) { ASSERT_TRUE(embedded_test_server()->Start()); - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), embedded_test_server()->GetURL( "/web_apps/get_manifest.html?theme_color_only.json")); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); @@ -259,7 +260,7 @@ ASSERT_TRUE(embedded_test_server()->Start()); GURL url = embedded_test_server()->GetURL( "/web_apps/get_manifest.html?invalid_start_url.json"); - NavigateToURLAndWait(browser(), url); + NavigateViaLinkClickToURLAndWait(browser(), url); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); EXPECT_EQ(registrar().GetAppStartUrl(app_id), url); } @@ -268,7 +269,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, DISABLED_CreateShortcutAgainOverwriteUserDisplayMode) { base::UserActionTester user_action_tester; - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); EXPECT_EQ(registrar().GetAppShortName(app_id), GetInstallableAppName()); @@ -293,7 +294,7 @@ IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, DISABLED_OpenShortcutWindowOnlyOnce) { base::UserActionTester user_action_tester; - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); WebAppTestInstallObserver observer(profile()); // The "Create shortcut" call is executed twice, but the dialog @@ -308,8 +309,8 @@ // letter icon correctly and does not use the "H" letter from the "https" // scheme. IN_PROC_BROWSER_TEST_F(CreateShortcutBrowserTest, UseHostWhenTitleIsUrl) { - NavigateToURLAndWait(browser(), - https_server()->GetURL("example.com", "/empty.html")); + NavigateViaLinkClickToURLAndWait( + browser(), https_server()->GetURL("example.com", "/empty.html")); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); base::test::TestFuture<std::map<SquareSizePx, SkBitmap>> future; @@ -349,7 +350,7 @@ IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest_CreateShortcutIgnoresManifest, InstallableSiteDifferentStartUrl) { bool create_shortcut_ignores_manifest = GetParam(); - NavigateToURLAndWait(browser(), PageWithDifferentStartUrl()); + NavigateViaLinkClickToURLAndWait(browser(), PageWithDifferentStartUrl()); webapps::AppId app_id = InstallShortcutAppForCurrentUrl(); EXPECT_EQ(registrar().GetAppUserDisplayMode(app_id), @@ -382,7 +383,7 @@ IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest_CreateShortcutIgnoresManifest, CanInstallOverTabShortcutApp) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); webapps::AppId shortcut_app_id = InstallShortcutAppForCurrentUrl(); bool create_shortcut_ignores_manifest = GetParam();
diff --git a/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc b/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc index 29762fd..8d51f837 100644 --- a/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc +++ b/chrome/browser/ui/web_applications/pwa_mixed_content_browsertest.cc
@@ -170,7 +170,7 @@ const GURL app_url = GetMixedContentAppURL(); const webapps::AppId app_id = InstallPWA(app_url); - NavigateToURLAndWait(browser(), GetMixedContentAppURL()); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GetMixedContentAppURL())); content::WebContents* tab_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_EQ(tab_contents->GetLastCommittedURL(), GetMixedContentAppURL()); @@ -220,7 +220,7 @@ const GURL app_url = GetSecureIFrameAppURL(); const webapps::AppId app_id = InstallPWA(app_url); - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); CheckMixedContentFailedToLoad(browser()); Browser* const app_browser = ReparentWebContentsIntoAppBrowser(
diff --git a/chrome/browser/ui/web_applications/status_bar_browsertest.cc b/chrome/browser/ui/web_applications/status_bar_browsertest.cc index 82c753bc..4b10ae1 100644 --- a/chrome/browser/ui/web_applications/status_bar_browsertest.cc +++ b/chrome/browser/ui/web_applications/status_bar_browsertest.cc
@@ -15,8 +15,8 @@ using WebAppStatusBarTest = WebAppControllerBrowserTest; IN_PROC_BROWSER_TEST_F(WebAppStatusBarTest, NoStatusBar) { - NavigateToURLAndWait(browser(), - https_server()->GetURL("/web_apps/basic.html")); + NavigateViaLinkClickToURLAndWait( + browser(), https_server()->GetURL("/web_apps/basic.html")); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); Browser* const app_browser = ::web_app::LaunchWebAppBrowserAndWait(profile(), app_id); @@ -24,7 +24,7 @@ } IN_PROC_BROWSER_TEST_F(WebAppStatusBarTest, DisplayBrowserHasStatusBar) { - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/web_apps/display_browser.html")); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); Browser* const app_browser = @@ -33,7 +33,7 @@ } IN_PROC_BROWSER_TEST_F(WebAppStatusBarTest, NoManifestHasStatusBar) { - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/banners/no_manifest_test_page.html")); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); Browser* const app_browser = @@ -42,7 +42,7 @@ } IN_PROC_BROWSER_TEST_F(WebAppStatusBarTest, DisplayMinimalUiHasStatusBar) { - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/web_apps/minimal_ui/basic.html")); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); Browser* const app_browser =
diff --git a/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc b/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc index ab23a01..49c66f9 100644 --- a/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc +++ b/chrome/browser/ui/web_applications/test/system_web_app_interactive_uitest.cc
@@ -93,7 +93,7 @@ } else { // Ash can have ordinary tabbed browser windows. GURL kInitiatingChromeUrl = GURL(chrome::kChromeUIAboutURL); - NavigateToURLAndWait(browser(), kInitiatingChromeUrl); + NavigateViaLinkClickToURLAndWait(browser(), kInitiatingChromeUrl); EXPECT_EQ(kInitiatingChromeUrl, browser() ->tab_strip_model() ->GetActiveWebContents() @@ -229,7 +229,7 @@ WaitForTestSystemAppInstall(); GURL kInitiatingChromeUrl = GURL(chrome::kChromeUIAboutURL); - NavigateToURLAndWait(browser(), kInitiatingChromeUrl); + NavigateViaLinkClickToURLAndWait(browser(), kInitiatingChromeUrl); EXPECT_EQ(kInitiatingChromeUrl, browser() ->tab_strip_model() ->GetActiveWebContents() @@ -281,7 +281,7 @@ WaitForTestSystemAppInstall(); GURL kInitiatingChromeUrl = GURL(chrome::kChromeUIAboutURL); - NavigateToURLAndWait(browser(), kInitiatingChromeUrl); + NavigateViaLinkClickToURLAndWait(browser(), kInitiatingChromeUrl); EXPECT_EQ(kInitiatingChromeUrl, browser() ->tab_strip_model() ->GetActiveWebContents() @@ -436,7 +436,7 @@ content::WebContents* web_contents = LaunchApp(GetAppType(), &app_browser); GURL kInitiatingChromeUrl = GURL(chrome::kChromeUIAboutURL); - NavigateToURLAndWait(browser(), kInitiatingChromeUrl); + NavigateViaLinkClickToURLAndWait(browser(), kInitiatingChromeUrl); EXPECT_EQ(kInitiatingChromeUrl, browser() ->tab_strip_model() ->GetActiveWebContents()
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc index f3651fb9..3300652 100644 --- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc +++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
@@ -94,7 +94,7 @@ } // namespace webapps::AppId InstallWebAppFromPage(Browser* browser, const GURL& app_url) { - NavigateToURLAndWait(browser, app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser, app_url)); webapps::AppId app_id; base::RunLoop run_loop; @@ -143,7 +143,7 @@ const GURL& app_url) { ServiceWorkerRegistrationWaiter registration_waiter(browser->profile(), app_url); - NavigateToURLAndWait(browser, app_url); + NavigateViaLinkClickToURLAndWait(browser, app_url); registration_waiter.AwaitRegistration(); webapps::AppId app_id; @@ -279,9 +279,9 @@ return result; } -void NavigateToURLAndWait(Browser* browser, - const GURL& url, - bool proceed_through_interstitial) { +void NavigateViaLinkClickToURLAndWait(Browser* browser, + const GURL& url, + bool proceed_through_interstitial) { content::WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents(); @@ -318,7 +318,7 @@ const GURL& url, bool expected_visibility, bool proceed_through_interstitial) { - NavigateToURLAndWait(browser, url, proceed_through_interstitial); + NavigateViaLinkClickToURLAndWait(browser, url, proceed_through_interstitial); EXPECT_EQ(expected_visibility, browser->app_controller()->ShouldShowCustomTabBar()); }
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.h b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.h index 8ee28e82..562cd36 100644 --- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.h +++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.h
@@ -83,14 +83,16 @@ Profile*, ExternalInstallOptions); +// This function simulates loading a given url via a link click. // If |proceed_through_interstitial| is true, asserts that a security // interstitial is shown, and clicks through it, before returning. // Note - this does NOT wait for the given url to load, it just waits for // navigation to complete. To ensure the given url is fully loaded, wait for // that separately. -void NavigateToURLAndWait(Browser* browser, - const GURL& url, - bool proceed_through_interstitial = false); +void NavigateViaLinkClickToURLAndWait( + Browser* browser, + const GURL& url, + bool proceed_through_interstitial = false); // Performs a navigation and then checks that the toolbar visibility is as // expected.
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc index 4dcd1cef..a44ae40 100644 --- a/chrome/browser/ui/web_applications/web_app_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -658,7 +658,7 @@ GURL test_url = https_server()->GetURL( "/banners/" "manifest_test_page.html?manifest=manifest_display_override.json"); - NavigateToURLAndWait(browser(), test_url); + NavigateViaLinkClickToURLAndWait(browser(), test_url); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -710,7 +710,7 @@ const GURL app_url = GetSecureAppURL(); const webapps::AppId app_id = InstallPWA(app_url); Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id); - NavigateToURLAndWait(app_browser, app_url); + NavigateViaLinkClickToURLAndWait(app_browser, app_url); ASSERT_TRUE(app_browser->app_controller()); NavigateAndCheckForToolbar(app_browser, GURL(kExampleURL), true); } @@ -721,7 +721,7 @@ const GURL app_url = GetSecureAppURL(); const webapps::AppId app_id = InstallPWA(app_url); Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id); - NavigateToURLAndWait(app_browser, app_url); + NavigateViaLinkClickToURLAndWait(app_browser, app_url); ASSERT_TRUE(app_browser->app_controller()); EXPECT_EQ(chrome::GetTotalBrowserCount(), 2u); @@ -756,7 +756,7 @@ Browser* const app_browser = LaunchWebAppBrowserAndWait(app_id); EXPECT_TRUE(AppBrowserController::IsWebApp(app_browser)); - NavigateToURLAndWait(app_browser, app_url); + NavigateViaLinkClickToURLAndWait(app_browser, app_url); const gfx::Rect bounds = gfx::Rect(50, 50, 550, 500); app_browser->window()->SetBounds(bounds); @@ -856,7 +856,7 @@ // The installed PWA's scope is app.com:{PORT}/ssl, // so app.com:{PORT}/accessibility_fail.html is out of scope. const GURL out_of_scope = GetURLForPath("/accessibility_fail.html"); - NavigateToURLAndWait(app_browser, out_of_scope); + NavigateViaLinkClickToURLAndWait(app_browser, out_of_scope); // Location should be visible off scope. ASSERT_TRUE(app_browser->app_controller()->ShouldShowCustomTabBar()); @@ -871,13 +871,13 @@ const webapps::AppId app_id = InstallPWA(app_url); Browser* const app_browser = LaunchWebAppBrowser(app_id); - NavigateToURLAndWait(app_browser, secure_app_url); + NavigateViaLinkClickToURLAndWait(app_browser, secure_app_url); EXPECT_FALSE(app_browser->app_controller()->ShouldShowCustomTabBar()); const GURL off_origin_url = https_server()->GetURL("example.org", "/empty.html"); - NavigateToURLAndWait(app_browser, off_origin_url); + NavigateViaLinkClickToURLAndWait(app_browser, off_origin_url); EXPECT_EQ(app_browser->app_controller()->ShouldShowCustomTabBar(), true); } @@ -979,7 +979,7 @@ EXPECT_EQ(webapps::AppBannerManagerDesktop::FromWebContents( incognito_browser->tab_strip_model()->GetActiveWebContents()), nullptr); - NavigateToURLAndWait(incognito_browser, GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(incognito_browser, GetInstallableAppURL()); // Wait sufficient time for an installability check to occur. EXPECT_TRUE( @@ -1035,7 +1035,7 @@ // Tests that an installed PWA is not used when out of scope by one path level. IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, MenuOptionsOutsideInstalledPwaScope) { - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/banners/scope_is_start_url/index.html")); test::InstallPwaForCurrentUrl(browser()); @@ -1053,7 +1053,7 @@ IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, InstallInstallableSite) { base::Time before_install_time = base::Time::Now(); base::UserActionTester user_action_tester; - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -1097,7 +1097,7 @@ test_recorder->Initialize(); base::Time before_install_time = base::Time::Now(); - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -1145,7 +1145,7 @@ test_recorder->Initialize(); base::Time before_install_time = base::Time::Now(); - NavigateToURLAndWait(browser(), GetUrlWithScreenshots()); + NavigateViaLinkClickToURLAndWait(browser(), GetUrlWithScreenshots()); // Wait for the detailed install dialog to show up post install, and accept // it. @@ -1200,7 +1200,7 @@ #endif IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CanInstallOverBrowserTabPwa) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); // Change display mode to open in tab. @@ -1219,7 +1219,7 @@ } IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, CannotInstallOverWindowPwa) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); test::InstallPwaForCurrentUrl(browser()); // Avoid any interference if active browser was changed by PWA install. @@ -1243,7 +1243,7 @@ app_id, web_app::mojom::UserDisplayMode::kBrowser, /*is_user_action=*/false); - NavigateToURLAndWait(browser(), app_url); + NavigateViaLinkClickToURLAndWait(browser(), app_url); EXPECT_EQ(GetAppMenuCommandState(IDC_CREATE_SHORTCUT, browser()), kEnabled); EXPECT_EQ(GetAppMenuCommandState(IDC_INSTALL_PWA, browser()), kNotPresent); EXPECT_EQ(GetAppMenuCommandState(IDC_OPEN_IN_PWA_WINDOW, browser()), @@ -1276,7 +1276,7 @@ IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_DetailedInstallDialog, MAYBE_OpenDetailedInstallDialogOnlyOnce) { base::UserActionTester user_action_tester; - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/banners/manifest_test_page_screenshots.html")); @@ -1373,7 +1373,7 @@ const GURL app_url = GetSecureAppURL(); const webapps::AppId app_id = InstallPWA(app_url); - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); content::WebContents* tab_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_EQ(tab_contents->GetLastCommittedURL(), app_url); @@ -1390,10 +1390,10 @@ std::unique_ptr<OsIntegrationTestOverrideImpl::BlockingRegistration> registration = OsIntegrationTestOverrideImpl::OverrideForTesting(); - NavigateToURLAndWait( + EXPECT_TRUE(ui_test_utils::NavigateToURL( browser(), https_server()->GetURL( - "/banners/manifest_test_page.html?manifest=manifest_one_icon.json")); + "/banners/manifest_test_page.html?manifest=manifest_one_icon.json"))); // Wait for OS hooks and installation to complete and the app to launch. base::RunLoop run_loop_install; @@ -1457,7 +1457,7 @@ std::unique_ptr<OsIntegrationTestOverrideImpl::BlockingRegistration> registration = OsIntegrationTestOverrideImpl::OverrideForTesting(); - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL( "/banners/" @@ -1533,7 +1533,7 @@ std::unique_ptr<OsIntegrationTestOverrideImpl::BlockingRegistration> registration = OsIntegrationTestOverrideImpl::OverrideForTesting(); - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/banners/" "manifest_test_page.html?manifest=manifest.json")); @@ -1607,7 +1607,7 @@ auto* provider = WebAppProvider::GetForTest(profile()); - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); // Wait for OS hooks and installation to complete and the app to launch. base::RunLoop run_loop_install; @@ -1699,7 +1699,7 @@ IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, ReparentLastBrowserTab) { const GURL app_url = GetSecureAppURL(); const webapps::AppId app_id = InstallPWA(app_url); - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); Browser* const app_browser = ReparentWebAppForActiveTab(browser()); ASSERT_EQ(app_browser->app_controller()->app_id(), app_id); @@ -1736,7 +1736,7 @@ blocking_registration = OsIntegrationTestOverrideImpl::OverrideForTesting(base::GetHomeDir()); - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); WebAppProvider* provider = WebAppProvider::GetForTest(profile()); @@ -1824,7 +1824,7 @@ const webapps::AppId app_id = InstallWebApp(std::move(web_app_info)); base::HistogramTester tester; - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); content::WebContents* tab_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_EQ(tab_contents->GetLastCommittedURL(), app_url); @@ -1935,8 +1935,8 @@ app_browser->tab_strip_model()->GetActiveWebContents(); EXPECT_TRUE(content::WaitForLoadStop(web_contents)); EXPECT_EQ(app_title, app_browser->GetWindowTitleForCurrentTab(false)); - NavigateToURLAndWait(app_browser, - https_server()->GetURL("app.site.test", "/simple.html")); + NavigateViaLinkClickToURLAndWait( + app_browser, https_server()->GetURL("app.site.test", "/simple.html")); EXPECT_EQ(u"A Web App - OK", app_browser->GetWindowTitleForCurrentTab(false)); } @@ -1960,8 +1960,8 @@ // When we are within scope, show the page title. EXPECT_EQ(u"A Web App - Google", app_browser->GetWindowTitleForCurrentTab(false)); - NavigateToURLAndWait(app_browser, - https_server()->GetURL("app.site.test", "/simple.html")); + NavigateViaLinkClickToURLAndWait( + app_browser, https_server()->GetURL("app.site.test", "/simple.html")); // When we are off scope, show the app title. EXPECT_EQ(app_title, app_browser->GetWindowTitleForCurrentTab(false)); @@ -2019,7 +2019,7 @@ const GURL url = embedded_test_server()->GetURL("foo.com", "/iframe.html"); content::WebContents* const tab = browser()->tab_strip_model()->GetActiveWebContents(); - NavigateToURLAndWait(browser(), url); + NavigateViaLinkClickToURLAndWait(browser(), url); // Navigate the subframe to a URL that redirects to a URL in the web app's // web extent. @@ -2106,15 +2106,17 @@ // Make sure chrome://web-app-internals page loads fine. IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, WebAppInternalsPage) { // Loads with no web app. - NavigateToURLAndWait(browser(), GURL("chrome://web-app-internals")); + NavigateViaLinkClickToURLAndWait(browser(), + GURL("chrome://web-app-internals")); const GURL app_url = GetSecureAppURL(); InstallPWA(app_url); // Loads with one web app. - NavigateToURLAndWait(browser(), GURL("chrome://web-app-internals")); + NavigateViaLinkClickToURLAndWait(browser(), + GURL("chrome://web-app-internals")); // Install a non-promotable web app. - NavigateToURLAndWait( + NavigateViaLinkClickToURLAndWait( browser(), https_server()->GetURL("/banners/no_manifest_test_page.html")); SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true, /*auto_open_in_window=*/false); @@ -2124,7 +2126,8 @@ observer.Wait(); SetAutoAcceptWebAppDialogForTesting(false, false); // Loads with two apps. - NavigateToURLAndWait(browser(), GURL("chrome://web-app-internals")); + NavigateViaLinkClickToURLAndWait(browser(), + GURL("chrome://web-app-internals")); } IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, BrowserDisplayNotInstallable) { @@ -2153,7 +2156,7 @@ GURL test_url = https_server()->GetURL( "/banners/" "manifest_test_page.html?manifest=manifest_window_controls_overlay.json"); - NavigateToURLAndWait(browser(), test_url); + NavigateViaLinkClickToURLAndWait(browser(), test_url); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -2173,7 +2176,7 @@ GURL test_url = https_server()->GetURL( "/banners/" "manifest_test_page.html?manifest=manifest_borderless.json"); - NavigateToURLAndWait(browser(), test_url); + NavigateViaLinkClickToURLAndWait(browser(), test_url); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -2194,7 +2197,7 @@ GURL test_url = https_server()->GetURL( "/banners/" "manifest_test_page.html?manifest=manifest_tabbed_display_override.json"); - NavigateToURLAndWait(browser(), test_url); + NavigateViaLinkClickToURLAndWait(browser(), test_url); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -2244,7 +2247,7 @@ using WebAppBrowserTest_ManifestId = WebAppBrowserTest; IN_PROC_BROWSER_TEST_F(WebAppBrowserTest_ManifestId, NoManifestId) { - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser()); auto* provider = WebAppProvider::GetForTest(profile()); @@ -2312,7 +2315,7 @@ "/banners/" "manifest_test_page.html?manifest=manifest_with_file_handlers.json")); - NavigateToURLAndWait(browser(), app_url); + NavigateViaLinkClickToURLAndWait(browser(), app_url); // Wait for OS hooks and installation to complete. SetAutoAcceptWebAppDialogForTesting(true, true); @@ -2411,7 +2414,7 @@ "/banners/" "manifest_test_page.html?manifest=manifest_with_file_handlers.json")); - NavigateToURLAndWait(browser(), app_url); + NavigateViaLinkClickToURLAndWait(browser(), app_url); // Wait for OS hooks and installation to complete. SetAutoAcceptWebAppDialogForTesting(true, true); @@ -2463,7 +2466,7 @@ IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, PRE_UninstallIncompleteUninstall) { auto* provider = WebAppProvider::GetForTest(profile()); - NavigateToURLAndWait(browser(), GetInstallableAppURL()); + NavigateViaLinkClickToURLAndWait(browser(), GetInstallableAppURL()); // Wait for OS hooks and installation to complete and the app to launch. base::RunLoop run_loop_install; @@ -2533,7 +2536,7 @@ const GURL app_url = GetSecureAppURL(); InstallPWA(app_url); - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); content::WebContents* tab_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_EQ(tab_contents->GetLastCommittedURL(), app_url);
diff --git a/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc b/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc index ddaca20..9825e215 100644 --- a/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_controller_browsertest.cc
@@ -141,7 +141,7 @@ EXPECT_TRUE(new_contents); WaitForLoadStop(new_contents); - EXPECT_EQ(url, new_contents->GetLastCommittedURL()); + EXPECT_EQ(url, contents->GetController().GetLastCommittedEntry()->GetURL()); EXPECT_EQ( content::PAGE_TYPE_NORMAL, new_contents->GetController().GetLastCommittedEntry()->GetPageType()); @@ -167,7 +167,7 @@ const GURL& url) { auto* manager = webapps::TestAppBannerManagerDesktop::FromWebContents( browser->tab_strip_model()->GetActiveWebContents()); - NavigateToURLAndWait(browser, url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser, url)); return manager->WaitForInstallableCheck(); }
diff --git a/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc b/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc index c477002e..89fd9e1 100644 --- a/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/test/base/ui_test_utils.h" #include "components/embedder_support/switches.h" #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h" #include "content/public/test/browser_test.h" @@ -240,7 +241,7 @@ UpdateAwaiter update_awaiter(provider.install_manager()); serve_token = false; - NavigateToURLAndWait(browser(), GURL(kTestWebAppUrl)); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTestWebAppUrl))); update_awaiter.AwaitUpdate(); }
diff --git a/chrome/browser/ui/web_applications/web_app_engagement_browsertest.cc b/chrome/browser/ui/web_applications/web_app_engagement_browsertest.cc index 666fca5..8a01a9b 100644 --- a/chrome/browser/ui/web_applications/web_app_engagement_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_engagement_browsertest.cc
@@ -205,7 +205,7 @@ webapps::AppId app_id = InstallWebAppAndCountApps(std::move(web_app_info)); Browser* app_browser = LaunchWebAppBrowserAndWait(app_id); - NavigateToURLAndWait(app_browser, example_url); + NavigateViaLinkClickToURLAndWait(app_browser, example_url); EXPECT_EQ(GetAppIdFromApplicationName(app_browser->app_name()), app_id); @@ -239,7 +239,7 @@ Browser* browser = LaunchBrowserForWebAppInTab(app_id); EXPECT_FALSE(browser->app_controller()); - NavigateToURLAndWait(browser, example_url); + NavigateViaLinkClickToURLAndWait(browser, example_url); Histograms histograms; histograms[kHistogramInTab] = true; @@ -277,7 +277,7 @@ EXPECT_EQ(GetAppIdFromApplicationName(browser->app_name()), app_id); EXPECT_TRUE(browser->app_controller()); - NavigateToURLAndWait(browser, example_url); + NavigateViaLinkClickToURLAndWait(browser, example_url); Histograms histograms; histograms[kHistogramInWindow] = true; @@ -373,7 +373,7 @@ Browser* browser = LaunchWebAppBrowserAndWait(app_ids[i]); const GURL url = GetUrlForSuffix(base_url, i); - NavigateToURLAndWait(browser, url); + NavigateViaLinkClickToURLAndWait(browser, url); } Histograms histograms; @@ -413,7 +413,7 @@ // TODO(ericwilligers): Assert app_id was installed by default. Browser* browser = LaunchWebAppBrowserAndWait(*app_id); - NavigateToURLAndWait(browser, example_url); + NavigateViaLinkClickToURLAndWait(browser, example_url); Histograms histograms; histograms[kHistogramInWindow] = true; @@ -425,7 +425,7 @@ ExpectBucketCounts(tester, histograms, site_engagement::EngagementType::kNavigation, 1); ExpectTotalCounts(tester, ~histograms, 0); - NavigateToURLAndWait(browser, example_url); + NavigateViaLinkClickToURLAndWait(browser, example_url); TestEngagementEventsAfterLaunch(histograms, browser); ExpectLaunchCounts(tester, /*windowLaunches=*/1, /*tabLaunches=*/0); } @@ -448,7 +448,7 @@ Browser* browser = LaunchBrowserForWebAppInTab(app_id); EXPECT_FALSE(browser->app_controller()); - NavigateToURLAndWait(browser, start_url); + NavigateViaLinkClickToURLAndWait(browser, start_url); { Histograms histograms; histograms[kHistogramInTab] = true; @@ -458,7 +458,7 @@ } // Navigate away from the web app to an outer simple web site: - NavigateToURLAndWait(browser, outer_url); + NavigateViaLinkClickToURLAndWait(browser, outer_url); { Histograms histograms; histograms[kHistogramUpToThreeUserInstalledApps] = true; @@ -475,7 +475,7 @@ // Launch a non-app tab in default browser. const GURL example_url = embedded_test_server()->GetURL("/banners/no_manifest_test_page.html"); - NavigateToURLAndWait(browser(), example_url); + NavigateViaLinkClickToURLAndWait(browser(), example_url); // Check that no histograms recorded, e.g. no // SiteEngagementService::ENGAGEMENT_WEBAPP_SHORTCUT_LAUNCH.
diff --git a/chrome/browser/ui/web_applications/web_app_launch_handler_browsertest.cc b/chrome/browser/ui/web_applications/web_app_launch_handler_browsertest.cc index 416dde0..574e731 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_handler_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_launch_handler_browsertest.cc
@@ -205,7 +205,7 @@ // start_url again. { GURL alt_url = embedded_test_server()->GetURL("/web_apps/basic.html"); - NavigateToURLAndWait(app_browser, alt_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(app_browser, alt_url)); EXPECT_EQ(app_web_contents->GetLastCommittedURL(), alt_url); Browser* app_browser_2 = LaunchWebAppBrowserAndWait(app_id); @@ -222,7 +222,7 @@ chrome::NewTab(browser()); EXPECT_EQ(browser()->tab_strip_model()->count(), 2); - NavigateToURLAndWait(browser(), start_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), start_url)); ReparentWebAppForActiveTab(browser()); EXPECT_EQ(browser()->tab_strip_model()->count(), 1); @@ -259,7 +259,7 @@ // next launch doesn't navigate to start_url. { GURL in_scope_url = embedded_test_server()->GetURL("/web_apps/basic.html"); - NavigateToURLAndWait(browser_1, in_scope_url); + NavigateViaLinkClickToURLAndWait(browser_1, in_scope_url); EXPECT_EQ(web_contents->GetLastCommittedURL(), in_scope_url); ASSERT_TRUE(SetUpNextLaunchParamsTargetUrlPromise(browser_1)); @@ -274,7 +274,7 @@ // the next launch does navigate to start_url. { GURL out_of_scope_url = embedded_test_server()->GetURL("/empty.html"); - NavigateToURLAndWait(browser_1, out_of_scope_url); + NavigateViaLinkClickToURLAndWait(browser_1, out_of_scope_url); EXPECT_EQ(web_contents->GetLastCommittedURL(), out_of_scope_url); Browser* browser_2 = LaunchWebAppBrowserAndWait(app_id); @@ -415,7 +415,7 @@ // initial navigation. Browser* app_browser = LaunchWebAppBrowserAndWait(app_id); GURL out_of_scope_url = embedded_test_server()->GetURL("/empty.html"); - NavigateToURLAndWait(app_browser, out_of_scope_url); + NavigateViaLinkClickToURLAndWait(app_browser, out_of_scope_url); content::WebContents* web_contents = app_browser->tab_strip_model()->GetActiveWebContents(); EXPECT_EQ(web_contents->GetLastCommittedURL(), out_of_scope_url); @@ -642,7 +642,7 @@ UpdateAwaiter update_awaiter(provider.install_manager()); serve_token = false; - NavigateToURLAndWait(browser(), GURL(kTestWebAppUrl)); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTestWebAppUrl))); update_awaiter.AwaitUpdate(); }
diff --git a/chrome/browser/ui/web_applications/web_app_tab_restore_browsertest.cc b/chrome/browser/ui/web_applications/web_app_tab_restore_browsertest.cc index 697ce27..0a476e82 100644 --- a/chrome/browser/ui/web_applications/web_app_tab_restore_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_tab_restore_browsertest.cc
@@ -37,7 +37,7 @@ Browser* const app_browser = LaunchWebAppBrowserAndWait(test_web_app_id()); EXPECT_TRUE(AppBrowserController::IsWebApp(app_browser)); - NavigateToURLAndWait(app_browser, test_web_app_start_url()); + NavigateViaLinkClickToURLAndWait(app_browser, test_web_app_start_url()); const gfx::Rect bounds = gfx::Rect(50, 50, 550, 500); app_browser->window()->SetBounds(bounds);
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc index 3ea0880..b73613d 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
@@ -11,8 +11,7 @@ namespace { bool IsConsent(PrivacySandboxService::PromptType prompt_type) { - return prompt_type == PrivacySandboxService::PromptType::kConsent || - prompt_type == PrivacySandboxService::PromptType::kM1Consent; + return prompt_type == PrivacySandboxService::PromptType::kM1Consent; } bool IsRestrictedNotice(PrivacySandboxService::PromptType prompt_type) { @@ -114,11 +113,7 @@ } case PrivacySandboxService::PromptAction::kConsentAccepted: case PrivacySandboxService::PromptAction::kConsentDeclined: { - // Close the dialog after consent was resolved only for trials consent - // (kConsent). In case of kM1Consent, a notice step will be shown after - // the consent decision. - if (prompt_type_ == PrivacySandboxService::PromptType::kConsent) - CloseDialog(); + did_user_make_decision_ = true; break; } default: @@ -144,18 +139,6 @@ const base::Value::List& args) { AllowJavascript(); - // Notify the service that the DOM was loaded and the dialog was shown to - // user. Only for trials prompt types, other prompt types are handled in web - // UI. - if (prompt_type_ == PrivacySandboxService::PromptType::kConsent) { - NotifyServiceAboutPromptAction( - PrivacySandboxService::PromptAction::kConsentShown); - } - if (prompt_type_ == PrivacySandboxService::PromptType::kNotice) { - NotifyServiceAboutPromptAction( - PrivacySandboxService::PromptAction::kNoticeShown); - } - DCHECK(show_dialog_callback_); std::move(show_dialog_callback_).Run(); }
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc index 9ed15b7..7c6beda 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
@@ -46,6 +46,7 @@ web_ui_->set_web_contents(web_contents_.get()); handler_ = CreateHandler(); handler_->set_web_ui(web_ui()); + handler_->RegisterMessages(); handler_->AllowJavascript(); web_ui_->ClearTrackedCalls(); } @@ -71,6 +72,10 @@ EXPECT_CALL(*mock_privacy_sandbox_service(), PromptActionOccurred(expected_action)); ShowDialog(); + base::Value::List args; + args.Append(/*value=*/static_cast<int>(expected_action)); + web_ui()->ProcessWebUIMessage(GURL(), "promptActionOccurred", + std::move(args)); } void IdempotentPromptActionOccurred(const base::Value::List& args) { @@ -122,7 +127,7 @@ base::BindOnce(&MockPrivacySandboxDialogView:: OpenPrivacySandboxAdMeasurementSettings, base::Unretained(dialog_mock())), - PrivacySandboxService::PromptType::kConsent); + PrivacySandboxService::PromptType::kM1Consent); } }; @@ -186,7 +191,7 @@ TEST_F(PrivacySandboxConsentDialogHandlerTest, HandleConsentAccepted) { ShowDialog(PrivacySandboxService::PromptAction::kConsentShown); - EXPECT_CALL(*dialog_mock(), Close()); + EXPECT_CALL(*dialog_mock(), Close()).Times(0); EXPECT_CALL(*mock_privacy_sandbox_service(), PromptActionOccurred( PrivacySandboxService::PromptAction::kConsentAccepted)); @@ -199,14 +204,14 @@ base::Value::List args; args.Append( static_cast<int>(PrivacySandboxService::PromptAction::kConsentAccepted)); - IdempotentPromptActionOccurred(args); + handler()->HandlePromptActionOccurred(args); ASSERT_EQ(0U, web_ui()->call_data().size()); } TEST_F(PrivacySandboxConsentDialogHandlerTest, HandleConsentDeclined) { ShowDialog(PrivacySandboxService::PromptAction::kConsentShown); - EXPECT_CALL(*dialog_mock(), Close()); + EXPECT_CALL(*dialog_mock(), Close()).Times(0); EXPECT_CALL(*mock_privacy_sandbox_service(), PromptActionOccurred( PrivacySandboxService::PromptAction::kConsentDeclined)); @@ -219,7 +224,7 @@ base::Value::List args; args.Append( static_cast<int>(PrivacySandboxService::PromptAction::kConsentDeclined)); - IdempotentPromptActionOccurred(args); + handler()->HandlePromptActionOccurred(args); ASSERT_EQ(0U, web_ui()->call_data().size()); } @@ -259,7 +264,7 @@ base::BindOnce(&MockPrivacySandboxDialogView:: OpenPrivacySandboxAdMeasurementSettings, base::Unretained(dialog_mock())), - PrivacySandboxService::PromptType::kNotice); + PrivacySandboxService::PromptType::kM1NoticeROW); } };
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc index c780aba..cba33e3 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.cc
@@ -207,8 +207,6 @@ base::OnceClosure open_measurement_settings_callback, PrivacySandboxService::PromptType prompt_type) { base::Value::Dict update; - update.Set("isConsent", - prompt_type == PrivacySandboxService::PromptType::kConsent); content::WebUIDataSource::Update( profile, chrome::kChromeUIPrivacySandboxDialogHost, std::move(update)); auto handler = std::make_unique<PrivacySandboxDialogHandler>(
diff --git a/chrome/browser/web_applications/alternative_error_page_override_info_browsertest.cc b/chrome/browser/web_applications/alternative_error_page_override_info_browsertest.cc index 2384a3b..9404f48 100644 --- a/chrome/browser/web_applications/alternative_error_page_override_info_browsertest.cc +++ b/chrome/browser/web_applications/alternative_error_page_override_info_browsertest.cc
@@ -41,7 +41,7 @@ content::ScopedContentBrowserClientSetting setting(&browser_client); const GURL app_url = embedded_test_server()->GetURL(html); - web_app::NavigateToURLAndWait(browser(), app_url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), app_url); web_app::test::InstallPwaForCurrentUrl(browser()); content::BrowserContext* context = browser()->profile(); @@ -140,7 +140,7 @@ ASSERT_TRUE(embedded_test_server()->Start()); const GURL app_url = embedded_test_server()->GetURL("/title1.html"); - web_app::NavigateToURLAndWait(browser(), app_url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), app_url); web_app::test::InstallPwaForCurrentUrl(browser()); content::BrowserContext* context = browser()->profile(); @@ -164,7 +164,7 @@ const GURL app_url = embedded_test_server()->GetURL( "/banners/" "manifest_test_page.html?manifest=manifest_one_icon.json"); - web_app::NavigateToURLAndWait(browser(), app_url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), app_url); web_app::test::InstallPwaForCurrentUrl(browser()); Profile* profile = browser()->profile(); web_app::WebAppProvider* web_app_provider =
diff --git a/chrome/browser/web_applications/chromeos_web_app_experiments_browsertest.cc b/chrome/browser/web_applications/chromeos_web_app_experiments_browsertest.cc index 759ea007..f11248f 100644 --- a/chrome/browser/web_applications/chromeos_web_app_experiments_browsertest.cc +++ b/chrome/browser/web_applications/chromeos_web_app_experiments_browsertest.cc
@@ -84,7 +84,7 @@ // Check that the out of scope banner doesn't show after navigating to the // different scope in the web app window. Browser* app_browser = LaunchWebAppBrowser(app_id_); - NavigateToURLAndWait(app_browser, extended_scope_page_); + NavigateViaLinkClickToURLAndWait(app_browser, extended_scope_page_); EXPECT_FALSE(app_browser->app_controller()->ShouldShowCustomTabBar()); }
diff --git a/chrome/browser/web_applications/commands/compute_app_size_command_browsertest.cc b/chrome/browser/web_applications/commands/compute_app_size_command_browsertest.cc index 8acf952..a3b001e 100644 --- a/chrome/browser/web_applications/commands/compute_app_size_command_browsertest.cc +++ b/chrome/browser/web_applications/commands/compute_app_size_command_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/test/run_until.h" #include "base/test/test_future.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" @@ -9,6 +10,7 @@ #include "chrome/browser/web_applications/commands/compute_app_size_command.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -22,7 +24,7 @@ GURL app_url = embedded_test_server()->GetURL("/web_apps/basic.html"); webapps::AppId app_id = InstallWebAppFromPage(browser(), app_url); - NavigateToURLAndWait(browser(), app_url); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), app_url)); const char* script = R"( localStorage.setItem('data', 'data'.repeat(5000)); @@ -38,7 +40,6 @@ // renderer process. As updates to quota manager usage occurs on a different // sequence to this procress, it requires multiple events. Due to all of this, // we are resorting to polling for non-zero values. - while (true) { base::test::TestFuture<absl::optional<ComputeAppSizeCommand::Size>> app_size;
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager.h b/chrome/browser/web_applications/policy/web_app_policy_manager.h index 51ec2eb..de2a16d 100644 --- a/chrome/browser/web_applications/policy/web_app_policy_manager.h +++ b/chrome/browser/web_applications/policy/web_app_policy_manager.h
@@ -116,7 +116,7 @@ bool allow_close_and_relaunch = false); private: - friend class WebAppPolicyManagerTest; + friend class WebAppPolicyManagerTestBase; struct WebAppSetting { bool Parse(const base::Value::Dict& dict, bool for_default_settings);
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc b/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc index ef2eccac..aea14bd 100644 --- a/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc +++ b/chrome/browser/web_applications/policy/web_app_policy_manager_unittest.cc
@@ -330,31 +330,16 @@ } // namespace -enum class TestLacrosParam { kLacrosDisabled, kLacrosEnabled }; - -enum class PreventCloseStatus { - kPreventCloseEnabled, - kPreventCloseDisabled, - kPreventCloseDefault -}; - -struct TestParam { - TestLacrosParam lacros_params; - PreventCloseStatus prevent_close_status; -}; - -class WebAppPolicyManagerTest : public ChromeRenderViewHostTestHarness, - public testing::WithParamInterface<TestParam> { +class WebAppPolicyManagerTestBase : public ChromeRenderViewHostTestHarness { public: - WebAppPolicyManagerTest() + WebAppPolicyManagerTestBase() : testing_local_state_(TestingBrowserProcess::GetGlobal()) {} - WebAppPolicyManagerTest(const WebAppPolicyManagerTest&) = delete; - WebAppPolicyManagerTest& operator=(const WebAppPolicyManagerTest&) = delete; - ~WebAppPolicyManagerTest() override = default; + WebAppPolicyManagerTestBase(const WebAppPolicyManagerTestBase&) = delete; + WebAppPolicyManagerTestBase& operator=(const WebAppPolicyManagerTestBase&) = + delete; + ~WebAppPolicyManagerTestBase() override = default; void SetUp() override { - BuildAndInitFeatureList(); - #if BUILDFLAG(IS_CHROMEOS_ASH) // Set up user manager to so that Lacros mode can be enabled. // Need to run the ChromeRenderViewHostTestHarness::SetUp() after the fake @@ -435,11 +420,6 @@ #endif test::AwaitStartWebAppProviderAndSubsystems(profile()); - -#if BUILDFLAG(IS_CHROMEOS_ASH) - ASSERT_EQ(GetParam().lacros_params == TestLacrosParam::kLacrosEnabled, - crosapi::browser_util::IsLacrosEnabled()); -#endif } void TearDown() override { @@ -468,34 +448,6 @@ } protected: - void BuildAndInitFeatureList() { - std::vector<base::test::FeatureRef> enabled_features; - std::vector<base::test::FeatureRef> disabled_features; - enabled_features.push_back( - features::kDesktopPWAsEnforceWebAppSettingsPolicy); -#if BUILDFLAG(IS_CHROMEOS_ASH) - std::vector<base::test::FeatureRef> lacros_flags = - ash::standalone_browser::GetFeatureRefs(); - if (GetParam().lacros_params == TestLacrosParam::kLacrosEnabled) { - base::Extend(enabled_features, lacros_flags); - } else if (GetParam().lacros_params == TestLacrosParam::kLacrosDisabled) { - base::Extend(disabled_features, lacros_flags); - } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - - enabled_features.push_back( - features::kDesktopPWAsEnforceWebAppSettingsPolicy); - if (GetParam().prevent_close_status == - PreventCloseStatus::kPreventCloseEnabled) { - enabled_features.push_back(features::kDesktopPWAsPreventClose); - } else if (GetParam().prevent_close_status == - PreventCloseStatus::kPreventCloseDisabled) { - disabled_features.push_back(features::kDesktopPWAsPreventClose); - } - - scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); - } - void InstallPwa(const std::string& url) { std::unique_ptr<WebAppInstallInfo> web_app_info = std::make_unique<WebAppInstallInfo>( @@ -504,15 +456,6 @@ web_app::test::InstallWebApp(profile(), std::move(web_app_info)); } - bool ShouldSkipPWASpecificTest() { -#if BUILDFLAG(IS_CHROMEOS_ASH) - if (GetParam().lacros_params == TestLacrosParam::kLacrosEnabled) { - return true; - } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - return false; - } - #if BUILDFLAG(IS_CHROMEOS_ASH) ash::TestSystemWebAppManager& system_app_manager() { return *test_system_app_manager_; @@ -589,6 +532,55 @@ std::unique_ptr<ash::TestSystemWebAppManager> test_system_app_manager_; std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; #endif +}; + +class WebAppPolicyManagerTest : public WebAppPolicyManagerTestBase, + public testing::WithParamInterface<bool> { + public: + WebAppPolicyManagerTest() = default; + WebAppPolicyManagerTest(const WebAppPolicyManagerTest&) = delete; + WebAppPolicyManagerTest& operator=(const WebAppPolicyManagerTest&) = delete; + ~WebAppPolicyManagerTest() override = default; + + void SetUp() override { + BuildAndInitFeatureList(); + WebAppPolicyManagerTestBase::SetUp(); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + ASSERT_EQ(LacrosEnabledParam(), crosapi::browser_util::IsLacrosEnabled()); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + } + + bool ShouldSkipPWASpecificTest() { +#if BUILDFLAG(IS_CHROMEOS_ASH) + if (LacrosEnabledParam()) { + return true; + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + return false; + } + + bool LacrosEnabledParam() const { return GetParam(); } + + private: + void BuildAndInitFeatureList() { + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + +#if BUILDFLAG(IS_CHROMEOS_ASH) + std::vector<base::test::FeatureRef> lacros_flags = + ash::standalone_browser::GetFeatureRefs(); + + if (LacrosEnabledParam()) { + base::Extend(enabled_features, std::move(lacros_flags)); + } else { + base::Extend(disabled_features, std::move(lacros_flags)); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); + } + base::test::ScopedFeatureList scoped_feature_list_; }; @@ -1450,10 +1442,61 @@ app_registrar().RemoveObserver(&mock_observer); } -TEST_P(WebAppPolicyManagerTest, WebAppSettingsPreventClose) { - if (ShouldSkipPWASpecificTest()) { - return; +INSTANTIATE_TEST_SUITE_P(WebAppPolicyManagerTestWithParams, + WebAppPolicyManagerTest, + testing::Values( +#if BUILDFLAG(IS_CHROMEOS_ASH) + false, +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + true), + [](const ::testing::TestParamInfo<bool>& info) { + std::string test_name = "Test_"; + + if (info.param) { + test_name.append("LacrosDisabled"); + } else { + test_name.append("LacrosEnabled"); + } + + return test_name; + }); + +class WebAppPolicyManagerPreventCloseTest + : public WebAppPolicyManagerTestBase, + public testing::WithParamInterface<bool> { + public: + WebAppPolicyManagerPreventCloseTest() = default; + WebAppPolicyManagerPreventCloseTest( + const WebAppPolicyManagerPreventCloseTest&) = delete; + WebAppPolicyManagerPreventCloseTest& operator=( + const WebAppPolicyManagerPreventCloseTest&) = delete; + ~WebAppPolicyManagerPreventCloseTest() override = default; + + void SetUp() override { + BuildAndInitFeatureList(); + WebAppPolicyManagerTestBase::SetUp(); } + + bool PreventCloseEnabledParam() const { return GetParam(); } + + private: + void BuildAndInitFeatureList() { + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + + if (PreventCloseEnabledParam()) { + enabled_features.push_back(features::kDesktopPWAsPreventClose); + } else { + disabled_features.push_back(features::kDesktopPWAsPreventClose); + } + + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); + } + + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_P(WebAppPolicyManagerPreventCloseTest, WebAppSettingsPreventClose) { const char kWebAppSettingConfiguration[] = R"([ { "manifest_id": "*", @@ -1497,74 +1540,35 @@ SetWebAppSettingsListPref(profile(), kWebAppSettingConfiguration); loop.Run(); -#if BUILDFLAG(IS_CHROMEOS) - if (GetParam().prevent_close_status == - PreventCloseStatus::kPreventCloseEnabled || - GetParam().prevent_close_status == - PreventCloseStatus::kPreventCloseDefault) { - EXPECT_FALSE(IsPreventCloseEnabled(kWildcardUrl)); - EXPECT_TRUE(IsPreventCloseEnabled(kWindowedUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kTabbedUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kNoContainerUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kAllowedUrl)); - } else { - EXPECT_FALSE(IsPreventCloseEnabled(kWildcardUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kWindowedUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kTabbedUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kNoContainerUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kAllowedUrl)); - } -#else EXPECT_FALSE(IsPreventCloseEnabled(kWildcardUrl)); - EXPECT_FALSE(IsPreventCloseEnabled(kWindowedUrl)); EXPECT_FALSE(IsPreventCloseEnabled(kTabbedUrl)); EXPECT_FALSE(IsPreventCloseEnabled(kNoContainerUrl)); EXPECT_FALSE(IsPreventCloseEnabled(kAllowedUrl)); + + bool expected_windowed_url_status = false; +#if BUILDFLAG(IS_CHROMEOS) + if (PreventCloseEnabledParam()) { + expected_windowed_url_status = true; + } #endif // BUILDFLAG(IS_CHROMEOS) + + EXPECT_EQ(IsPreventCloseEnabled(kWindowedUrl), expected_windowed_url_status); } -INSTANTIATE_TEST_SUITE_P( - WebAppPolicyManagerTestWithParams, - WebAppPolicyManagerTest, - testing::Values( -#if BUILDFLAG(IS_CHROMEOS_ASH) - TestParam({TestLacrosParam::kLacrosDisabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseDisabled}), - TestParam({TestLacrosParam::kLacrosDisabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseEnabled}), - TestParam({TestLacrosParam::kLacrosDisabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseDefault}), -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - TestParam({TestLacrosParam::kLacrosEnabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseDisabled}), - TestParam({TestLacrosParam::kLacrosEnabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseEnabled}), - TestParam({TestLacrosParam::kLacrosEnabled, - /*prevent_close_status=*/PreventCloseStatus:: - kPreventCloseDefault})), - [](const ::testing::TestParamInfo<TestParam>& info) { - std::string test_name = "Test_"; - if (info.param.lacros_params == TestLacrosParam::kLacrosEnabled) - test_name.append("LacrosEnabled_"); - else - test_name.append("LacrosDisabled_"); +INSTANTIATE_TEST_SUITE_P(WebAppPolicyManagerPreventCloseTestWithParams, + WebAppPolicyManagerPreventCloseTest, + testing::Bool(), + [](const ::testing::TestParamInfo<bool>& info) { + std::string test_name = "Test_"; - if (info.param.prevent_close_status == - PreventCloseStatus::kPreventCloseEnabled) { - test_name.append("PreventCloseEnabled"); - } else if (info.param.prevent_close_status == - PreventCloseStatus::kPreventCloseDisabled) { - test_name.append("PreventCloseDisabled"); - } else { - test_name.append("PreventCloseDefault"); - } - return test_name; - }); + if (info.param) { + test_name.append("PreventCloseEnabled"); + } else { + test_name.append("PreventCloseDisabled"); + } + + return test_name; + }); class WebAppPolicyForceUnregistrationTest : public WebAppTest { public:
diff --git a/chrome/browser/web_applications/web_app_scope_extensions_browsertest.cc b/chrome/browser/web_applications/web_app_scope_extensions_browsertest.cc index a8f4c089..43b2c8d 100644 --- a/chrome/browser/web_applications/web_app_scope_extensions_browsertest.cc +++ b/chrome/browser/web_applications/web_app_scope_extensions_browsertest.cc
@@ -136,7 +136,7 @@ bool WebAppCapturesUrl(const GURL& url) { CHECK_NE(url, unrelated_url_); - NavigateToURLAndWait(browser(), unrelated_url_); + NavigateViaLinkClickToURLAndWait(browser(), unrelated_url_); ui_test_utils::BrowserChangeObserver browser_observer( /*browser=*/nullptr, @@ -472,7 +472,7 @@ { UpdateAwaiter update_awaiter(provider.install_manager()); serve_token = false; - NavigateToURLAndWait(browser(), GURL(kTestWebAppUrl)); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kTestWebAppUrl))); update_awaiter.AwaitUpdate(); }
diff --git a/chrome/browser/webapps/web_app_offline_browsertest.cc b/chrome/browser/webapps/web_app_offline_browsertest.cc index 02ccac7..c21401e2 100644 --- a/chrome/browser/webapps/web_app_offline_browsertest.cc +++ b/chrome/browser/webapps/web_app_offline_browsertest.cc
@@ -72,7 +72,7 @@ webapps::AppId StartWebAppAndDisconnect(content::WebContents* web_contents, base::StringPiece relative_url) { GURL target_url(embedded_test_server()->GetURL(relative_url)); - web_app::NavigateToURLAndWait(browser(), target_url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), target_url); webapps::AppId app_id = web_app::test::InstallPwaForCurrentUrl(browser()); WebAppIconWaiter(browser()->profile(), app_id).Wait(); std::unique_ptr<content::URLLoaderInterceptor> interceptor = @@ -91,7 +91,7 @@ GURL target_url(embedded_test_server()->GetURL(relative_url)); web_app::ServiceWorkerRegistrationWaiter registration_waiter( browser()->profile(), target_url); - web_app::NavigateToURLAndWait(browser(), target_url); + web_app::NavigateViaLinkClickToURLAndWait(browser(), target_url); registration_waiter.AwaitRegistration(); webapps::AppId app_id = web_app::test::InstallPwaForCurrentUrl(browser()); WebAppIconWaiter(browser()->profile(), app_id).Wait();
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index 00da537..60d5b8cf 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1702447123-bed2e5fe15bf2185c87941cc65b80896d4126b24.profdata +chrome-android32-main-1702468718-7dc1e9669d2e350d59c2c4b73d525884ecd0a29f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index e8fd13a9..0d5b57a6 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1702447123-a38d1365b5e43a01cd21d9e5b20a6497833bfbd1.profdata +chrome-android64-main-1702468718-d14f174c017a9eaf070c1a4e839aaa11a9d71c5e.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 0a858318..19d53334 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1702461414-8ea1afeac8e596a108ef03d039c19dc2c7531899.profdata +chrome-mac-arm-main-1702483086-7bbf42b776dab76b7931a244ec06b2f865b379d1.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 6465eedb..ab3066d 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1702447123-b3d1bd65b3dc0ca24f49b4e68bb71073949cbf3b.profdata +chrome-mac-main-1702468718-15c4f0aec648c9cb43b7cf070eca0953775364a9.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 99b5135..652d8eb3 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1702447123-78c1140c790c3a9c0e62c2af90cbd845e5349689.profdata +chrome-win-arm64-main-1702468718-c2ab362a330f9f4c30dcdc83343a9782263d2d48.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 03428c2..da303d2 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1702447123-a31776760bdc4ea37f254d84b09aee737ef69edc.profdata +chrome-win32-main-1702457874-89852cf4204d6dc3d909debc9b50d95e9d2061a3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index a04c736f..89317f4 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1702447123-9223de7885538ed24977d864c1dd4a142590be3f.profdata +chrome-win64-main-1702468718-e4d619197fb610ea698aef3809335eace0971d1a.profdata
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn index 38c521d5..fc2f17f 100644 --- a/chrome/installer/linux/BUILD.gn +++ b/chrome/installer/linux/BUILD.gn
@@ -449,7 +449,7 @@ } else if (current_cpu == "mips64el") { deb_arch = "mips64el" } else if (current_cpu == "loong64") { - deb_arch = "loongarch64" + deb_arch = "loong64" } else { assert(false, "Linux installer not configured for this architecture.") }
diff --git a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc index 23ae829..f841c3a 100644 --- a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc +++ b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc
@@ -26,13 +26,20 @@ // Create simple AXTreeUpdate with a root node and 3 children. ui::AXTreeUpdate snapshot; - snapshot.root_id = 1; - snapshot.nodes.resize(4); - snapshot.nodes[0].id = 1; - snapshot.nodes[0].child_ids = {2, 3, 4}; - snapshot.nodes[1].id = 2; - snapshot.nodes[2].id = 3; - snapshot.nodes[3].id = 4; + ui::AXNodeData node1; + node1.id = 2; + + ui::AXNodeData node2; + node2.id = 3; + + ui::AXNodeData node3; + node3.id = 4; + + ui::AXNodeData root; + root.id = 1; + root.child_ids = {node1.id, node2.id, node3.id}; + snapshot.root_id = root.id; + snapshot.nodes = {root, node1, node2, node3}; SetUpdateTreeID(&snapshot); AccessibilityEventReceived({snapshot}); @@ -50,17 +57,19 @@ // Send update for main web content with child tree (pdf web contents). ui::AXTreeUpdate main_web_contents_update; SetUpdateTreeID(&main_web_contents_update); - main_web_contents_update.nodes.resize(1); - main_web_contents_update.nodes[0].id = 1; - main_web_contents_update.nodes[0].AddChildTreeId(pdf_web_contents_tree_id); + ui::AXNodeData node; + node.id = 1; + node.AddChildTreeId(pdf_web_contents_tree_id); + main_web_contents_update.nodes = {node}; AccessibilityEventReceived({main_web_contents_update}); // Send update for pdf web contents with child tree (iframe). ui::AXTreeUpdate pdf_web_contents_update; - pdf_web_contents_update.nodes.resize(1); - pdf_web_contents_update.root_id = 1; - pdf_web_contents_update.nodes[0].id = 1; - pdf_web_contents_update.nodes[0].AddChildTreeId(pdf_iframe_tree_id); + ui::AXNodeData pdf_node; + pdf_node.id = 1; + pdf_node.AddChildTreeId(pdf_iframe_tree_id); + pdf_web_contents_update.root_id = pdf_node.id; + pdf_web_contents_update.nodes = {pdf_node}; SetUpdateTreeID(&pdf_web_contents_update, pdf_web_contents_tree_id); AccessibilityEventReceived({pdf_web_contents_update}); @@ -264,13 +273,19 @@ TEST_F(ReadAnythingAppModelTest, IsNodeIgnoredForReadAnything) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(3); - update.nodes[0].id = 2; - update.nodes[1].id = 3; - update.nodes[2].id = 4; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kComboBoxGrouping; - update.nodes[2].role = ax::mojom::Role::kButton; + ui::AXNodeData static_text_node; + static_text_node.id = 2; + static_text_node.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData combobox_node; + combobox_node.id = 3; + combobox_node.role = ax::mojom::Role::kComboBoxGrouping; + + ui::AXNodeData button_node; + button_node.id = 4; + button_node.role = ax::mojom::Role::kButton; + update.nodes = {static_text_node, combobox_node, button_node}; + AccessibilityEventReceived({update}); EXPECT_EQ(false, IsNodeIgnoredForReadAnything(2)); EXPECT_EQ(true, IsNodeIgnoredForReadAnything(3)); @@ -281,13 +296,19 @@ IsNodeIgnoredForReadAnything_TextFieldsNotIgnored) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(3); - update.nodes[0].id = 2; - update.nodes[1].id = 3; - update.nodes[2].id = 4; - update.nodes[0].role = ax::mojom::Role::kTree; - update.nodes[1].role = ax::mojom::Role::kTextFieldWithComboBox; - update.nodes[2].role = ax::mojom::Role::kTextField; + ui::AXNodeData tree_node; + tree_node.id = 2; + tree_node.role = ax::mojom::Role::kTree; + + ui::AXNodeData textfield_with_combobox_node; + textfield_with_combobox_node.id = 3; + textfield_with_combobox_node.role = ax::mojom::Role::kTextFieldWithComboBox; + + ui::AXNodeData textfield_node; + textfield_node.id = 4; + textfield_node.role = ax::mojom::Role::kTextField; + update.nodes = {tree_node, textfield_with_combobox_node, textfield_node}; + AccessibilityEventReceived({update}); EXPECT_EQ(true, IsNodeIgnoredForReadAnything(2)); EXPECT_EQ(false, IsNodeIgnoredForReadAnything(3)); @@ -302,23 +323,33 @@ // node child) to mark page start/end. ui::AXTreeUpdate update; SetUpdateTreeID(&update, pdf_iframe_tree_id); - update.root_id = 1; - update.nodes.resize(5); - update.nodes[0].id = 1; - update.nodes[0].child_ids = {2, 4}; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[4].id = 5; - update.nodes[1].child_ids = {3}; - update.nodes[3].child_ids = {5}; - update.nodes[0].role = ax::mojom::Role::kPdfRoot; - update.nodes[1].role = ax::mojom::Role::kBanner; - update.nodes[2].role = ax::mojom::Role::kStaticText; - update.nodes[2].SetNameChecked(string_constants::kPDFPageStart); - update.nodes[3].role = ax::mojom::Role::kContentInfo; - update.nodes[4].role = ax::mojom::Role::kStaticText; - update.nodes[4].SetNameChecked(string_constants::kPDFPageEnd); + ui::AXNodeData banner_node; + banner_node.id = 2; + banner_node.role = ax::mojom::Role::kBanner; + + ui::AXNodeData static_text_start_node; + static_text_start_node.id = 3; + static_text_start_node.role = ax::mojom::Role::kStaticText; + static_text_start_node.SetNameChecked(string_constants::kPDFPageStart); + banner_node.child_ids = {static_text_start_node.id}; + + ui::AXNodeData content_info_node; + content_info_node.id = 4; + content_info_node.role = ax::mojom::Role::kContentInfo; + + ui::AXNodeData static_text_end_node; + static_text_end_node.id = 5; + static_text_end_node.role = ax::mojom::Role::kStaticText; + static_text_end_node.SetNameChecked(string_constants::kPDFPageEnd); + content_info_node.child_ids = {static_text_end_node.id}; + + ui::AXNodeData root; + root.id = 1; + root.child_ids = {banner_node.id, content_info_node.id}; + root.role = ax::mojom::Role::kPdfRoot; + update.root_id = root.id; + update.nodes = {root, banner_node, static_text_start_node, content_info_node, + static_text_end_node}; AccessibilityEventReceived({update}); EXPECT_EQ(true, IsNodeIgnoredForReadAnything(2)); @@ -370,9 +401,10 @@ for (int i = 0; i < 2; i++) { ui::AXTreeUpdate update; SetUpdateTreeID(&update, tree_ids[i]); - update.root_id = 1; - update.nodes.resize(1); - update.nodes[0].id = 1; + ui::AXNodeData node; + node.id = 1; + update.nodes = {node}; + update.root_id = node.id; updates.push_back(update); } @@ -411,9 +443,10 @@ ui::AXTreeID tree_id_2 = ui::AXTreeID::CreateNewAXTreeID(); ui::AXTreeUpdate update_2; SetUpdateTreeID(&update_2, tree_id_2); - update_2.root_id = 1; - update_2.nodes.resize(1); - update_2.nodes[0].id = 1; + ui::AXNodeData node; + node.id = 1; + update_2.root_id = node.id; + update_2.nodes = {node}; // Updates on inactive trees are processed immediately and are not marked as // pending. @@ -446,12 +479,15 @@ ui::AXTreeUpdate update; SetUpdateTreeID(&update); update.root_id = 1; - update.nodes.resize(2); - update.nodes[0].id = 1; - update.nodes[0].child_ids = child_ids; - update.nodes[1].id = id; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[1].SetNameChecked(base::NumberToString(id)); + ui::AXNodeData root; + root.id = 1; + root.child_ids = child_ids; + + ui::AXNodeData node; + node.id = id; + node.role = ax::mojom::Role::kStaticText; + node.SetNameChecked(base::NumberToString(id)); + update.nodes = {root, node}; updates.push_back(update); } @@ -498,13 +534,16 @@ ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.root_id = 1; - update.nodes.resize(2); - update.nodes[0].id = 1; - update.nodes[0].child_ids = child_ids; - update.nodes[1].id = id; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[1].SetNameChecked(base::NumberToString(id)); + ui::AXNodeData root; + root.id = 1; + root.child_ids = child_ids; + + ui::AXNodeData node; + node.id = id; + node.role = ax::mojom::Role::kStaticText; + node.SetNameChecked(base::NumberToString(id)); + update.root_id = root.id; + update.nodes = {root, node}; updates.push_back(update); } @@ -548,13 +587,16 @@ ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.root_id = 1; - update.nodes.resize(2); - update.nodes[0].id = 1; - update.nodes[0].child_ids = child_ids; - update.nodes[1].id = id; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[1].SetNameChecked(base::NumberToString(id)); + ui::AXNodeData root; + root.id = 1; + root.child_ids = child_ids; + + ui::AXNodeData node; + node.id = id; + node.role = ax::mojom::Role::kStaticText; + node.SetNameChecked(base::NumberToString(id)); + update.root_id = root.id; + update.nodes = {root, node}; updates.push_back(update); } @@ -592,13 +634,16 @@ ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.root_id = 1; - update.nodes.resize(2); - update.nodes[0].id = 1; - update.nodes[0].child_ids = child_ids; - update.nodes[1].id = id; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[1].SetNameChecked(base::NumberToString(id)); + ui::AXNodeData root; + root.id = 1; + root.child_ids = child_ids; + + ui::AXNodeData node; + node.id = id; + node.role = ax::mojom::Role::kStaticText; + node.SetNameChecked(base::NumberToString(id)); + update.root_id = root.id; + update.nodes = {root, node}; updates.push_back(update); } @@ -628,21 +673,25 @@ ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.root_id = 1; - update.nodes.resize(2); - update.nodes[0].id = 1; - update.nodes[0].child_ids = child_ids; - update.nodes[1].id = id; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[1].SetNameChecked(base::NumberToString(id)); + ui::AXNodeData root; + root.id = 1; + root.child_ids = child_ids; + + ui::AXNodeData node; + node.id = id; + node.role = ax::mojom::Role::kStaticText; + node.SetNameChecked(base::NumberToString(id)); + update.root_id = root.id; + update.nodes = {root, node}; updates.push_back(update); } // Create an update which has no tree id. ui::AXTreeUpdate update; - update.nodes.resize(1); - update.nodes[0].id = 1; - update.nodes[0].role = ax::mojom::Role::kGenericContainer; + ui::AXNodeData node; + node.id = 1; + node.role = ax::mojom::Role::kGenericContainer; + update.nodes = {node}; updates.push_back(update); // Add the three updates. @@ -660,11 +709,17 @@ TEST_F(ReadAnythingAppModelTest, DisplayNodeIdsContains_ContentNodes) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(3); - update.nodes[0].id = 4; - update.nodes[0].child_ids = {5, 6}; - update.nodes[1].id = 5; - update.nodes[2].id = 6; + ui::AXNodeData node1; + node1.id = 5; + + ui::AXNodeData node2; + node2.id = 6; + + ui::AXNodeData parent_node; + parent_node.id = 4; + parent_node.child_ids = {node1.id, node2.id}; + update.nodes = {parent_node, node1, node2}; + // This update changes the structure of the tree. When the controller receives // it in AccessibilityEventReceived, it will re-distill the tree. AccessibilityEventReceived({update}); @@ -729,11 +784,17 @@ // Initial state. ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(3); - update.nodes[0].id = 4; - update.nodes[0].child_ids = {5, 6}; - update.nodes[1].id = 5; - update.nodes[2].id = 6; + ui::AXNodeData node1; + node1.id = 5; + + ui::AXNodeData node2; + node2.id = 6; + + ui::AXNodeData root; + root.id = 4; + root.child_ids = {node1.id, node2.id}; + update.nodes = {root, node1, node2}; + AccessibilityEventReceived({update}); ProcessDisplayNodes({3, 4}); SetDistillationInProgress(true); @@ -857,21 +918,41 @@ StartAndEndNodesHaveDifferentParents_SelectionStateCorrect) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(6); - update.nodes[0].id = 1; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[4].id = 5; - update.nodes[5].id = 6; - update.nodes[0].child_ids = {2, 3, 4}; - update.nodes[3].child_ids = {5, 6}; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kStaticText; - update.nodes[3].role = ax::mojom::Role::kGenericContainer; - update.nodes[4].role = ax::mojom::Role::kStaticText; - update.nodes[5].role = ax::mojom::Role::kStaticText; + + ui::AXNodeData static_text_node1; + static_text_node1.id = 2; + static_text_node1.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData static_text_node2; + static_text_node2.id = 3; + static_text_node2.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData generic_container_node; + generic_container_node.id = 4; + generic_container_node.role = ax::mojom::Role::kGenericContainer; + + ui::AXNodeData static_text_child_node1; + static_text_child_node1.id = 5; + static_text_child_node1.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData static_text_child_node2; + static_text_child_node2.id = 6; + static_text_child_node2.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData parent_node; + parent_node.id = 1; + parent_node.child_ids = {static_text_node1.id, static_text_node2.id, + generic_container_node.id}; + parent_node.role = ax::mojom::Role::kStaticText; + generic_container_node.child_ids = {static_text_child_node1.id, + static_text_child_node2.id}; + update.nodes = {parent_node, + static_text_node1, + static_text_node2, + generic_container_node, + static_text_child_node1, + static_text_child_node2}; + AccessibilityEventReceived({update}); update.tree_data.sel_anchor_object_id = 2; @@ -903,21 +984,29 @@ SelectionParentIsLinkAndInlineBlock_SelectionStateCorrect) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(4); - update.nodes[0].id = 1; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[0].child_ids = {2, 3}; - update.nodes[2].child_ids = {4}; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kLink; - update.nodes[2].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "block"); - update.nodes[3].role = ax::mojom::Role::kStaticText; - update.nodes[3].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "inline-block"); + + ui::AXNodeData static_text_node; + static_text_node.id = 2; + static_text_node.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData link_node; + link_node.id = 3; + link_node.role = ax::mojom::Role::kLink; + link_node.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, "block"); + + ui::AXNodeData inline_block_node; + inline_block_node.id = 4; + inline_block_node.role = ax::mojom::Role::kStaticText; + inline_block_node.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, + "inline-block"); + link_node.child_ids = {inline_block_node.id}; + + ui::AXNodeData root; + root.id = 1; + root.child_ids = {static_text_node.id, link_node.id}; + root.role = ax::mojom::Role::kStaticText; + update.nodes = {root, static_text_node, link_node, inline_block_node}; + AccessibilityEventReceived({update}); update.tree_data.sel_anchor_object_id = 4; @@ -942,21 +1031,30 @@ SelectionParentIsListItem_SelectionStateCorrect) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(4); - update.nodes[0].id = 1; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[0].child_ids = {2, 3}; - update.nodes[2].child_ids = {4}; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kLink; - update.nodes[2].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "block"); - update.nodes[3].role = ax::mojom::Role::kStaticText; - update.nodes[3].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "list-item"); + + ui::AXNodeData static_text_node; + static_text_node.id = 2; + static_text_node.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData link_node; + link_node.id = 3; + link_node.role = ax::mojom::Role::kLink; + link_node.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, "block"); + + ui::AXNodeData static_text_list_node; + static_text_list_node.id = 4; + static_text_list_node.role = ax::mojom::Role::kStaticText; + static_text_list_node.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, + "list-item"); + link_node.child_ids = {static_text_list_node.id}; + + ui::AXNodeData parent_node; + parent_node.id = 1; + parent_node.child_ids = {static_text_node.id, link_node.id}; + parent_node.role = ax::mojom::Role::kStaticText; + update.nodes = {parent_node, static_text_node, link_node, + static_text_list_node}; + AccessibilityEventReceived({update}); update.tree_data.sel_anchor_object_id = 4; @@ -981,21 +1079,29 @@ SelectionParentIsGenericContainerAndInline_SelectionStateCorrect) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(4); - update.nodes[0].id = 1; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[0].child_ids = {2, 3}; - update.nodes[2].child_ids = {4}; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kGenericContainer; - update.nodes[2].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "block"); - update.nodes[3].role = ax::mojom::Role::kStaticText; - update.nodes[3].AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - "inline"); + ui::AXNodeData static_text_node; + static_text_node.id = 2; + static_text_node.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData generic_container_node; + generic_container_node.id = 3; + generic_container_node.role = ax::mojom::Role::kGenericContainer; + generic_container_node.AddStringAttribute( + ax::mojom::StringAttribute::kDisplay, "block"); + ui::AXNodeData inline_node; + inline_node.id = 4; + inline_node.role = ax::mojom::Role::kStaticText; + inline_node.AddStringAttribute(ax::mojom::StringAttribute::kDisplay, + "inline"); + generic_container_node.child_ids = {inline_node.id}; + + ui::AXNodeData parent_node; + parent_node.id = 1; + parent_node.child_ids = {static_text_node.id, generic_container_node.id}; + parent_node.role = ax::mojom::Role::kStaticText; + update.nodes = {parent_node, static_text_node, generic_container_node, + inline_node}; + AccessibilityEventReceived({update}); update.tree_data.sel_anchor_object_id = 4; @@ -1020,19 +1126,31 @@ SelectionParentIsGenericContainerWithMultipleChildren_SelectionStateCorrect) { ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.nodes.resize(5); - update.nodes[0].id = 1; - update.nodes[1].id = 2; - update.nodes[2].id = 3; - update.nodes[3].id = 4; - update.nodes[4].id = 5; - update.nodes[0].child_ids = {2, 3}; - update.nodes[2].child_ids = {4, 5}; - update.nodes[0].role = ax::mojom::Role::kStaticText; - update.nodes[1].role = ax::mojom::Role::kStaticText; - update.nodes[2].role = ax::mojom::Role::kGenericContainer; - update.nodes[3].role = ax::mojom::Role::kStaticText; - update.nodes[4].role = ax::mojom::Role::kStaticText; + ui::AXNodeData static_text_node; + static_text_node.id = 2; + static_text_node.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData generic_container_node; + generic_container_node.role = ax::mojom::Role::kGenericContainer; + generic_container_node.id = 3; + + ui::AXNodeData static_text_child_node1; + static_text_child_node1.id = 4; + static_text_child_node1.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData static_text_child_node2; + static_text_child_node2.id = 5; + static_text_child_node2.role = ax::mojom::Role::kStaticText; + generic_container_node.child_ids = {static_text_child_node1.id, + static_text_child_node2.id}; + + ui::AXNodeData parent_node; + parent_node.id = 1; + parent_node.role = ax::mojom::Role::kStaticText; + parent_node.child_ids = {static_text_node.id, generic_container_node.id}; + update.nodes = {parent_node, static_text_node, generic_container_node, + static_text_child_node1, static_text_child_node2}; + AccessibilityEventReceived({update}); update.tree_data.sel_anchor_object_id = 4; @@ -1163,9 +1281,10 @@ // Main web contents should have one child. ui::AXTreeUpdate update; - update.nodes.resize(1); - update.nodes[0].id = 1; - update.nodes[0].AddChildTreeId(pdf_web_contents_tree_id); + ui::AXNodeData node; + node.id = 1; + node.AddChildTreeId(pdf_web_contents_tree_id); + update.nodes = {node}; SetUpdateTreeID(&update); AccessibilityEventReceived({update}); @@ -1174,19 +1293,21 @@ ASSERT_TRUE(IsPDFFormatted()); // Pdf web contents should have one child. - update.nodes.resize(1); - update.root_id = 1; - update.nodes[0].id = 1; - update.nodes[0].AddChildTreeId(pdf_iframe_tree_id); + ui::AXNodeData root; + root.id = 1; + root.AddChildTreeId(pdf_iframe_tree_id); + update.root_id = root.id; + update.nodes = {root}; SetUpdateTreeID(&update, pdf_web_contents_tree_id); AccessibilityEventReceived({update}); ASSERT_TRUE(IsPDFFormatted()); // Send pdf iframe tree to model. - update.nodes.resize(1); - update.root_id = 1; - update.nodes[0].id = 1; + ui::AXNodeData update_root; + update_root.id = 1; + update.root_id = update_root.id; + update.nodes = {update_root}; SetUpdateTreeID(&update, pdf_iframe_tree_id); AccessibilityEventReceived({update}); @@ -1198,17 +1319,20 @@ // Main web contents should have one child, the pdf web contents. ui::AXTreeID pdf_web_contents_tree_id = ui::AXTreeID::CreateNewAXTreeID(); ui::AXTreeUpdate update; - update.nodes.resize(1); - update.nodes[0].id = 1; - update.nodes[0].AddChildTreeId(pdf_web_contents_tree_id); + ui::AXNodeData node; + node.id = 1; + node.AddChildTreeId(pdf_web_contents_tree_id); + update.nodes = {node}; SetUpdateTreeID(&update); AccessibilityEventReceived({update}); // This pdf web contents has no children, so this is an invalid PDF. ui::AXTreeUpdate pdf_web_contents_update; - pdf_web_contents_update.nodes.resize(1); - pdf_web_contents_update.root_id = 1; - pdf_web_contents_update.nodes[0].id = 1; + ui::AXNodeData empty_root; + empty_root.id = 1; + pdf_web_contents_update.root_id = empty_root.id; + pdf_web_contents_update.nodes = {empty_root}; + SetUpdateTreeID(&pdf_web_contents_update, pdf_web_contents_tree_id); AccessibilityEventReceived({pdf_web_contents_update}); @@ -1221,22 +1345,26 @@ ui::AXTreeUpdate initial_update; SetUpdateTreeID(&initial_update); initial_update.root_id = 1; - initial_update.nodes.resize(2); - initial_update.nodes[0].id = 1; - initial_update.nodes[1].id = 2; - initial_update.nodes[0].role = ax::mojom::Role::kPdfRoot; - initial_update.nodes[1].role = ax::mojom::Role::kEmbeddedObject; - initial_update.nodes[0].child_ids = {2}; + ui::AXNodeData embedded_node; + embedded_node.id = 2; + embedded_node.role = ax::mojom::Role::kEmbeddedObject; + + ui::AXNodeData pdf_root_node; + pdf_root_node.id = 1; + pdf_root_node.role = ax::mojom::Role::kPdfRoot; + pdf_root_node.child_ids = {embedded_node.id}; + initial_update.nodes = {pdf_root_node, embedded_node}; AccessibilityEventReceived({initial_update}); // Update with no new nodes added to the tree. ui::AXTreeUpdate update; SetUpdateTreeID(&update); update.root_id = 1; - update.nodes.resize(1); - update.nodes[0].id = 1; - update.nodes[0].role = ax::mojom::Role::kPdfRoot; - update.nodes[0].SetNameChecked("example.pdf"); + ui::AXNodeData node; + node.id = 1; + node.role = ax::mojom::Role::kPdfRoot; + node.SetNameChecked("example.pdf"); + update.nodes = {node}; AccessibilityEventReceived({update}); ASSERT_FALSE(RequiresDistillation()); @@ -1244,15 +1372,21 @@ ui::AXTreeUpdate update2; SetUpdateTreeID(&update2); update2.root_id = 1; - update2.nodes.resize(3); - update2.nodes[0].id = 1; - update2.nodes[1].id = 2; - update2.nodes[2].id = 3; - update2.nodes[0].role = ax::mojom::Role::kStaticText; - update2.nodes[1].role = ax::mojom::Role::kEmbeddedObject; - update2.nodes[2].role = ax::mojom::Role::kStaticText; - update2.nodes[0].child_ids = {2}; - update2.nodes[1].child_ids = {3}; + ui::AXNodeData static_text_node1; + static_text_node1.id = 1; + static_text_node1.role = ax::mojom::Role::kStaticText; + + ui::AXNodeData updated_embedded_node; + updated_embedded_node.id = 2; + updated_embedded_node.role = ax::mojom::Role::kEmbeddedObject; + static_text_node1.child_ids = {updated_embedded_node.id}; + + ui::AXNodeData static_text_node2; + static_text_node2.id = 3; + static_text_node2.role = ax::mojom::Role::kStaticText; + updated_embedded_node.child_ids = {static_text_node2.id}; + update2.nodes = {static_text_node1, updated_embedded_node, static_text_node2}; + AccessibilityEventReceived({update2}); ASSERT_TRUE(RequiresDistillation()); } @@ -1263,19 +1397,21 @@ ui::AXTreeUpdate initial_update; SetUpdateTreeID(&initial_update); initial_update.root_id = 1; - initial_update.nodes.resize(1); - initial_update.nodes[0].id = 1; - initial_update.nodes[0].role = ax::mojom::Role::kPdfRoot; + ui::AXNodeData node; + node.id = 1; + node.role = ax::mojom::Role::kPdfRoot; + initial_update.nodes = {node}; AccessibilityEventReceived({initial_update}); // Updates that don't create a new subtree, for example, a role change, should // not set requires_distillation_. ui::AXTreeUpdate update; SetUpdateTreeID(&update); - update.root_id = 1; - update.nodes.resize(1); - update.nodes[0].id = 1; - update.nodes[0].role = ax::mojom::Role::kStaticText; + ui::AXNodeData static_text_node; + static_text_node.id = 1; + static_text_node.role = ax::mojom::Role::kStaticText; + update.root_id = static_text_node.id; + update.nodes = {static_text_node}; AccessibilityEventReceived({update}); ASSERT_FALSE(RequiresDistillation()); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index b8d1dca9..0b78906d 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2246,7 +2246,6 @@ "../browser/chrome_web_platform_security_metrics_browsertest.cc", "../browser/chrome_worker_browsertest.cc", "../browser/client_hints/client_hints_browsertest.cc", - "../browser/component_updater/component_patcher_operation_browsertest.cc", "../browser/component_updater/pki_metadata_component_installer_browsertest.cc", "../browser/content_extraction/inner_html_browsertest.cc", "../browser/content_extraction/inner_text_browsertest.cc", @@ -10761,6 +10760,7 @@ "../browser/ui/views/extensions/extensions_menu_view_interactive_uitest.cc", "../browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_pixel_test.cc", "../browser/ui/views/page_info/page_info_bubble_view_interactive_uitest.cc", + "../browser/ui/views/permissions/midi_permissions_flow_interactive_uitest.cc", "../browser/ui/views/permissions/permissions_flow_interactive_uitest.cc", "../browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc", "../browser/ui/views/side_panel/read_anything/read_anything_toolbar_view_browsertest.cc",
diff --git a/chrome/version.gni b/chrome/version.gni index 1caacc0e..3677614b 100644 --- a/chrome/version.gni +++ b/chrome/version.gni
@@ -53,6 +53,8 @@ # i.e. "riscv64" does not show up in this list, as it's a 64-bit-only target_cpu. if (target_cpu == "arm64" || target_cpu == "x64") { _version_dictionary_template += + "chrome_32_version_code = \"@CHROME_32_VERSION_CODE@\" " + _version_dictionary_template += "monochrome_32_version_code = \"@MONOCHROME_32_VERSION_CODE@\" " _version_dictionary_template += "monochrome_32_64_version_code = \"@MONOCHROME_32_64_VERSION_CODE@\" " @@ -64,8 +66,7 @@ "trichrome_32_version_code = \"@TRICHROME_32_VERSION_CODE@\" " _version_dictionary_template += "trichrome_auto_32_version_code = \"@TRICHROME_AUTO_32_VERSION_CODE@\" " - _version_dictionary_template += - "trichrome_auto_32_64_version_code = \"@TRICHROME_AUTO_32_64_VERSION_CODE@\" " + _version_dictionary_template += "trichrome_auto_32_64_version_code = \"@TRICHROME_AUTO_32_64_VERSION_CODE@\" " _version_dictionary_template += "trichrome_32_64_version_code = \"@TRICHROME_32_64_VERSION_CODE@\" " _version_dictionary_template += @@ -148,6 +149,7 @@ forward_variables_from(_result, [ "chrome_version_code", + "chrome_32_version_code", "monochrome_version_code", "monochrome_32_version_code", "monochrome_32_64_version_code", @@ -216,7 +218,7 @@ if (target_cpu == "arm64") { lines_to_write += [ "TrichromeChrome6432High: $trichrome_64_32_high_version_code", - "TrichromeChromeAuto6432High: $trichrome_auto_64_32_high_version_code" + "TrichromeChromeAuto6432High: $trichrome_auto_64_32_high_version_code", ] } lines_to_write += [
diff --git a/chromeos/ash/components/report/report_controller.cc b/chromeos/ash/components/report/report_controller.cc index 522c3332..8303906 100644 --- a/chromeos/ash/components/report/report_controller.cc +++ b/chromeos/ash/components/report/report_controller.cc
@@ -39,13 +39,6 @@ ReportController* g_ash_report_controller = nullptr; -// Number of minutes to wait before retrying -// reading the .oobe_completed file again. -constexpr base::TimeDelta kOobeReadFailedRetryDelay = base::Minutes(60); - -// Number of times to retry before failing to report any device actives. -constexpr int kNumberOfRetriesBeforeFail = 120; - // Amount of time to wait before triggering repeating timer. constexpr base::TimeDelta kTimeToRepeat = base::Hours(1); @@ -124,97 +117,17 @@ prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, false); } -// static -base::TimeDelta ReportController::DetermineStartUpDelay( - base::Time chrome_first_run_ts) { - // Wait at least 1 hour from the first chrome run sentinel file creation - // time. This creation time is used as an indicator of when the device last - // reset (powerwash/recovery/RMA). PSM servers can take 1 hour after CheckIn - // to return the correct response for CheckMembership requests, since the PSM - // servers need to update their cache. - // - // This delay avoids the scenario where a device checks in, powerwashes, and - // on device start up, gets the wrong check membership response. - base::TimeDelta delay_on_first_chrome_run; - base::Time current_ts = base::Time::Now(); - if (current_ts < (chrome_first_run_ts + base::Hours(1))) { - delay_on_first_chrome_run = - chrome_first_run_ts + base::Hours(1) - current_ts; - } - - return delay_on_first_chrome_run; -} - -// static -MarketSegment ReportController::GetMarketSegment( - policy::DeviceMode device_mode, - policy::MarketSegment device_market_segment) { - // Policy device modes that should be classified as not being set. - const std::unordered_set<policy::DeviceMode> kDeviceModeNotSet{ - policy::DeviceMode::DEVICE_MODE_PENDING, - policy::DeviceMode::DEVICE_MODE_NOT_SET}; - - // Policy device modes that should be classified as consumer devices. - const std::unordered_set<policy::DeviceMode> kDeviceModeConsumer{ - policy::DeviceMode::DEVICE_MODE_CONSUMER, - policy::DeviceMode::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH}; - - // Policy device modes that should be classified as enterprise devices. - const std::unordered_set<policy::DeviceMode> kDeviceModeEnterprise{ - policy::DeviceMode::DEVICE_MODE_ENTERPRISE}; - - // Policy device modes that should be classified as demo devices. - const std::unordered_set<policy::DeviceMode> kDeviceModeDemoEnterprise{ - policy::DeviceMode::DEVICE_MODE_DEMO}; - - // Determine Fresnel market segment using the retrieved device policy - // |device_mode| and |device_market_segment|. - if (kDeviceModeNotSet.count(device_mode)) { - return MARKET_SEGMENT_UNKNOWN; - } - - if (kDeviceModeConsumer.count(device_mode)) { - return MARKET_SEGMENT_CONSUMER; - } - - if (kDeviceModeDemoEnterprise.count(device_mode)) { - return MARKET_SEGMENT_ENTERPRISE_DEMO; - } - - if (kDeviceModeEnterprise.count(device_mode)) { - if (device_market_segment == policy::MarketSegment::ENTERPRISE) { - return MARKET_SEGMENT_ENTERPRISE; - } - - if (device_market_segment == policy::MarketSegment::EDUCATION) { - return MARKET_SEGMENT_EDUCATION; - } - - return MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN; - } - - return MARKET_SEGMENT_UNKNOWN; -} - ReportController::ReportController( const device_metrics::ChromeDeviceMetadataParameters& chrome_device_params, PrefService* local_state, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::Time chrome_first_run_time, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::RepeatingCallback<policy::DeviceMode()> device_mode_callback, - base::RepeatingCallback<policy::MarketSegment()> market_segment_callback, std::unique_ptr<device_metrics::PsmClientManager> psm_client_manager) : chrome_device_params_(chrome_device_params), local_state_(local_state), url_loader_factory_(url_loader_factory), - chrome_first_run_time_(chrome_first_run_time), - device_mode_callback_(std::move(device_mode_callback)), - market_segment_callback_(std::move(market_segment_callback)), report_timer_(std::make_unique<base::RepeatingTimer>()), network_state_handler_(NetworkHandler::Get()->network_state_handler()), statistics_provider_(system::StatisticsProvider::GetInstance()), - oobe_completed_timer_(std::make_unique<base::OneShotTimer>()), clock_(base::DefaultClock::GetInstance()), psm_client_manager_(std::move(psm_client_manager)) { DCHECK(local_state); @@ -231,12 +144,11 @@ return; } - base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&report::ReportController::CheckOobeCompletedInWorker, - weak_factory_.GetWeakPtr(), - std::move(check_oobe_completed_callback)), - ReportController::DetermineStartUpDelay(chrome_first_run_time)); + // Wrap with callback from |psm_device_active_secret_| retrieval using + // |SessionManagerClient| DBus. + SessionManagerClient::Get()->GetPsmDeviceActiveSecret( + base::BindOnce(&report::ReportController::OnPsmDeviceActiveSecretFetched, + weak_factory_.GetWeakPtr())); } ReportController::~ReportController() { @@ -245,7 +157,6 @@ // Reset all dependency unique_ptr objects of this class that are not needed. report_timer_.reset(); - oobe_completed_timer_.reset(); system_clock_sync_observation_.reset(); // Reset all reporting use cases. @@ -277,63 +188,6 @@ network_state_handler_observer_.Reset(); } -void ReportController::CheckOobeCompletedInWorker( - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) { - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(check_oobe_completed_callback), - base::BindOnce(&ReportController::OnOobeFileWritten, - weak_factory_.GetWeakPtr(), - check_oobe_completed_callback)); -} - -void ReportController::OnOobeFileWritten( - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::TimeDelta time_since_oobe_file_written) { - // We block if the oobe completed file is not written. - // ChromeOS devices should go through oobe to be considered a real device. - // The ActivateDate is also only set after oobe is written. - if (retry_oobe_completed_count_ >= kNumberOfRetriesBeforeFail) { - LOG(ERROR) << "Retry failed - .oobe_completed file was not written for " - << "1 minute after retrying 120 times. " - << "There was a 60 minute wait between each retry and spanned " - << "5 days."; - return; - } - - if (time_since_oobe_file_written < base::Minutes(1)) { - ++retry_oobe_completed_count_; - - LOG(ERROR) << "Time since oobe file created was less than 1 minute. " - << "Wait and retry again after 1 minute to ensure that " - << "the ActivateDate VPD field is set. " - << "TimeDelta since oobe flag file was created = " - << time_since_oobe_file_written - << ". Retry count = " << retry_oobe_completed_count_; - - oobe_completed_timer_->Start( - FROM_HERE, kOobeReadFailedRetryDelay, - base::BindOnce(&ReportController::CheckOobeCompletedInWorker, - weak_factory_.GetWeakPtr(), - std::move(check_oobe_completed_callback))); - - return; - } - - // Set the market segment since we know OOBE was completed and the - // .oobe_completed file existed for more than 1 minute. - chrome_device_params_.market_segment = GetMarketSegment( - device_mode_callback_.Run(), market_segment_callback_.Run()); - - // Wrap with callback from |psm_device_active_secret_| retrieval using - // |SessionManagerClient| DBus. - SessionManagerClient::Get()->GetPsmDeviceActiveSecret( - base::BindOnce(&report::ReportController::OnPsmDeviceActiveSecretFetched, - weak_factory_.GetWeakPtr())); -} - void ReportController::OnPsmDeviceActiveSecretFetched( const std::string& psm_device_active_secret) { // In order for the device actives to be reported, the psm device active
diff --git a/chromeos/ash/components/report/report_controller.h b/chromeos/ash/components/report/report_controller.h index 58623805..4f79b637 100644 --- a/chromeos/ash/components/report/report_controller.h +++ b/chromeos/ash/components/report/report_controller.h
@@ -8,8 +8,6 @@ #include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" -#include "base/time/clock.h" -#include "base/time/time.h" #include "base/timer/timer.h" #include "chromeos/ash/components/network/network_state_handler_observer.h" #include "chromeos/ash/components/report/device_metrics/use_case/psm_client_manager.h" @@ -20,6 +18,7 @@ namespace base { class Clock; +class Time; } // namespace base namespace network { class SharedURLLoaderFactory; @@ -69,23 +68,12 @@ // Registers local state preferences. static void RegisterPrefs(PrefRegistrySimple* registry); - // Determine start up delay before reporting should starts. - static base::TimeDelta DetermineStartUpDelay(base::Time chrome_first_run_ts); - - // Determine market segment from the loaded ChromeOS device policies. - static MarketSegment GetMarketSegment( - policy::DeviceMode device_mode, - policy::MarketSegment device_market_segment); - + // Constructing |ReportController| triggers its attempt to upload a report. ReportController( const device_metrics::ChromeDeviceMetadataParameters& chrome_device_params, PrefService* local_state, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::Time chrome_first_run_time, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::RepeatingCallback<policy::DeviceMode()> device_mode_callback, - base::RepeatingCallback<policy::MarketSegment()> market_segment_callback, std::unique_ptr<device_metrics::PsmClientManager> psm_client_manager); ReportController(const ReportController&) = delete; ReportController& operator=(const ReportController&) = delete; @@ -107,18 +95,6 @@ friend class ReportControllerTestBase; friend class ReportControllerSimpleFlowTest; - // Wrapper method for the PostTaskAndReplyWithResult, which is used to spawn - // a worker thread to check oobe completed file time delta. - void CheckOobeCompletedInWorker( - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback); - - // Retry method every kOobeReadFailedRetryDelay minute until confirming - // 1 minute has passed since /home/chronos/.oobe_completed file was written. - // Maximum retry count is kNumberOfRetriesBeforeFail. - void OnOobeFileWritten( - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::TimeDelta time_since_oobe_file_written); - // Read the high entropy seed from VPD over DBus. // This device secret must be fetched correctly in order for the device // to generate pseudonymous identifiers. @@ -157,9 +133,7 @@ void StartReport(); // Chrome browser passed parameters that live throughout this class lifetime. - // Market segment field is only assigned after oobe is completed and the - // market segment is known. - device_metrics::ChromeDeviceMetadataParameters chrome_device_params_; + const device_metrics::ChromeDeviceMetadataParameters chrome_device_params_; // Update relevant pref keys with preserved file data if missing. // Pref keys are found in //report/prefs/fresnel_pref_names.h @@ -169,16 +143,6 @@ // Field is used to handle Fresnel requests/responses on a single sequence. scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; - // The chrome first run sentinel creation time. - base::Time chrome_first_run_time_; - - // Store callbacks to retrieve the policy device mode and market segment. - // Method should be called after oobe is successfully completed, and the - // .oobe_completed file is written. - // Callback will outlive this class, and is managed by ash-chrome. - base::RepeatingCallback<policy::DeviceMode()> device_mode_callback_; - base::RepeatingCallback<policy::MarketSegment()> market_segment_callback_; - // Try report metrics every |kTimeToRepeat|. std::unique_ptr<base::RepeatingTimer> report_timer_; @@ -190,12 +154,6 @@ const raw_ptr<system::StatisticsProvider, ExperimentalAsh> statistics_provider_; - // Number of retry attempts at reading the oobe completed file. - int retry_oobe_completed_count_ = 0; - - // Timer used to retry reading oobe_completed file. - std::unique_ptr<base::OneShotTimer> oobe_completed_timer_; - // Set high entropy seed, which is passed to the use cases in order to // uniquely generate pseudonymous ids when importing. // Field is set after OnPsmDeviceActiveSecretFetched is called.
diff --git a/chromeos/ash/components/report/report_controller_unittest.cc b/chromeos/ash/components/report/report_controller_unittest.cc index 63bcbdba..3b0feb7 100644 --- a/chromeos/ash/components/report/report_controller_unittest.cc +++ b/chromeos/ash/components/report/report_controller_unittest.cc
@@ -35,53 +35,6 @@ private_computing::PrivateComputingClientRegressionTestData; namespace ash::report::device_metrics { -TEST(ReportControllerTest, UnknownDeviceMode) { - ASSERT_EQ(MARKET_SEGMENT_UNKNOWN, ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_PENDING, - policy::MarketSegment::UNKNOWN)); -} - -TEST(ReportControllerTest, ConsumerDeviceMode) { - ASSERT_EQ(MARKET_SEGMENT_CONSUMER, - ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_CONSUMER, - policy::MarketSegment::UNKNOWN)); -} - -TEST(ReportControllerTest, DemoEnterpriseDeviceMode) { - ASSERT_EQ( - MARKET_SEGMENT_ENTERPRISE_DEMO, - ReportController::GetMarketSegment(policy::DeviceMode::DEVICE_MODE_DEMO, - policy::MarketSegment::ENTERPRISE)); -} - -TEST(ReportControllerTest, EnterpriseDeviceModeEnterpriseSegment) { - ASSERT_EQ(MARKET_SEGMENT_ENTERPRISE, - ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_ENTERPRISE, - policy::MarketSegment::ENTERPRISE)); -} - -TEST(ReportControllerTest, EnterpriseDeviceModeEducationSegment) { - ASSERT_EQ(MARKET_SEGMENT_EDUCATION, - ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_ENTERPRISE, - policy::MarketSegment::EDUCATION)); -} - -TEST(ReportControllerTest, EnterpriseDeviceModeUnknownSegment) { - ASSERT_EQ(MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN, - ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_ENTERPRISE, - policy::MarketSegment::UNKNOWN)); -} - -TEST(ReportControllerTest, UnknownDeviceModeAndSegment) { - ASSERT_EQ(MARKET_SEGMENT_UNKNOWN, ReportController::GetMarketSegment( - policy::DeviceMode::DEVICE_MODE_NOT_SET, - policy::MarketSegment::UNKNOWN)); -} - class ReportControllerTestBase : public testing::Test { public: static private_computing::PrivateComputingClientRegressionTestData* @@ -291,6 +244,7 @@ public: static constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { version_info::Channel::STABLE /* chromeos_channel */, + MarketSegment::MARKET_SEGMENT_CONSUMER /* market_segment */, }; void SetUp() override { @@ -319,10 +273,6 @@ report_controller_ = std::make_unique<ReportController>( kFakeChromeParameters, GetLocalState(), GetUrlLoaderFactory(), - base::Time(), base::BindRepeating([]() { return base::Minutes(1); }), - base::BindRepeating( - []() { return policy::DeviceMode::DEVICE_MODE_NOT_SET; }), - base::BindRepeating([]() { return policy::MarketSegment::UNKNOWN; }), std::make_unique<PsmClientManager>(std::move(psm_client_delegate))); task_environment_.RunUntilIdle(); @@ -631,7 +581,8 @@ : public ReportControllerTestBase { public: static constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */ + version_info::Channel::STABLE /* chromeos_channel */, + MarketSegment::MARKET_SEGMENT_CONSUMER /* market_segment */, }; void SetUp() override { @@ -664,10 +615,6 @@ report_controller_ = std::make_unique<ReportController>( kFakeChromeParameters, GetLocalState(), GetUrlLoaderFactory(), - base::Time(), base::BindRepeating([]() { return base::Minutes(1); }), - base::BindRepeating( - []() { return policy::DeviceMode::DEVICE_MODE_NOT_SET; }), - base::BindRepeating([]() { return policy::MarketSegment::UNKNOWN; }), std::make_unique<PsmClientManager>(std::move(psm_client_delegate))); task_environment_.RunUntilIdle(); @@ -735,6 +682,7 @@ public: static constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { version_info::Channel::STABLE /* chromeos_channel */, + MarketSegment::MARKET_SEGMENT_CONSUMER /* market_segment */, }; void SetUp() override { @@ -767,10 +715,6 @@ report_controller_ = std::make_unique<ReportController>( kFakeChromeParameters, GetLocalState(), GetUrlLoaderFactory(), - base::Time(), base::BindRepeating([]() { return base::Minutes(1); }), - base::BindRepeating( - []() { return policy::DeviceMode::DEVICE_MODE_NOT_SET; }), - base::BindRepeating([]() { return policy::MarketSegment::UNKNOWN; }), std::make_unique<PsmClientManager>(std::move(psm_client_delegate))); task_environment_.RunUntilIdle();
diff --git a/clank b/clank index a60e161..71dddbd 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit a60e161b8d92adf6d1a44622e66d17ff3b52e6e5 +Subproject commit 71dddbd0f90161e04d335f5a91d520455a45f8c4
diff --git a/components/BUILD.gn b/components/BUILD.gn index 2123037d..e84d4f98 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -915,6 +915,7 @@ "autofill/content/renderer/form_autofill_issues_browsertest.cc", "autofill/content/renderer/form_autofill_util_browsertest.cc", "autofill/content/renderer/form_cache_browsertest.cc", + "autofill/content/renderer/form_tracker_browsertest.cc", "autofill/content/renderer/html_based_username_detector_browsertest.cc", "autofill/content/renderer/password_form_conversion_utils_browsertest.cc", "browsing_data/content/browsing_data_helper_browsertest.h",
diff --git a/components/autofill/content/renderer/form_tracker_browsertest.cc b/components/autofill/content/renderer/form_tracker_browsertest.cc new file mode 100644 index 0000000..056918d --- /dev/null +++ b/components/autofill/content/renderer/form_tracker_browsertest.cc
@@ -0,0 +1,103 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/content/renderer/form_tracker.h" + +#include "content/public/test/render_view_test.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/web/web_form_control_element.h" +#include "third_party/blink/public/web/web_local_frame.h" + +namespace autofill { +namespace { + +class MockFormTrackerObserver : public FormTracker::Observer { + public: + // Not a mock method so that gmock ignores calls to this method. + void OnProvisionallySaveForm(const blink::WebFormElement&, + const blink::WebFormControlElement&, + ElementChangeSource) override {} + + MOCK_METHOD0(OnProbablyFormSubmitted, void()); + MOCK_METHOD1(OnFormSubmitted, void(const blink::WebFormElement&)); + MOCK_METHOD1(OnInferredFormSubmission, void(mojom::SubmissionSource)); +}; + +class FormTrackerTest : public content::RenderViewTest { + public: + blink::WebFormControlElement GetFormControlById(const std::string& id) { + return GetMainFrame() + ->GetDocument() + .GetElementById(blink::WebString::FromUTF8(id)) + .DynamicTo<blink::WebFormControlElement>(); + } +}; + +// Check that submission is detected on a page with no <form> when in sequence: +// 1) User types into a field. +// 2) Page does an XHR. +// 3) Page hides all of the inputs. +TEST_F(FormTrackerTest, FormlessXHRThenHide) { + LoadHTML("<!DOCTYPE HTML><input id='input1'><input id='input2'/>"); + + blink::WebFormControlElement input1 = GetFormControlById("input1"); + + FormTracker tracker(GetMainRenderFrame()); + testing::StrictMock<MockFormTrackerObserver> observer; + tracker.AddObserver(&observer); + + GetMainFrame()->NotifyUserActivation( + blink::mojom::UserActivationNotificationType::kTest); + ExecuteJavaScriptForTests("document.getElementById('input1').focus();"); + tracker.TextFieldDidChange(input1); + + base::RunLoop().RunUntilIdle(); + + tracker.AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + // FormTracker should not think there is a submission because the <input>s are + // still visible. + + // FormTracker should detect a submission after the <input>s are hidden. + EXPECT_CALL(observer, OnInferredFormSubmission).Times(1); + ExecuteJavaScriptForTests( + "document.getElementById('input1').style.display = 'none';" + "document.getElementById('input2').style.display = 'none';"); +} + +// Check that submission is detected on a page with no <form> when in sequence: +// 1) User types into a field. +// 2) Page hides all of the inputs. +// 3) Page does an XHR. +TEST_F(FormTrackerTest, FormlessHideThenXhr) { + LoadHTML("<!DOCTYPE HTML><input id='input1'><input id='input2'/>"); + + blink::WebFormControlElement input1 = GetFormControlById("input1"); + + FormTracker tracker(GetMainRenderFrame()); + testing::StrictMock<MockFormTrackerObserver> observer; + tracker.AddObserver(&observer); + + GetMainFrame()->NotifyUserActivation( + blink::mojom::UserActivationNotificationType::kTest); + ExecuteJavaScriptForTests("document.getElementById('input1').focus();"); + tracker.TextFieldDidChange(input1); + base::RunLoop().RunUntilIdle(); + + ExecuteJavaScriptForTests( + "document.getElementById('input1').style.display = 'none';" + "document.getElementById('input2').style.display = 'none';"); + base::RunLoop().RunUntilIdle(); + // FormTracker should not think there is a submission because the page has not + // done any XHRs. + + // FormTracker should detect a submission when the XHR succeeds. + EXPECT_CALL(observer, OnInferredFormSubmission).Times(1); + tracker.AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); +} + +} // anonymous namespace +} // namespace autofill
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc index f565986..0d89ed7 100644 --- a/components/autofill/core/browser/autofill_client.cc +++ b/components/autofill/core/browser/autofill_client.cc
@@ -80,9 +80,6 @@ void AutofillClient::OfferPlusAddressCreation( const url::Origin& main_frame_origin, plus_addresses::PlusAddressCallback callback) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop & Android) implements this, with iOS - // support also expected. } MerchantPromoCodeManager* AutofillClient::GetMerchantPromoCodeManager() { @@ -135,20 +132,14 @@ base::OnceCallback<void(const std::string&)> confirm_unmask_challenge_option_callback, base::OnceClosure cancel_unmasking_closure) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } void AutofillClient::DismissUnmaskAuthenticatorSelectionDialog( bool server_success) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } VirtualCardEnrollmentManager* AutofillClient::GetVirtualCardEnrollmentManager() { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. return nullptr; } @@ -156,8 +147,6 @@ const VirtualCardEnrollmentFields& virtual_card_enrollment_fields, base::OnceClosure accept_virtual_card_callback, base::OnceClosure decline_virtual_card_callback) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } payments::MandatoryReauthManager* @@ -174,13 +163,10 @@ #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) void AutofillClient::HideVirtualCardEnrollBubbleAndIconIfVisible() { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop) implements this. } void AutofillClient::ShowLocalCardMigrationDialog( base::OnceClosure show_migration_dialog_closure) { - // This is overridden by platform subclasses } void AutofillClient::ConfirmMigrateLocalCardToCloud( @@ -188,7 +174,6 @@ const std::string& user_email, const std::vector<MigratableCreditCard>& migratable_credit_cards, LocalCardMigrationCallback start_migrating_cards_callback) { - // This is overridden by platform subclasses } void AutofillClient::ShowLocalCardMigrationResults( @@ -196,44 +181,36 @@ const std::u16string& tip_message, const std::vector<MigratableCreditCard>& migratable_credit_cards, MigrationDeleteCardCallback delete_local_card_callback) { - // This is overridden by platform subclasses. } void AutofillClient::ShowWebauthnOfferDialog( WebauthnDialogCallback offer_dialog_callback) { - // This is overridden by platform subclasses. } void AutofillClient::ShowWebauthnVerifyPendingDialog( WebauthnDialogCallback verify_pending_dialog_callback) { - // This is overridden by platform subclasses. } void AutofillClient::UpdateWebauthnOfferDialogWithError() { - // This is overridden by platform subclasses. } bool AutofillClient::CloseWebauthnDialog() { - // This is overridden by platform subclasses. return false; } void AutofillClient::OfferVirtualCardOptions( const std::vector<CreditCard*>& candidates, base::OnceCallback<void(const std::string&)> callback) { - // This is overridden by platform subclasses. } #else void AutofillClient::ConfirmAccountNameFixFlow( base::OnceCallback<void(const std::u16string&)> callback) { - // This is overridden by platform subclasses. } void AutofillClient::ConfirmExpirationDateFixFlow( const CreditCard& card, base::OnceCallback<void(const std::u16string&, const std::u16string&)> callback) { - // This is overridden by platform subclasses. } #endif @@ -247,21 +224,16 @@ void AutofillClient::ShowCardUnmaskOtpInputDialog( const CardUnmaskChallengeOption& challenge_option, base::WeakPtr<OtpUnmaskDelegate> delegate) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } void AutofillClient::OnUnmaskOtpVerificationResult( OtpUnmaskResult unmask_result) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } void AutofillClient::ConfirmSaveCreditCardLocally( const CreditCard& card, AutofillClient::SaveCreditCardOptions options, LocalSaveCardPromptCallback callback) { - // This is overridden by platform subclasses. } void AutofillClient::ConfirmSaveCreditCardToCloud( @@ -269,7 +241,6 @@ const LegalMessageLines& legal_message_lines, SaveCreditCardOptions options, UploadSaveCardPromptCallback callback) { - // This is overridden by platform subclasses. } void AutofillClient::ConfirmSaveIbanLocally(const Iban& iban, @@ -283,56 +254,41 @@ SaveIbanPromptCallback callback) {} void AutofillClient::CreditCardUploadCompleted(bool card_saved) { - // This is overridden by platform subclasses. } void AutofillClient::ShowUnmaskPrompt( const CreditCard& card, const CardUnmaskPromptOptions& card_unmask_prompt_options, base::WeakPtr<CardUnmaskDelegate> delegate) { - // This is overridden by platform subclasses. } void AutofillClient::OnUnmaskVerificationResult(PaymentsRpcResult result) { - // This is overridden by platform subclasses. } void AutofillClient::UpdateOfferNotification( const AutofillOfferData* offer, const OfferNotificationOptions& options) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implement this. } void AutofillClient::DismissOfferNotification() { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop and Clank) implements this. } void AutofillClient::OnVirtualCardDataAvailable( const VirtualCardManualFallbackBubbleOptions& options) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop & Android) implements this. } void AutofillClient::ShowAutofillErrorDialog( const AutofillErrorDialogContext& context) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop & Android) implements this. } void AutofillClient::ShowAutofillProgressDialog( AutofillProgressDialogType autofill_progress_dialog_type, base::OnceClosure cancel_callback) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop & Android) implements this. } void AutofillClient::CloseAutofillProgressDialog( bool show_confirmation_before_closing, base::OnceClosure no_interactive_authentication_callback) { - // This is overridden by platform subclasses. Currently only - // ChromeAutofillClient (Chrome Desktop & Android) implements this. } LogManager* AutofillClient::GetLogManager() const { @@ -346,7 +302,6 @@ } void AutofillClient::OpenPromoCodeOfferDetailsURL(const GURL& url) { - // This is overridden by platform subclasses. NOTIMPLEMENTED(); }
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc index 6b20af24..598f226 100644 --- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc +++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -302,6 +302,7 @@ .host_frame = form_id.frame_token, .unique_renderer_id = form_id.renderer_id, }); + manager().OnFormsSeen({queried_form_}, {}); external_delegate().OnQuery(queried_form_, queried_form_.fields[0], gfx::RectF(), trigger_source); } @@ -1233,7 +1234,6 @@ params.popup_item_id == PopupItemId::kAddressFieldByFieldFilling ? CreateFieldByFieldFillingSuggestion(profile.guid(), NAME_FIRST) : test::CreateAutofillSuggestion(params.popup_item_id); - manager().OnFormsSeen({queried_form_}, {}); base::HistogramTester histogram_tester; external_delegate().DidAcceptSuggestion(suggestion, SuggestionPosition{.row = 0}); @@ -1452,7 +1452,6 @@ Suggestion suggestion = CreateFieldByFieldFillingSuggestion(profile.guid(), NAME_FIRST); IssueOnQuery(); - manager().OnFormsSeen({queried_form_}, {}); base::HistogramTester histogram_tester; external_delegate().DidAcceptSuggestion( @@ -1470,7 +1469,6 @@ Suggestion suggestion = CreateFieldByFieldFillingSuggestion(profile.guid(), NAME_FIRST); IssueOnQuery(); - manager().OnFormsSeen({queried_form_}, {}); base::HistogramTester histogram_tester; external_delegate().DidAcceptSuggestion(suggestion, @@ -1488,7 +1486,6 @@ Suggestion suggestion = CreateFieldByFieldFillingSuggestion( local_card.guid(), CREDIT_CARD_NAME_FULL); IssueOnQuery(AutofillSuggestionTriggerSource::kManualFallbackPayments); - manager().OnFormsSeen({queried_form_}, {}); EXPECT_CALL(manager(), FillOrPreviewField(mojom::ActionPersistence::kPreview, @@ -1506,7 +1503,6 @@ Suggestion suggestion = CreateFieldByFieldFillingSuggestion( local_card.guid(), CREDIT_CARD_NAME_FULL); IssueOnQuery(AutofillSuggestionTriggerSource::kManualFallbackPayments); - manager().OnFormsSeen({queried_form_}, {}); EXPECT_CALL(manager(), FillOrPreviewField(mojom::ActionPersistence::kFill, @@ -1580,7 +1576,6 @@ const AutofillProfile profile = test::GetFullProfile(); pdm().AddProfile(profile); IssueOnQuery(); - manager().OnFormsSeen({queried_form_}, {}); ON_CALL(pdm(), IsAutofillProfileEnabled).WillByDefault(Return(true)); const Suggestion suggestion = params.popup_item_id == PopupItemId::kAddressFieldByFieldFilling @@ -1988,7 +1983,6 @@ const AutofillProfile profile = test::GetFullProfile(); pdm().AddProfile(profile); IssueOnQuery(); - manager().OnFormsSeen({queried_form_}, {}); Suggestion suggestion = CreateFieldByFieldFillingSuggestion(profile.guid(), NAME_FIRST); EXPECT_CALL(client(),
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc index 75b8b17..4eddcf0 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -488,7 +488,7 @@ void AddFooterChildSuggestions( const AutofillProfile& profile, ServerFieldType trigger_field_type, - absl::optional<ServerFieldTypeSet> last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, Suggestion& suggestion) { // If the trigger field is not classified as an address field, then the // filling was triggered from the context menu. In this scenario, the user @@ -593,7 +593,7 @@ // When not present, we default to full form. // This function is called only for first-level popup. PopupItemId GetProfileSuggestionPopupItemId( - absl::optional<ServerFieldTypeSet> optional_last_targeted_fields, + absl::optional<ServerFieldTypeSet> last_targeted_fields, ServerFieldType trigger_field_type) { if (!base::FeatureList::IsEnabled( features::kAutofillGranularFillingAvailable)) { @@ -612,7 +612,7 @@ GroupTypeOfServerFieldType(trigger_field_type); // Lambda to return the expected `PopupItemId` when - // `optional_last_targeted_fields` matches one of the granular filling groups. + // `last_targeted_fields` matches one of the granular filling groups. auto get_popup_item_id_for_group_filling = [&] { switch (trigger_field_type_group) { case FieldTypeGroup::kName: @@ -638,7 +638,7 @@ }; switch (GetFillingMethodFromTargetedFields( - optional_last_targeted_fields.value_or(kAllServerFieldTypes))) { + last_targeted_fields.value_or(kAllServerFieldTypes))) { case AutofillFillingMethod::kGroupFilling: return get_popup_item_id_for_group_filling(); case AutofillFillingMethod::kFullForm: @@ -680,6 +680,15 @@ return main_text_and_granular_filling_label_count; } +// Returns whether the `ADDRESS_HOME_LINE1` should be included in the granular +// filling labels vector. This depends on whether `triggering_field_type` is a +// field that will usually allow users to easily identify their address. +bool ShouldAddAddressLine1ToGranularFillingLabels( + ServerFieldType triggering_field_type) { + static constexpr std::array kAddressRecognizingFields = { + ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2, ADDRESS_HOME_STREET_ADDRESS}; + return !base::Contains(kAddressRecognizingFields, triggering_field_type); +} // Creates a specific granular filling labels vector for each `AutofillProfile` // in `profiles` when the `last_filling_granularity` for a certain form was // group filling. This is done to give users feedback about the filling @@ -687,11 +696,11 @@ // applied for a profile. std::vector<std::vector<std::u16string>> GetGranularFillingLabels( const std::vector<const AutofillProfile*>& profiles, - absl::optional<ServerFieldTypeSet> optional_last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, ServerFieldType triggering_field_type, const std::string& app_locale) { - if (!optional_last_targeted_fields || - !AreFieldsGranularFillingGroup(*optional_last_targeted_fields)) { + if (!last_targeted_fields || + !AreFieldsGranularFillingGroup(*last_targeted_fields)) { return std::vector<std::vector<std::u16string>>(profiles.size()); } std::vector<std::vector<std::u16string>> labels; @@ -703,25 +712,20 @@ IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED)}); break; case FieldTypeGroup::kCompany: - case FieldTypeGroup::kAddress: - // Specifies fields that will usually allow users to easily identify a - // profile. - static constexpr std::array kAddressRecognizingFields = { - ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2, ADDRESS_HOME_ADDRESS, - ADDRESS_HOME_STREET_ADDRESS}; - if (base::Contains(kAddressRecognizingFields, triggering_field_type)) { - labels.push_back({l10n_util::GetStringUTF16( - IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED)}); - } else { + case FieldTypeGroup::kAddress: { + std::vector<std::u16string>& profile_labels = labels.emplace_back(); + profile_labels.push_back(l10n_util::GetStringUTF16( + IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED)); + if (ShouldAddAddressLine1ToGranularFillingLabels( + triggering_field_type)) { // If the triggering type does not contain information that is // useful to identify addresses, add `ADDRESS_HOME_LINE1` to // the differentiating labels list. - labels.push_back( - {l10n_util::GetStringUTF16( - IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED), - profile->GetInfo(ADDRESS_HOME_LINE1, app_locale)}); + profile_labels.push_back( + profile->GetInfo(ADDRESS_HOME_LINE1, app_locale)); } break; + } case FieldTypeGroup::kNoGroup: case FieldTypeGroup::kPhone: case FieldTypeGroup::kEmail: @@ -738,6 +742,48 @@ return labels; } +// Returns a `ServerFieldTypeSet` to be excluded from the differentiating labels +// generation. The granular filling labels can contain information such +// `ADDRESS_HOME_LINE1` depending on `triggering_field_type` and +// `last_targeted_fields`, see `GetGranularFillingLabels()` for +// details. +ServerFieldTypeSet GetFieldTypesToExcludeFromDifferentiatingLabelsGeneration( + ServerFieldType triggering_field_type, + std::optional<ServerFieldTypeSet> last_targeted_fields) { + if (!last_targeted_fields || + !AreFieldsGranularFillingGroup(*last_targeted_fields)) { + return {triggering_field_type}; + } + switch (GroupTypeOfServerFieldType(triggering_field_type)) { + case FieldTypeGroup::kAddress: + if (ShouldAddAddressLine1ToGranularFillingLabels(triggering_field_type)) { + // In the case where the `ADDRESS_HOME_LINE1` was added to the granular + // filling labels, make sure to exclude fields that contain + // `ADDRESS_HOME_LINE1` from the field types to use when creating the + // differentiating label. + // For details on how `ADDRESS_HOME_LINE1` is added, see + // `GetGranularFillingLabels()`. + return {triggering_field_type, ADDRESS_HOME_LINE1, + ADDRESS_HOME_STREET_ADDRESS}; + } else { + return {triggering_field_type}; + } + case FieldTypeGroup::kName: + case FieldTypeGroup::kCompany: + case FieldTypeGroup::kNoGroup: + case FieldTypeGroup::kPhone: + case FieldTypeGroup::kEmail: + case FieldTypeGroup::kCreditCard: + case FieldTypeGroup::kPasswordField: + case FieldTypeGroup::kTransaction: + case FieldTypeGroup::kUsernameField: + case FieldTypeGroup::kUnfillable: + case FieldTypeGroup::kBirthdateField: + case FieldTypeGroup::kIban: + return {triggering_field_type}; + } +} + // Returns for each profile in `profiles` a differentiating label string to be // used as a secondary text in the corresponding suggestion bubble. // `field_types` the types of the fields that will be filled by the suggestion. @@ -745,7 +791,7 @@ const std::vector<const AutofillProfile*>& profiles, const ServerFieldTypeSet& field_types, ServerFieldType trigger_field_type, - absl::optional<ServerFieldTypeSet> optional_last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, const std::string& app_locale) { std::unique_ptr<LabelFormatter> formatter; bool use_formatter; @@ -776,9 +822,11 @@ } else if (formatter) { differentiating_labels = formatter->GetLabels(); } else { - AutofillProfile::CreateInferredLabels(profiles, field_types, - {trigger_field_type}, 1, app_locale, - &differentiating_labels); + AutofillProfile::CreateInferredLabels( + profiles, field_types, + GetFieldTypesToExcludeFromDifferentiatingLabelsGeneration( + trigger_field_type, last_targeted_fields), + 1, app_locale, &differentiating_labels); } if (use_formatter && !profiles.empty()) { @@ -799,7 +847,7 @@ base::span<const Suggestion> suggestions, const std::vector<const AutofillProfile*>& profiles, const ServerFieldTypeSet& field_types, - absl::optional<ServerFieldTypeSet> last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, ServerFieldType trigger_field_type, const std::string& app_locale) { const std::vector<std::vector<std::u16string>> @@ -807,8 +855,6 @@ profiles, last_targeted_fields, trigger_field_type, app_locale); CHECK_EQ(suggestions_granular_filling_labels.size(), suggestions.size()); - // TODO(crbug.com/1459990): Remove `ADDRESS_HOME_LINE1` when - // `granular_filling_labels` already contains it. const std::vector<std::u16string> suggestions_differentiating_labels = GetProfileSuggestionLabels(profiles, field_types, trigger_field_type, last_targeted_fields, app_locale); @@ -1039,7 +1085,7 @@ return AutofillProfileComparator::NormalizeForComparison(text); } -absl::optional<Suggestion> GetSuggestionForTestAddresses( +std::optional<Suggestion> GetSuggestionForTestAddresses( base::span<const AutofillProfile> test_addresses, const std::string& locale) { if (test_addresses.empty()) { @@ -1076,7 +1122,7 @@ const ServerFieldTypeSet& field_types, const FormFieldData& trigger_field, ServerFieldType trigger_field_type, - absl::optional<ServerFieldTypeSet> last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, AutofillSuggestionTriggerSource trigger_source) { // If the user manually triggered suggestions from the context menu, all // available profiles should be shown. Selecting a suggestion overwrites the @@ -1162,7 +1208,7 @@ AutofillSuggestionGenerator::CreateSuggestionsFromProfiles( const std::vector<const AutofillProfile*>& profiles, const ServerFieldTypeSet& field_types, - absl::optional<ServerFieldTypeSet> last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, ServerFieldType trigger_field_type, uint64_t trigger_field_max_length, const std::set<std::string>& previously_hidden_profiles_guid) { @@ -1246,7 +1292,7 @@ // Add devtools test addresses suggestion if it exists. A suggestion will // exist if devtools is open and therefore test addresses were set. - if (absl::optional<Suggestion> test_addresses_suggestion = + if (std::optional<Suggestion> test_addresses_suggestion = GetSuggestionForTestAddresses(personal_data_->test_addresses(), app_locale)) { std::vector<Suggestion> suggestions_with_test_address; @@ -1386,7 +1432,7 @@ } void AutofillSuggestionGenerator::AddAddressGranularFillingChildSuggestions( - absl::optional<ServerFieldTypeSet> last_targeted_fields, + std::optional<ServerFieldTypeSet> last_targeted_fields, ServerFieldType trigger_field_type, const AutofillProfile& profile, Suggestion& suggestion) const {
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc index c955b09..fe53fda2 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -1195,11 +1195,13 @@ // `profile_1` and `profile_2` have the same `ADDRESS_HOME_ZIP`, which // will lead to the necessity of a differentiating label - // (`ADDRESS_HOME_HOUSE_NUMBER`). + // (`ADDRESS_HOME_HOUSE_NUMBER`). Note that even though `ADDRESS_HOME_LINE1` + // is part of the `field_types`, it is not added as a differentiating label + // because it is already part of the granular filling labels. std::vector<Suggestion> suggestions = suggestion_generator()->CreateSuggestionsFromProfiles( {&profile_1, &profile_2}, - {ADDRESS_HOME_HOUSE_NUMBER, ADDRESS_HOME_ZIP}, + {ADDRESS_HOME_LINE1, ADDRESS_HOME_HOUSE_NUMBER, ADDRESS_HOME_ZIP}, GetAddressFieldsForGroupFilling(), ADDRESS_HOME_ZIP, /*trigger_field_max_length=*/0);
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index c8de60191..40788e34 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -252,6 +252,22 @@ } } +bool IsSingleFieldFormFillerFillingProduct(FillingProduct filling_product) { + switch (filling_product) { + case FillingProduct::kAutocomplete: + case FillingProduct::kIban: + case FillingProduct::kMerchantPromoCode: + return true; + case FillingProduct::kPlusAddresses: + case FillingProduct::kCompose: + case FillingProduct::kPasswordManager: + case FillingProduct::kCreditCard: + case FillingProduct::kAddress: + case FillingProduct::kNone: + return false; + } +} + FillDataType GetEventTypeFromSingleFieldSuggestionPopupItemId( PopupItemId popup_item_id) { switch (popup_item_id) { @@ -1677,11 +1693,15 @@ if (!autofill_trigger_field) { return; } - autofill_trigger_field->AppendLogEventIfNotRepeated(TriggerFillFieldLogEvent{ - .data_type = - GetEventTypeFromSingleFieldSuggestionPopupItemId(popup_item_id), - .associated_country_code = "", - .timestamp = AutofillClock::Now()}); + if (IsSingleFieldFormFillerFillingProduct( + GetFillingProductFromPopupItemId(popup_item_id))) { + autofill_trigger_field->AppendLogEventIfNotRepeated( + TriggerFillFieldLogEvent{ + .data_type = + GetEventTypeFromSingleFieldSuggestionPopupItemId(popup_item_id), + .associated_country_code = "", + .timestamp = AutofillClock::Now()}); + } } void BrowserAutofillManager::OnUserHideSuggestions(const FormData& form,
diff --git a/components/autofill/core/browser/filling_product.cc b/components/autofill/core/browser/filling_product.cc index 78fd47c..8243b52 100644 --- a/components/autofill/core/browser/filling_product.cc +++ b/components/autofill/core/browser/filling_product.cc
@@ -30,7 +30,6 @@ case PopupItemId::kPaymentsEntryNotSelectable: return FillingProduct::kCreditCard; case PopupItemId::kMerchantPromoCodeEntry: - case PopupItemId::kSeePromoCodeDetails: return FillingProduct::kMerchantPromoCode; case PopupItemId::kIbanEntry: return FillingProduct::kIban; @@ -57,6 +56,7 @@ case PopupItemId::kFillExistingPlusAddress: return FillingProduct::kPlusAddresses; case PopupItemId::kAutofillOptions: + case PopupItemId::kSeePromoCodeDetails: case PopupItemId::kSeparator: case PopupItemId::kClearForm: case PopupItemId::kMixedFormMessage:
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 9e23755d..747be63 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1438,7 +1438,8 @@ } std::vector<const Iban*> PersonalDataManager::GetIbansToSuggest() const { - std::vector<const Iban*> ibans_to_suggest = GetIbans(); + std::vector<const Iban*> ibans_to_suggest = + ShouldSuggestServerPaymentMethods() ? GetIbans() : GetLocalIbans(); // Remove any IBAN from the returned list if it's a local IBAN and its // prefix, suffix, and length matches any existing server IBAN. std::erase_if(ibans_to_suggest, [this](const Iban* iban) { @@ -1593,7 +1594,7 @@ } std::vector<CreditCard*> credit_cards; - if (ShouldSuggestServerCards()) { + if (ShouldSuggestServerPaymentMethods()) { credit_cards = GetCreditCards(); } else { credit_cards = GetLocalCreditCards(); @@ -1661,7 +1662,7 @@ syncer::UserSelectableType::kPayments); } -bool PersonalDataManager::ShouldSuggestServerCards() const { +bool PersonalDataManager::ShouldSuggestServerPaymentMethods() const { if (!IsAutofillWalletImportEnabled()) return false; @@ -1674,15 +1675,15 @@ // TODO(crbug.com/1462552): Simplify once ConsentLevel::kSync and // SyncService::IsSyncFeatureEnabled() are deleted from the codebase. if (!sync_service_->IsSyncFeatureEnabled()) { - // For SyncTransport, only show server cards if the user has opted in to - // seeing them in the dropdown. + // For SyncTransport, only show server payment methods if the user has opted + // in to seeing them in the dropdown. if (!prefs::IsUserOptedInWalletSyncTransport( pref_service_, sync_service_->GetAccountInfo().account_id)) { return false; } } - // Server cards should be suggested if the sync service is active. + // Server payment methods should be suggested if the sync service is active. return sync_service_->GetActiveDataTypes().Has(syncer::AUTOFILL_WALLET_DATA); }
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h index ecdcd784c..61f575c 100644 --- a/components/autofill/core/browser/personal_data_manager.h +++ b/components/autofill/core/browser/personal_data_manager.h
@@ -809,8 +809,9 @@ // addresses, credit card, offer and IBAN. On subsequent calls, does nothing. void LogStoredDataMetrics() const; - // Whether the server cards are enabled and should be suggested to the user. - virtual bool ShouldSuggestServerCards() const; + // Whether server cards or IBANs are enabled and should be suggested to the + // user. + virtual bool ShouldSuggestServerPaymentMethods() const; // Overrideable for testing. virtual std::string CountryCodeForCurrentTimezone() const;
diff --git a/components/autofill/core/browser/test_personal_data_manager.cc b/components/autofill/core/browser/test_personal_data_manager.cc index 1bcab5e..d597a47 100644 --- a/components/autofill/core/browser/test_personal_data_manager.cc +++ b/components/autofill/core/browser/test_personal_data_manager.cc
@@ -257,7 +257,7 @@ return PersonalDataManager::IsAutofillWalletImportEnabled(); } -bool TestPersonalDataManager::ShouldSuggestServerCards() const { +bool TestPersonalDataManager::ShouldSuggestServerPaymentMethods() const { return IsAutofillPaymentMethodsEnabled() && IsAutofillWalletImportEnabled(); }
diff --git a/components/autofill/core/browser/test_personal_data_manager.h b/components/autofill/core/browser/test_personal_data_manager.h index 9545836..c38906e 100644 --- a/components/autofill/core/browser/test_personal_data_manager.h +++ b/components/autofill/core/browser/test_personal_data_manager.h
@@ -64,7 +64,7 @@ bool IsAutofillProfileEnabled() const override; bool IsAutofillPaymentMethodsEnabled() const override; bool IsAutofillWalletImportEnabled() const override; - bool ShouldSuggestServerCards() const override; + bool ShouldSuggestServerPaymentMethods() const override; std::string CountryCodeForCurrentTimezone() const override; void ClearAllLocalData() override; bool IsDataLoaded() const override;
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 8e27f23..8089731 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -734,12 +734,6 @@ base::FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(IS_ANDROID) -// When enabled, Autofill suggestions are displayed in the keyboard accessory -// instead of the regular popup. -BASE_FEATURE(kAutofillKeyboardAccessory, - "AutofillKeyboardAccessory_LAUNCHED", - base::FEATURE_ENABLED_BY_DEFAULT); - // Controls whether the touch to fill surface is shown for credit cards on // Android. BASE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index 08f4910..4a3fc73 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -249,7 +249,6 @@ BASE_DECLARE_FEATURE(kAutofillAndroidDisableSuggestionsOnJSFocus); #if BUILDFLAG(IS_ANDROID) -COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillKeyboardAccessory); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid); COMPONENT_EXPORT(AUTOFILL)
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn index 93822b6c..388651f 100644 --- a/components/browser_sync/BUILD.gn +++ b/components/browser_sync/BUILD.gn
@@ -11,8 +11,6 @@ "active_devices_provider_impl.cc", "active_devices_provider_impl.h", "browser_sync_client.h", - "browser_sync_switches.cc", - "browser_sync_switches.h", "signin_confirmation_helper.cc", "signin_confirmation_helper.h", "sync_api_component_factory_impl.cc", @@ -23,7 +21,10 @@ "sync_to_signin_migration.h", ] - public_deps = [ "//components/sync" ] + public_deps = [ + ":switches", + "//components/sync", + ] deps = [ "//base", @@ -66,6 +67,15 @@ } } +static_library("switches") { + sources = [ + "browser_sync_switches.cc", + "browser_sync_switches.h", + ] + + deps = [ "//base" ] +} + source_set("unit_tests") { testonly = true
diff --git a/components/browser_sync/browser_sync_switches.cc b/components/browser_sync/browser_sync_switches.cc index 065ec79..9f02681 100644 --- a/components/browser_sync/browser_sync_switches.cc +++ b/components/browser_sync/browser_sync_switches.cc
@@ -16,4 +16,12 @@ "SyncFilterOutInactiveDevicesForSingleClient", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kMigrateSyncingUserToSignedIn, + "MigrateSyncingUserToSignedIn", + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kUndoMigrationOfSyncingUserToSignedIn, + "UndoMigrationOfSyncingUserToSignedIn", + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace switches
diff --git a/components/browser_sync/browser_sync_switches.h b/components/browser_sync/browser_sync_switches.h index 9e779ff7..f865d8b 100644 --- a/components/browser_sync/browser_sync_switches.h +++ b/components/browser_sync/browser_sync_switches.h
@@ -7,7 +7,6 @@ #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" -#include "build/build_config.h" namespace switches { @@ -38,6 +37,14 @@ &kSyncFilterOutInactiveDevicesForSingleClient, "SyncActiveDeviceMargin", base::Days(7)}; +// If enabled, eligible users (i.e. those for which Sync-the-feature is active) +// are migrated, at browser startup, to the signed-in non-syncing state. +BASE_DECLARE_FEATURE(kMigrateSyncingUserToSignedIn); + +// If enabled, users who were migrated from syncing to signed-in via the above +// flag are migrated back into the syncing state. +BASE_DECLARE_FEATURE(kUndoMigrationOfSyncingUserToSignedIn); + } // namespace switches #endif // COMPONENTS_BROWSER_SYNC_BROWSER_SYNC_SWITCHES_H_
diff --git a/components/browser_sync/sync_to_signin_migration.cc b/components/browser_sync/sync_to_signin_migration.cc index 6043947..1bfd1443 100644 --- a/components/browser_sync/sync_to_signin_migration.cc +++ b/components/browser_sync/sync_to_signin_migration.cc
@@ -12,6 +12,7 @@ #include "base/strings/strcat.h" #include "build/build_config.h" #include "components/bookmarks/common/bookmark_constants.h" +#include "components/browser_sync/browser_sync_switches.h" #include "components/password_manager/core/browser/password_manager_constants.h" #include "components/prefs/pref_service.h" #include "components/signin/public/base/gaia_id_hash.h" @@ -24,10 +25,6 @@ namespace browser_sync { -BASE_FEATURE(kMigrateSyncingUserToSignedIn, - "MigrateSyncingUserToSignedIn", - base::FEATURE_DISABLED_BY_DEFAULT); - namespace { // These values are persisted to logs. Entries should not be renumbered and @@ -39,11 +36,28 @@ kDontMigrateSyncStatusUndefined = 3, kDontMigrateSyncStatusInitializing = 4, kDontMigrateFlagDisabled = 5, - kMaxValue = kDontMigrateFlagDisabled + kUndoMigration = 6, + kUndoNotNecessary = 7, + kMaxValue = kUndoNotNecessary }; -SyncToSigninMigrationDecision ShouldMigrateSyncingUserToSignedIn( +SyncToSigninMigrationDecision GetSyncToSigninMigrationDecision( const PrefService* pref_service) { + // If the flag to undo the migration is set, that overrides anything else. + if (base::FeatureList::IsEnabled( + switches::kUndoMigrationOfSyncingUserToSignedIn)) { + if (pref_service + ->GetString(prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn) + .empty()) { + // The user was never migrated, or the migration was already undone. + // Nothing to be done here. + return SyncToSigninMigrationDecision::kUndoNotNecessary; + } else { + // The user (or more precisely, this profile) was previously migrated. + return SyncToSigninMigrationDecision::kUndoMigration; + } + } + if (pref_service->GetString(prefs::kGoogleServicesAccountId).empty()) { // Signed-out user, nothing to migrate. return SyncToSigninMigrationDecision::kDontMigrateNotSignedIn; @@ -77,13 +91,84 @@ // Check the feature flag last, so that metrics can record all the other // reasons to not do the migration, even with the flag disabled. - if (!base::FeatureList::IsEnabled(kMigrateSyncingUserToSignedIn)) { + if (!base::FeatureList::IsEnabled(switches::kMigrateSyncingUserToSignedIn)) { return SyncToSigninMigrationDecision::kDontMigrateFlagDisabled; } return SyncToSigninMigrationDecision::kMigrate; } +void UndoSyncToSigninMigration(PrefService* pref_service) { + const std::string migrated_gaia_id = pref_service->GetString( + prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn); + + if (migrated_gaia_id.empty()) { + // The user was never migrated, or the migration was already undone. Nothing + // to be done here. + return; + } + + const std::string signed_in_gaia_id = + pref_service->GetString(prefs::kGoogleServicesAccountId); + + if (signed_in_gaia_id != migrated_gaia_id) { + // The user was migrated, but has since signed out, or signed in with a + // different account. Clean up the migration prefs; otherwise nothing to be + // done here. + pref_service->ClearPref( + prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn); + pref_service->ClearPref( + prefs::kGoogleServicesSyncingUsernameMigratedToSignedIn); + return; + } + + // The user was migrated, and is still signed in with the same account. Undo + // the migration. + + // Mark the user as syncing again. + pref_service->SetBoolean(prefs::kGoogleServicesConsentedToSync, true); + + // Restore the "previously syncing user" prefs too. + pref_service->SetString(prefs::kGoogleServicesLastSyncingAccountIdDeprecated, + signed_in_gaia_id); + pref_service->SetString(prefs::kGoogleServicesLastSyncingGaiaId, + signed_in_gaia_id); + pref_service->SetString( + prefs::kGoogleServicesLastSyncingUsername, + pref_service->GetString( + prefs::kGoogleServicesSyncingUsernameMigratedToSignedIn)); + + // Clear the "migrated user" prefs, so the "undo" logic doesn't run again. + pref_service->ClearPref( + prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn); + pref_service->ClearPref( + prefs::kGoogleServicesSyncingUsernameMigratedToSignedIn); + + // Selected-data-types prefs: No reverse migration - the user will just go + // back to their previous Sync settings. + +#if BUILDFLAG(IS_IOS) + // Bookmarks: The forward migration is an atomic file move. Either that + // happened, in which case the Sync machinery will clean up the account store + // and start over with the local-or-syncable store. Or the file move didn't + // happen for some reason. Either way, nothing to be done here. +#else + // TODO(crbug.com/1503647): On platforms other than iOS, the forward migration + // for bookmarks isn't implemented yet, so the reverse migration can't be + // implemented either. + NOTIMPLEMENTED(); +#endif // BUILDFLAG(IS_IOS) + + // Passwords: Same as bookmarks, this is an atomic file move. Nothing to be + // done here. + + // ReadingList: The migration is asynchronous. Most likely it has been + // completed by this point, but in case it's still pending, stop attempting it + // now. + pref_service->ClearPref( + syncer::prefs::internal::kMigrateReadingListFromLocalToAccount); +} + // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class SyncToSigninMigrationDataTypeDecision { @@ -136,14 +221,19 @@ // ====================================== const SyncToSigninMigrationDecision decision = - ShouldMigrateSyncingUserToSignedIn(pref_service); + GetSyncToSigninMigrationDecision(pref_service); base::UmaHistogramEnumeration("Sync.SyncToSigninMigrationDecision", decision); switch (decision) { + case SyncToSigninMigrationDecision::kUndoMigration: + // Undo the migration (if appropriate) and nothing else. + UndoSyncToSigninMigration(pref_service); + return; case SyncToSigninMigrationDecision::kDontMigrateNotSignedIn: case SyncToSigninMigrationDecision::kDontMigrateNotSyncing: case SyncToSigninMigrationDecision::kDontMigrateSyncStatusUndefined: case SyncToSigninMigrationDecision::kDontMigrateSyncStatusInitializing: + case SyncToSigninMigrationDecision::kUndoNotNecessary: // No migration, and no point in recording per-type metrics - we're done. return; case SyncToSigninMigrationDecision::kDontMigrateFlagDisabled: @@ -202,7 +292,7 @@ // `kGoogleServicesAccountId` stores the Gaia ID of the syncing account. const std::string gaia_id = pref_service->GetString(prefs::kGoogleServicesAccountId); - // Guaranteed to be non-empty by ShouldMigrateSyncingUserToSignedIn(). + // Guaranteed to be non-empty by GetSyncToSigninMigrationDecision(). CHECK(!gaia_id.empty()); // Remove ConsentLevel::kSync. This also ensures that the whole migration will
diff --git a/components/browser_sync/sync_to_signin_migration.h b/components/browser_sync/sync_to_signin_migration.h index fb9469d8..99fc61af 100644 --- a/components/browser_sync/sync_to_signin_migration.h +++ b/components/browser_sync/sync_to_signin_migration.h
@@ -15,8 +15,6 @@ namespace browser_sync { -BASE_DECLARE_FEATURE(kMigrateSyncingUserToSignedIn); - void MaybeMigrateSyncingUserToSignedIn(const base::FilePath& profile_path, PrefService* pref_service);
diff --git a/components/browser_sync/sync_to_signin_migration_unittest.cc b/components/browser_sync/sync_to_signin_migration_unittest.cc index a912a79..2e34496 100644 --- a/components/browser_sync/sync_to_signin_migration_unittest.cc +++ b/components/browser_sync/sync_to_signin_migration_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "components/browser_sync/browser_sync_switches.h" #include "components/prefs/testing_pref_service.h" #include "components/signin/public/base/signin_pref_names.h" #include "components/signin/public/identity_manager/identity_manager.h" @@ -31,9 +32,9 @@ public: explicit SyncToSigninMigrationTestBase(bool migration_feature_enabled) { if (migration_feature_enabled) { - features_.InitAndEnableFeature(kMigrateSyncingUserToSignedIn); + features_.InitAndEnableFeature(switches::kMigrateSyncingUserToSignedIn); } else { - features_.InitAndDisableFeature(kMigrateSyncingUserToSignedIn); + features_.InitAndDisableFeature(switches::kMigrateSyncingUserToSignedIn); } signin::IdentityManager::RegisterProfilePrefs(pref_service_.registry()); @@ -304,6 +305,42 @@ EXPECT_EQ(pref_service_.user_prefs_store()->GetValues(), all_prefs); } +TEST_F(SyncToSigninMigrationTest, UndoFeaturePreventsMigration) { + base::test::ScopedFeatureList undo_feature; + undo_feature.InitAndEnableFeature( + switches::kUndoMigrationOfSyncingUserToSignedIn); + + // Everything is active. + ASSERT_EQ(sync_service_.GetTransportState(), + syncer::SyncService::TransportState::ACTIVE); + ASSERT_TRUE(sync_service_.HasSyncConsent()); + ASSERT_TRUE(sync_service_.GetActiveDataTypes().HasAll( + {syncer::BOOKMARKS, syncer::PASSWORDS, syncer::READING_LIST})); + + // Save the above state to prefs. + RecordStateToPrefs(); + + // Take a copy of all current pref values, to verify that the migration + // doesn't modify any of them. + const base::Value::Dict all_prefs = + pref_service_.user_prefs_store()->GetValues(); + + base::HistogramTester histograms; + + // Trigger the migration. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // Even though the user would be eligible, the "undo" feature should have + // prevented the migration from happening. (And since there was nothing to + // undo, it shouldn't have had any effect either.) + EXPECT_EQ(pref_service_.user_prefs_store()->GetValues(), all_prefs); + + histograms.ExpectUniqueSample( + "Sync.SyncToSigninMigrationDecision", + /*SyncToSigninMigrationDecision::kUndoNotNecessary*/ 7, 1); +} + // Fixture for tests covering migration metrics. The test param determines // whether the feature flag is enabled or not. class SyncToSigninMigrationMetricsTest : public SyncToSigninMigrationTestBase, @@ -903,5 +940,161 @@ } #endif // BUILDFLAG(IS_POSIX) +// A test fixture that performs the SyncToSignin migration, then enables the +// "undo migration" feature. +class SyncToSigninMigrationUndoTest : public SyncToSigninMigrationTestBase, + public testing::Test { + public: + SyncToSigninMigrationUndoTest() + : SyncToSigninMigrationTestBase( + /*migration_feature_enabled=*/true) {} + + void SetUp() override { + // Everything is active. + ASSERT_EQ(sync_service_.GetTransportState(), + syncer::SyncService::TransportState::ACTIVE); + ASSERT_TRUE(sync_service_.HasSyncConsent()); + ASSERT_TRUE(sync_service_.GetActiveDataTypes().HasAll( + {syncer::BOOKMARKS, syncer::PASSWORDS, syncer::READING_LIST})); + + // Save the above state to prefs. + RecordStateToPrefs(); + + // Run the migration, so that there is something to undo. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + undo_feature_.InitAndEnableFeature( + switches::kUndoMigrationOfSyncingUserToSignedIn); + } + + private: + base::test::ScopedFeatureList undo_feature_; +}; + +TEST_F(SyncToSigninMigrationUndoTest, UndoesMigration) { + // The user is in the migrated state - signed-in: + ASSERT_FALSE( + pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + ASSERT_EQ(pref_service_.GetString(prefs::kGoogleServicesAccountId), + sync_service_.GetAccountInfo().gaia); + // Not syncing: + ASSERT_FALSE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); + ASSERT_TRUE( + pref_service_.GetString(prefs::kGoogleServicesLastSyncingGaiaId).empty()); + ASSERT_TRUE(pref_service_.GetString(prefs::kGoogleServicesLastSyncingUsername) + .empty()); + // Marked as "migrated": + ASSERT_EQ(pref_service_.GetString( + prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn), + sync_service_.GetAccountInfo().gaia); + ASSERT_EQ(pref_service_.GetString( + prefs::kGoogleServicesSyncingUsernameMigratedToSignedIn), + sync_service_.GetAccountInfo().email); + + // Trigger the "undo" migration. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // The migration should've been undone, and the user should be back in the + // "syncing" state. + ASSERT_FALSE( + pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + EXPECT_TRUE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); + // The "last syncing user" prefs should also have been restored. + EXPECT_EQ(pref_service_.GetString(prefs::kGoogleServicesLastSyncingGaiaId), + sync_service_.GetAccountInfo().gaia); + EXPECT_EQ(pref_service_.GetString(prefs::kGoogleServicesLastSyncingUsername), + sync_service_.GetAccountInfo().email); + // And the "was migrated" prefs should've been cleared. + EXPECT_TRUE( + pref_service_ + .GetString(prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn) + .empty()); + EXPECT_TRUE( + pref_service_ + .GetString(prefs::kGoogleServicesSyncingUsernameMigratedToSignedIn) + .empty()); +} + +TEST_F(SyncToSigninMigrationUndoTest, Idempotent) { + // Trigger the "undo" migration. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // The user is now back in the "syncing" state. + ASSERT_FALSE( + pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + ASSERT_TRUE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); + ASSERT_TRUE( + pref_service_ + .GetString(prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn) + .empty()); + + // Take a copy of all current pref values, to verify that the second undo + // attempt doesn't modify any of them. + const base::Value::Dict all_prefs = + pref_service_.user_prefs_store()->GetValues(); + + // Trigger the (undo) migration again - it should have no further effect. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // The prefs should be unmodified. + EXPECT_EQ(pref_service_.user_prefs_store()->GetValues(), all_prefs); +} + +TEST_F(SyncToSigninMigrationUndoTest, DoesNotUndoMigrationIfSignedOut) { + // The user is in the "migrated" state - signed-in, not syncing, marked as + // migrated. + ASSERT_FALSE( + pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + ASSERT_FALSE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); + ASSERT_FALSE( + pref_service_ + .GetString(prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn) + .empty()); + + // The account gets signed out. + pref_service_.ClearPref(prefs::kGoogleServicesAccountId); + + // Trigger the "undo" migration. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // The migration should NOT have been undone, since the account isn't signed + // in anymore. + ASSERT_TRUE(pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + EXPECT_FALSE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); +} + +TEST_F(SyncToSigninMigrationUndoTest, DoesNotUndoMigrationIfDiffentAccount) { + // The user is in the "migrated" state - signed-in, not syncing, marked as + // migrated. + ASSERT_FALSE( + pref_service_.GetString(prefs::kGoogleServicesAccountId).empty()); + ASSERT_FALSE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); + ASSERT_FALSE( + pref_service_ + .GetString(prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn) + .empty()); + + // The account gets signed out, and a different account signed in. + pref_service_.SetString(prefs::kGoogleServicesAccountId, "different_gaia"); + ASSERT_NE(pref_service_.GetString(prefs::kGoogleServicesAccountId), + pref_service_.GetString( + prefs::kGoogleServicesSyncingGaiaIdMigratedToSignedIn)); + + // Trigger the "undo" migration. + MaybeMigrateSyncingUserToSignedIn(fake_profile_dir_.GetPath(), + &pref_service_); + + // The migration should NOT have been undone, since a different account is + // signed in now. + ASSERT_EQ(pref_service_.GetString(prefs::kGoogleServicesAccountId), + "different_gaia"); + EXPECT_FALSE(pref_service_.GetBoolean(prefs::kGoogleServicesConsentedToSync)); +} + } // namespace } // namespace browser_sync
diff --git a/components/browsing_topics/browsing_topics_calculator_unittest.cc b/components/browsing_topics/browsing_topics_calculator_unittest.cc index 8e957cf..21468ef54a 100644 --- a/components/browsing_topics/browsing_topics_calculator_unittest.cc +++ b/components/browsing_topics/browsing_topics_calculator_unittest.cc
@@ -1318,6 +1318,12 @@ } TEST_F(BrowsingTopicsCalculatorTest, MultipleTopTopicsHaveDescendants) { + // This test assumes no top topics prioritization. + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + blink::features::kBrowsingTopicsParameters, + {{"prioritized_topics_list", ""}}); + base::Time begin_time = base::Time::Now(); AddHistoryEntries(
diff --git a/components/browsing_topics/browsing_topics_state_unittest.cc b/components/browsing_topics/browsing_topics_state_unittest.cc index 200e531..3c30b54a 100644 --- a/components/browsing_topics/browsing_topics_state_unittest.cc +++ b/components/browsing_topics/browsing_topics_state_unittest.cc
@@ -581,6 +581,10 @@ std::vector<EpochTopics> epochs; // Current version is 1 but it's forward compatible with 2. + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeatureWithParameters( + blink::features::kBrowsingTopicsParameters, + {{"prioritized_topics_list", ""}}); EXPECT_EQ(CurrentConfigVersion(), 1); epochs.emplace_back(CreateTestEpochTopics( kTime1, /*from_manually_triggered_calculation=*/false,
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 24cbeec9..72c3cb4 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "28.13", - "log_list_timestamp": "2023-12-12T12:54:11Z", + "version": "28.14", + "log_list_timestamp": "2023-12-13T12:53:58Z", "operators": [ { "name": "Google",
diff --git a/components/component_updater/component_installer.cc b/components/component_updater/component_installer.cc index 579427b..f23bcd7 100644 --- a/components/component_updater/component_installer.cc +++ b/components/component_updater/component_installer.cc
@@ -32,7 +32,6 @@ #include "components/component_updater/component_updater_paths.h" #include "components/component_updater/component_updater_service.h" #include "components/crx_file/crx_verifier.h" -#include "components/update_client/component_unpacker.h" #include "components/update_client/update_client.h" #include "components/update_client/update_client_errors.h" #include "components/update_client/update_query_params.h"
diff --git a/components/component_updater/component_installer_unittest.cc b/components/component_updater/component_installer_unittest.cc index 7f75c99..2d53d43 100644 --- a/components/component_updater/component_installer_unittest.cc +++ b/components/component_updater/component_installer_unittest.cc
@@ -32,9 +32,9 @@ #include "components/component_updater/component_updater_service_internal.h" #include "components/crx_file/crx_verifier.h" #include "components/prefs/testing_pref_service.h" -#include "components/update_client/component_unpacker.h" #include "components/update_client/crx_update_item.h" #include "components/update_client/patcher.h" +#include "components/update_client/puffin_component_unpacker.h" #include "components/update_client/test_configurator.h" #include "components/update_client/test_utils.h" #include "components/update_client/unzipper.h" @@ -44,7 +44,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -using ComponentUnpacker = update_client::ComponentUnpacker; using Configurator = update_client::Configurator; using CrxUpdateItem = update_client::CrxUpdateItem; using TestConfigurator = update_client::TestConfigurator; @@ -213,12 +212,15 @@ protected: void RunThreads(); void Unpack(const base::FilePath& crx_path); - ComponentUnpacker::Result result() const { return result_; } + update_client::PuffinComponentUnpacker::Result result() const { + return result_; + } base::test::TaskEnvironment task_environment_; private: - void UnpackComplete(const ComponentUnpacker::Result& result); + void UnpackComplete( + const update_client::PuffinComponentUnpacker::Result& result); void Schedule(const base::TimeDelta& initial_delay, const base::TimeDelta& delay, const UpdateScheduler::UserTask& user_task, @@ -234,7 +236,7 @@ scoped_refptr<TestConfigurator> config_; scoped_refptr<MockUpdateClient> update_client_ = base::MakeRefCounted<MockUpdateClient>(); - ComponentUnpacker::Result result_; + update_client::PuffinComponentUnpacker::Result result_; std::unique_ptr<ComponentUpdateService> component_updater_; raw_ptr<MockUpdateScheduler> scheduler_ = nullptr; }; @@ -261,17 +263,17 @@ } void ComponentInstallerTest::Unpack(const base::FilePath& crx_path) { - auto component_unpacker = base::MakeRefCounted<ComponentUnpacker>( + update_client::PuffinComponentUnpacker::Unpack( std::vector<uint8_t>(std::begin(kSha256Hash), std::end(kSha256Hash)), - crx_path, nullptr, config_->GetUnzipperFactory()->Create(), - config_->GetPatcherFactory()->Create(), crx_file::VerifierFormat::CRX3); - component_unpacker->Unpack(base::BindOnce( - &ComponentInstallerTest::UnpackComplete, base::Unretained(this))); + crx_path, config_->GetUnzipperFactory()->Create(), + crx_file::VerifierFormat::CRX3, + base::BindOnce(&ComponentInstallerTest::UnpackComplete, + base::Unretained(this))); RunThreads(); } void ComponentInstallerTest::UnpackComplete( - const ComponentUnpacker::Result& result) { + const update_client::PuffinComponentUnpacker::Result& result) { result_ = result; EXPECT_EQ(update_client::UnpackerError::kNone, result_.error);
diff --git a/components/content_settings/browser/ui/cookie_controls_controller.cc b/components/content_settings/browser/ui/cookie_controls_controller.cc index c22565a..73db9f4 100644 --- a/components/content_settings/browser/ui/cookie_controls_controller.cc +++ b/components/content_settings/browser/ui/cookie_controls_controller.cc
@@ -205,7 +205,10 @@ : CookieBlocking3pcdStatus::kLimited; } CookieControlsEnforcement enforcement; - if (info.source == SETTING_SOURCE_POLICY) { + if (info.source == SETTING_SOURCE_TPCD_GRANT && + blocking_status == CookieBlocking3pcdStatus::kLimited) { + enforcement = CookieControlsEnforcement::kEnforcedByTpcdGrant; + } else if (info.source == SETTING_SOURCE_POLICY) { enforcement = CookieControlsEnforcement::kEnforcedByPolicy; } else if (info.source == SETTING_SOURCE_EXTENSION) { enforcement = CookieControlsEnforcement::kEnforcedByExtension; @@ -214,9 +217,6 @@ // If the exception cannot be reset in-context because of the nature of the // setting, display as managed by setting. enforcement = CookieControlsEnforcement::kEnforcedByCookieSetting; - } else if (info.source == SETTING_SOURCE_TPCD_GRANT && - blocking_status == CookieBlocking3pcdStatus::kLimited) { - enforcement = CookieControlsEnforcement::kEnforcedByTpcdGrant; } else { enforcement = CookieControlsEnforcement::kNoEnforcement; }
diff --git a/components/metrics/demographics/demographic_metrics_provider.cc b/components/metrics/demographics/demographic_metrics_provider.cc index 88e414b..cb76c64 100644 --- a/components/metrics/demographics/demographic_metrics_provider.cc +++ b/components/metrics/demographics/demographic_metrics_provider.cc
@@ -152,7 +152,7 @@ status == UserDemographicsStatus::kSuccess); return; case MetricsLogUploader::MetricServiceType::UKM: - base::UmaHistogramEnumeration("UKM.UserDemographics.Status", status); + // UKM Metrics doesn't have demographic metrics. return; case MetricsLogUploader::MetricServiceType::STRUCTURED_METRICS: // Structured Metrics doesn't have demographic metrics.
diff --git a/components/metrics/demographics/demographic_metrics_provider_unittest.cc b/components/metrics/demographics/demographic_metrics_provider_unittest.cc index 3483d84..6649732b 100644 --- a/components/metrics/demographics/demographic_metrics_provider_unittest.cc +++ b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
@@ -445,10 +445,6 @@ EXPECT_EQ(kTestBirthYear + kBirthYearOffset, report.user_demographics().birth_year()); EXPECT_EQ(kTestGender, report.user_demographics().gender()); - - // Verify histograms. - histogram.ExpectUniqueSample("UKM.UserDemographics.Status", - UserDemographicsStatus::kSuccess, 1); } } // namespace
diff --git a/components/metrics/generate_expired_histograms_array.gni b/components/metrics/generate_expired_histograms_array.gni index 72a5de8..45d91f6 100644 --- a/components/metrics/generate_expired_histograms_array.gni +++ b/components/metrics/generate_expired_histograms_array.gni
@@ -48,7 +48,6 @@ "//tools/metrics/histograms/metadata/ash_user_education/enums.xml", "//tools/metrics/histograms/metadata/ash_user_education/histograms.xml", "//tools/metrics/histograms/metadata/assistant/histograms.xml", - "//tools/metrics/histograms/metadata/auth/histograms.xml", "//tools/metrics/histograms/metadata/auto/histograms.xml", "//tools/metrics/histograms/metadata/autofill/histograms.xml", "//tools/metrics/histograms/metadata/background/histograms.xml",
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager.cc b/components/optimization_guide/core/model_execution/model_execution_manager.cc index e227851c..8187078 100644 --- a/components/optimization_guide/core/model_execution/model_execution_manager.cc +++ b/components/optimization_guide/core/model_execution/model_execution_manager.cc
@@ -249,12 +249,12 @@ // Set the id if present. if (execute_response->has_server_execution_id()) { - log_entry.get()->set_model_execution_id( - execute_response->server_execution_id()); + log_entry->set_model_execution_id(execute_response->server_execution_id()); } if (execute_response->has_error_response()) { scoped_logger.set_message("Error: No Response Metadata"); + log_entry->set_error_response(execute_response->error_response()); // For unallowed error states, don't log request data. auto error = OptimizationGuideModelExecutionError::FromModelExecutionServerError(
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc b/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc index e15ff5b..358fba8 100644 --- a/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc +++ b/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc
@@ -203,6 +203,57 @@ "OptimizationGuide.ModelExecution.Result.Compose", false, 1); } +TEST_F(ModelExecutionManagerTest, + ExecuteModelWithServerErrorAllowedForLogging) { + base::HistogramTester histogram_tester; + + proto::ComposeRequest request; + request.mutable_generate_params()->set_user_input("a user typed this"); + base::RunLoop run_loop; + identity_test_env()->MakePrimaryAccountAvailable( + "test_email", signin::ConsentLevel::kSignin); + auto session = model_execution_manager()->StartSession( + proto::MODEL_EXECUTION_FEATURE_COMPOSE); + session->ExecuteModel( + request, base::BindRepeating( + [](base::RunLoop* run_loop, + OptimizationGuideModelStreamingExecutionResult result, + std::unique_ptr<ModelQualityLogEntry> log_entry) { + EXPECT_FALSE(result.has_value()); + EXPECT_EQ(OptimizationGuideModelExecutionError:: + ModelExecutionError::kUnsupportedLanguage, + result.error().error()); + EXPECT_NE(log_entry, nullptr); + // Check that correct error state is recordered. + EXPECT_EQ( + proto::ErrorState::ERROR_STATE_UNSUPPORTED_LANGUAGE, + log_entry->log_ai_data_request() + ->mutable_model_execution_info() + ->mutable_error_response() + ->error_state()); + run_loop->Quit(); + }, + &run_loop)); + identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "access_token", base::Time::Max()); + + std::string serialized_response; + proto::ExecuteResponse execute_response; + execute_response.mutable_error_response()->set_error_state( + proto::ErrorState::ERROR_STATE_UNSUPPORTED_LANGUAGE); + execute_response.SerializeToString(&serialized_response); + EXPECT_TRUE(SimulateResponse(serialized_response, net::HTTP_OK)); + + run_loop.Run(); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.ModelExecution.ServerError.Compose", + OptimizationGuideModelExecutionError::ModelExecutionError:: + kUnsupportedLanguage, + 1); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.ModelExecution.Result.Compose", false, 1); +} + TEST_F(ModelExecutionManagerTest, ExecuteModelWithPassthroughSession) { base::HistogramTester histogram_tester;
diff --git a/components/optimization_guide/core/model_quality/model_quality_log_entry.h b/components/optimization_guide/core/model_quality/model_quality_log_entry.h index f029eba..d1ad36b 100644 --- a/components/optimization_guide/core/model_quality/model_quality_log_entry.h +++ b/components/optimization_guide/core/model_quality/model_quality_log_entry.h
@@ -21,11 +21,11 @@ virtual ~ModelQualityLogEntry(); proto::LoggingMetadata* logging_metadata() { - return log_ai_data_request_.get()->mutable_logging_metadata(); + return log_ai_data_request_->mutable_logging_metadata(); } int64_t client_id() const { - return log_ai_data_request_.get()->mutable_logging_metadata()->client_id(); + return log_ai_data_request_->mutable_logging_metadata()->client_id(); } template <typename FeatureType> @@ -35,11 +35,15 @@ } void set_model_execution_id(const std::string& server_execution_id) { - log_ai_data_request_.get() - ->mutable_model_execution_info() + log_ai_data_request_->mutable_model_execution_info() ->set_server_execution_id(server_execution_id); } + void set_error_response(const proto::ErrorResponse& error_response) { + *(log_ai_data_request_->mutable_model_execution_info() + ->mutable_error_response()) = error_response; + } + proto::LogAiDataRequest* log_ai_data_request() { return log_ai_data_request_.get(); }
diff --git a/components/optimization_guide/proto/model_quality_metadata.proto b/components/optimization_guide/proto/model_quality_metadata.proto index cd3ffad..4574b20 100644 --- a/components/optimization_guide/proto/model_quality_metadata.proto +++ b/components/optimization_guide/proto/model_quality_metadata.proto
@@ -52,6 +52,9 @@ // Information for how the on-device model execution was done. OnDeviceModelExecutionInfo on_device_model_execution_info = 2; + + // The error code returned by the model execution server, if any. + ErrorResponse error_response = 3; } message OnDeviceModelExecutionInfo {
diff --git a/components/password_manager/core/browser/DEPS b/components/password_manager/core/browser/DEPS index 36d302d..5fe5c66 100644 --- a/components/password_manager/core/browser/DEPS +++ b/components/password_manager/core/browser/DEPS
@@ -12,8 +12,9 @@ "+components/safe_browsing/core/common/features.h", "+components/signin/public", "+components/sync/base", - "+components/sync/service", + "+components/sync/engine/configure_reason.h", "+components/sync/model", + "+components/sync/service", "+components/sync/test", "+components/sync_preferences", "+components/ukm",
diff --git a/components/password_manager/core/browser/sync/BUILD.gn b/components/password_manager/core/browser/sync/BUILD.gn index 2346f3fe0..00afd52 100644 --- a/components/password_manager/core/browser/sync/BUILD.gn +++ b/components/password_manager/core/browser/sync/BUILD.gn
@@ -35,6 +35,7 @@ source_set("unit_tests") { testonly = true sources = [ + "password_model_type_controller_unittest.cc", "password_proto_utils_unittest.cc", "password_sync_bridge_unittest.cc", ] @@ -47,6 +48,7 @@ "//components/password_manager/core/common", "//components/prefs", "//components/prefs:test_support", + "//components/signin/public/identity_manager:test_support", "//components/sync:test_support", "//components/sync/protocol", "//testing/gmock",
diff --git a/components/password_manager/core/browser/sync/password_model_type_controller_unittest.cc b/components/password_manager/core/browser/sync/password_model_type_controller_unittest.cc new file mode 100644 index 0000000..f34b645 --- /dev/null +++ b/components/password_manager/core/browser/sync/password_model_type_controller_unittest.cc
@@ -0,0 +1,123 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/sync/password_model_type_controller.h" + +#include <memory> +#include <string> +#include <utility> + +#include "base/functional/callback_helpers.h" +#include "base/memory/raw_ptr.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "build/build_config.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "components/sync/base/sync_mode.h" +#include "components/sync/engine/configure_reason.h" +#include "components/sync/service/configure_context.h" +#include "components/sync/test/mock_model_type_controller_delegate.h" +#include "components/sync/test/test_sync_service.h" +#include "google_apis/gaia/core_account_id.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace password_manager { +namespace { + +class PasswordModelTypeControllerTest : public ::testing::Test { + public: + PasswordModelTypeControllerTest() { +#if BUILDFLAG(IS_ANDROID) + pref_service_.registry()->RegisterIntegerPref( + prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>(prefs::UseUpmLocalAndSeparateStoresState::kOff)); +#endif + + auto full_sync_delegate = + std::make_unique<syncer::MockModelTypeControllerDelegate>(); + full_sync_delegate_ = full_sync_delegate.get(); + auto transport_only_delegate = + std::make_unique<syncer::MockModelTypeControllerDelegate>(); + transport_only_delegate_ = transport_only_delegate.get(); + controller_ = std::make_unique<PasswordModelTypeController>( + std::move(full_sync_delegate), std::move(transport_only_delegate), + &pref_service_, identity_test_env_.identity_manager(), &sync_service_); + } + + PasswordModelTypeController* controller() { return controller_.get(); } + + PrefService* pref_service() { return &pref_service_; } + + syncer::MockModelTypeControllerDelegate* full_sync_delegate() { + return full_sync_delegate_; + } + + syncer::MockModelTypeControllerDelegate* transport_only_delegate() { + return transport_only_delegate_; + } + + private: + base::test::SingleThreadTaskEnvironment task_environment_; + TestingPrefServiceSimple pref_service_; + signin::IdentityTestEnvironment identity_test_env_; + syncer::TestSyncService sync_service_; + std::unique_ptr<PasswordModelTypeController> controller_; + raw_ptr<syncer::MockModelTypeControllerDelegate> full_sync_delegate_; + raw_ptr<syncer::MockModelTypeControllerDelegate> transport_only_delegate_; +}; + +#if BUILDFLAG(IS_ANDROID) +TEST_F(PasswordModelTypeControllerTest, OverrideFullSyncModeIfUPMLocalOn) { + pref_service()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState::kOn)); + // `transport_only_delegate` should be used, despite syncer::SyncMode::kFull + // being passed below. + EXPECT_CALL(*full_sync_delegate(), OnSyncStarting).Times(0); + EXPECT_CALL(*transport_only_delegate(), OnSyncStarting); + + syncer::ConfigureContext context; + context.authenticated_account_id = CoreAccountId::FromGaiaId("gaia"); + context.cache_guid = "cache_guid"; + context.sync_mode = syncer::SyncMode::kFull; + context.reason = syncer::CONFIGURE_REASON_RECONFIGURATION; + context.configuration_start_time = base::Time::Now(); + controller()->LoadModels(context, base::DoNothing()); +} + +TEST_F(PasswordModelTypeControllerTest, + DoNotOverrideFullSyncModeIfUPMLocalOff) { + // `full_sync_delegate` should be used for syncer::SyncMode::kFull, as + // expected. + EXPECT_CALL(*full_sync_delegate(), OnSyncStarting); + EXPECT_CALL(*transport_only_delegate(), OnSyncStarting).Times(0); + + syncer::ConfigureContext context; + context.authenticated_account_id = CoreAccountId::FromGaiaId("gaia"); + context.cache_guid = "cache_guid"; + context.sync_mode = syncer::SyncMode::kFull; + context.reason = syncer::CONFIGURE_REASON_RECONFIGURATION; + context.configuration_start_time = base::Time::Now(); + controller()->LoadModels(context, base::DoNothing()); +} + +TEST_F(PasswordModelTypeControllerTest, BlockSyncIfUPMLocalMigrationPending) { + pref_service()->SetInteger( + password_manager::prefs::kPasswordsUseUPMLocalAndSeparateStores, + static_cast<int>( + password_manager::prefs::UseUpmLocalAndSeparateStoresState:: + kOffAndMigrationPending)); + + EXPECT_EQ( + controller()->GetPreconditionState(), + PasswordModelTypeController::PreconditionState::kMustStopAndKeepData); +} +#endif // BUILDFLAG(IS_ANDROID) + +} // namespace +} // namespace password_manager
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml index c8cb484..003c305 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml
@@ -1,4 +1,5 @@ caption: Enable the migration of Chromad devices into cloud management +deprecated: true default: false desc: |- Enable the migration of <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> managed devices into cloud management. This policy allows for a remote start of a touchless migration of multiple devices in a company. Additionally, the migration will be as transparent as possible to the end users. @@ -27,6 +28,6 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:98- +- chrome_os:98-114 tags: [] type: main
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml index 7069b27..c036d80 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml
@@ -1,4 +1,5 @@ caption: Authentication data cache lifetime +deprecated: true default: 73 desc: |- Setting the policy specifies in hours the authentication data cache lifetime. The cache has data about realms trusted by the machine realm (affiliated realms). So, authentication data caching helps speed up sign-in. User-specific data and data for unaffiliated realms isn't cached. @@ -22,7 +23,7 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:73- +- chrome_os:73-114 tags: - admin-sharing type: int
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml index df812bb..2351852 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml
@@ -1,4 +1,5 @@ caption: GPO cache lifetime +deprecated: true default: 25 desc: |- Setting the policy specifies in hours the Group Policy Object (GPO) cache lifetime—the maximum duration GPOs can be reused before they're redownloaded. Instead of redownloading them on every policy fetch, the system reuses cached GPOs as long as their version doesn't change. @@ -22,6 +23,6 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:73- +- chrome_os:73-114 tags: [] type: int
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml index c002856..f74bcba 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml
@@ -1,4 +1,5 @@ caption: Allowed Kerberos encryption types +deprecated: true default: 1 desc: |- Setting the policy designates which encryption types are allowed when requesting Kerberos tickets from a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> server. @@ -38,7 +39,7 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:66- +- chrome_os:66-114 tags: - system-security type: int-enum
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml index 0ea038d2..2d118f5 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml
@@ -1,4 +1,5 @@ caption: Machine password change rate +deprecated: true default: 30 desc: |- Setting the policy specifies in days how often a client changes their machine account password. The password is randomly generated by the client and not visible to the user. Disabling this policy or setting a high number of days can negatively impact security, because it gives potential attackers more time to find and use the machine account password. @@ -22,7 +23,7 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:66- +- chrome_os:66-114 tags: - system-security type: int
diff --git a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml index 56486bd..3ef89a3 100644 --- a/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml +++ b/components/policy/resources/templates/policy_definitions/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml
@@ -1,4 +1,5 @@ caption: User policy loopback processing mode +deprecated: true default: 0 desc: |- Setting the policy specifies whether and how user policy from computer Group Policy Object (GPO) is processed. @@ -34,6 +35,6 @@ supported_chrome_os_management: - active_directory supported_on: -- chrome_os:66- +- chrome_os:66-114 tags: [] type: int-enum
diff --git a/components/policy/resources/templates/policy_definitions/Bruschetta/BruschettaInstallerConfiguration.yaml b/components/policy/resources/templates/policy_definitions/Bruschetta/BruschettaInstallerConfiguration.yaml index 60ef294..9525169 100644 --- a/components/policy/resources/templates/policy_definitions/Bruschetta/BruschettaInstallerConfiguration.yaml +++ b/components/policy/resources/templates/policy_definitions/Bruschetta/BruschettaInstallerConfiguration.yaml
@@ -2,9 +2,7 @@ - sidereal@google.com - file://chrome/browser/ash/guest_os/OWNERS -caption: |- - Configure the installer for Bruschetta VMs on <ph name="PRODUCT_OS_NAME">$2 - <ex>Google ChromeOS</ex></ph> devices +caption: Configure the installer for Bruschetta VMs on <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices desc: |- Sets metadata used by the installer for Bruschetta VMs on <ph
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceSwitchFunctionKeysBehaviorEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceSwitchFunctionKeysBehaviorEnabled.yaml index a2997d8..486e11c8 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceSwitchFunctionKeysBehaviorEnabled.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceSwitchFunctionKeysBehaviorEnabled.yaml
@@ -18,8 +18,6 @@ features: dynamic_refresh: true per_profile: false -future_on: -- chrome_os items: - caption: The launcher/search key will be able to change the behavior of function keys, and this setting will not be changeable by users. @@ -35,5 +33,7 @@ - cros-peripherals@google.com schema: type: boolean +supported_on: +- chrome_os:121- tags: [] type: main
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/OverrideSecurityRestrictionsOnInsecureOrigin.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/OverrideSecurityRestrictionsOnInsecureOrigin.yaml index 8b0a95e7..61763e6 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/OverrideSecurityRestrictionsOnInsecureOrigin.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/OverrideSecurityRestrictionsOnInsecureOrigin.yaml
@@ -1,12 +1,10 @@ -caption: |- - Origins or hostname patterns for which restrictions on - insecure origins should not apply +caption: Origins or hostname patterns for which restrictions on insecure origins should not apply desc: |- Setting the policy specifies a list of origins (URLs) or hostname patterns (such as *.example.com) for which security restrictions on insecure origins won't apply. Organizations can specify origins for legacy applications that can't deploy TLS or set up a staging server for internal web development, so developers can test out features requiring secure contexts without having to deploy TLS on the staging server. This policy also prevents the origin from being labeled "Not Secure" in the address bar. - Setting a list of URLs in this policy amounts to setting the command-line flag --unsafely-treat-insecure-origin-as-secure to a comma-separated list of the same URLs. The policy overrides the command-line flag and UnsafelyTreatInsecureOriginAsSecure, if present. + Setting a list of URLs in this policy amounts to setting the command-line flag --unsafely-treat-insecure-origin-as-secure to a comma-separated list of the same URLs. The policy overrides the command-line flag and UnsafelyTreatInsecureOriginAsSecure, if present. - For more information on secure contexts, see Secure Contexts ( https://www.w3.org/TR/secure-contexts ). + For more information on secure contexts, see Secure Contexts ( https://www.w3.org/TR/secure-contexts ). example_value: - http://testserver.example.com/ - '*.example.org'
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/UnsafelyTreatInsecureOriginAsSecure.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/UnsafelyTreatInsecureOriginAsSecure.yaml index 107f523..8988440 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/UnsafelyTreatInsecureOriginAsSecure.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/UnsafelyTreatInsecureOriginAsSecure.yaml
@@ -1,22 +1,17 @@ -caption: |- - Origins or hostname patterns for which restrictions on - insecure origins should not apply +caption: Origins or hostname patterns for which restrictions on insecure origins should not apply deprecated: true -desc: "Deprecated in M69. Use\n OverrideSecurityRestrictionsOnInsecureOrigin\ - \ instead.\n\n The policy specifies a list of origins (URLs) or hostname patterns\ - \ (such as \"*.example.com\") for which security restrictions on insecure origins\ - \ will not apply.\n\n The intent is to allow organizations to allow origins\ - \ for legacy applications that cannot deploy TLS, or to set up a staging server\ - \ for internal web development so that their developers can test out features requiring\ - \ secure contexts without having to deploy TLS on the staging server. This policy\ - \ will also prevent the origin from being labeled \"Not Secure\" in the omnibox.\n\ - \n Setting a list of URLs in this policy has the same effect as setting the\ - \ command-line flag '--unsafely-treat-insecure-origin-as-secure' to a comma-separated\ - \ list of the same URLs. If the policy is set, it will override the command-line\ - \ flag.\n\n This policy is deprecated in M69 in favor of OverrideSecurityRestrictionsOnInsecureOrigin.\ - \ If both policies are present, OverrideSecurityRestrictionsOnInsecureOrigin will\ - \ override this policy.\n\n For more information on secure contexts, see https://www.w3.org/TR/secure-contexts/\n\ - \ " +desc: |- + Deprecated in M69. Use OverrideSecurityRestrictionsOnInsecureOrigin instead. + + The policy specifies a list of origins (URLs) or hostname patterns (such as "*.example.com") for which security restrictions on insecure origins will not apply. + + The intent is to allow organizations to allow origins for legacy applications that cannot deploy TLS, or to set up a staging server for internal web development so that their developers can test out features requiring secure contexts without having to deploy TLS on the staging server. This policy will also prevent the origin from being labeled "Not Secure" in the omnibox. + + Setting a list of URLs in this policy has the same effect as setting the command-line flag '--unsafely-treat-insecure-origin-as-secure' to a comma-separated list of the same URLs. If the policy is set, it will override the command-line flag. + + This policy is deprecated in M69 in favor of OverrideSecurityRestrictionsOnInsecureOrigin. If both policies are present, OverrideSecurityRestrictionsOnInsecureOrigin will override this policy. + + For more information on secure contexts, see https://www.w3.org/TR/secure-contexts/ example_value: - http://testserver.example.com/ - '*.example.org'
diff --git a/components/policy/test/data/pref_mapping/ChromadToCloudMigrationEnabled.json b/components/policy/test/data/pref_mapping/ChromadToCloudMigrationEnabled.json index f091cc29..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/ChromadToCloudMigrationEnabled.json +++ b/components/policy/test/data/pref_mapping/ChromadToCloudMigrationEnabled.json
@@ -1,40 +1,5 @@ [ { - "os": [ - "chromeos_ash" - ], - "policy_pref_mapping_tests": [ - { - "policies": { - "ChromadToCloudMigrationEnabled": true - }, - "prefs": { - "ash.chromad_to_cloud_migration_enabled": { - "location": "local_state", - "value": true - } - } - }, - { - "policies": { - "ChromadToCloudMigrationEnabled": false - }, - "prefs": { - "ash.chromad_to_cloud_migration_enabled": { - "location": "local_state", - "value": false - } - } - }, - { - "policies": {}, - "prefs": { - "ash.chromad_to_cloud_migration_enabled": { - "default_value": false, - "location": "local_state" - } - } - } - ] + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/policy/test/data/pref_mapping/DeviceAuthDataCacheLifetime.json b/components/policy/test/data/pref_mapping/DeviceAuthDataCacheLifetime.json index 04a056f..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/DeviceAuthDataCacheLifetime.json +++ b/components/policy/test/data/pref_mapping/DeviceAuthDataCacheLifetime.json
@@ -1,5 +1,5 @@ [ { - "reason_for_missing_test": "Chrome OS device policy used by authpolicyd only, not used in Chrome" + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/policy/test/data/pref_mapping/DeviceGpoCacheLifetime.json b/components/policy/test/data/pref_mapping/DeviceGpoCacheLifetime.json index 04a056f..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/DeviceGpoCacheLifetime.json +++ b/components/policy/test/data/pref_mapping/DeviceGpoCacheLifetime.json
@@ -1,5 +1,5 @@ [ { - "reason_for_missing_test": "Chrome OS device policy used by authpolicyd only, not used in Chrome" + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/policy/test/data/pref_mapping/DeviceKerberosEncryptionTypes.json b/components/policy/test/data/pref_mapping/DeviceKerberosEncryptionTypes.json index 04a056f..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/DeviceKerberosEncryptionTypes.json +++ b/components/policy/test/data/pref_mapping/DeviceKerberosEncryptionTypes.json
@@ -1,5 +1,5 @@ [ { - "reason_for_missing_test": "Chrome OS device policy used by authpolicyd only, not used in Chrome" + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/policy/test/data/pref_mapping/DeviceMachinePasswordChangeRate.json b/components/policy/test/data/pref_mapping/DeviceMachinePasswordChangeRate.json index 04a056f..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/DeviceMachinePasswordChangeRate.json +++ b/components/policy/test/data/pref_mapping/DeviceMachinePasswordChangeRate.json
@@ -1,5 +1,5 @@ [ { - "reason_for_missing_test": "Chrome OS device policy used by authpolicyd only, not used in Chrome" + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/policy/test/data/pref_mapping/DeviceUserPolicyLoopbackProcessingMode.json b/components/policy/test/data/pref_mapping/DeviceUserPolicyLoopbackProcessingMode.json index 04a056f..769e6a2 100644 --- a/components/policy/test/data/pref_mapping/DeviceUserPolicyLoopbackProcessingMode.json +++ b/components/policy/test/data/pref_mapping/DeviceUserPolicyLoopbackProcessingMode.json
@@ -1,5 +1,5 @@ [ { - "reason_for_missing_test": "Chrome OS device policy used by authpolicyd only, not used in Chrome" + "reason_for_missing_test": "Policy was deprecated in M115" } ]
diff --git a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_unittest.cc b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_unittest.cc index 416dc7f6..46fe41d6 100644 --- a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_unittest.cc +++ b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_unittest.cc
@@ -67,6 +67,9 @@ TEST_F(PrivacySandboxAttestationsTestBase, SiteDefaultNotAttestedWithFeatureDefaultEnabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + kDefaultAllowPrivacySandboxAttestations); // Enrollment feature should be enabled by default. ASSERT_TRUE(base::FeatureList::IsEnabled( privacy_sandbox::kEnforcePrivacySandboxAttestations));
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc index 194e6d7..87416fbd 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.cc +++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -100,7 +100,7 @@ BASE_FEATURE(kDefaultAllowPrivacySandboxAttestations, "DefaultAllowPrivacySandboxAttestations", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); const char kPrivacySandboxEnrollmentOverrides[] = "privacy-sandbox-enrollment-overrides";
diff --git a/components/remote_cocoa/app_shim/window_move_loop.mm b/components/remote_cocoa/app_shim/window_move_loop.mm index c4684fe..bf9a8ce 100644 --- a/components/remote_cocoa/app_shim/window_move_loop.mm +++ b/components/remote_cocoa/app_shim/window_move_loop.mm
@@ -51,23 +51,29 @@ class ChildWindowMover { public: ChildWindowMover(NSWindow* window) : window_(window) { + initial_parent_origin_ = gfx::Point(window.frame.origin); for (NSWindow* child in window.childWindows) { initial_origins_.emplace_back(child, child.frame.origin); } } - // Moves child windows based on a given offset vector relative to their + // Moves child windows based on a parent origin offset relative to their // initial origins captured at the construction of this class. - void MoveByOffset(gfx::Vector2d move_offset) { + void MoveByOriginOffset() { if (!window_) { return; } + gfx::Point parent_origin = gfx::Point(window_.frame.origin); + gfx::Vector2d origin_offset(parent_origin.x() - initial_parent_origin_.x(), + parent_origin.y() - initial_parent_origin_.y()); + for (const auto& [child, initial_origin] : initial_origins_) { if (!child || child.parentWindow != window_) { continue; } - gfx::Point expected_origin = initial_origin + move_offset; + + gfx::Point expected_origin = initial_origin + origin_offset; // On macOS 14, child windows occasionally fail to follow their parent // during tab dragging. A workaround for this issue is to temporarily // remove the child window, set its frame origin, and then re-add it. @@ -81,6 +87,7 @@ private: NSWindow* __weak window_; std::vector<std::pair<NSWindow * __weak, gfx::Point>> initial_origins_; + gfx::Point initial_parent_origin_; }; } // namespace @@ -147,7 +154,7 @@ NSRect ns_frame = NSOffsetRect(initial_frame, mouse_offset.x(), mouse_offset.y()); [window setFrame:ns_frame display:NO animate:NO]; - child_window_mover.MoveByOffset(mouse_offset); + child_window_mover.MoveByOriginOffset(); // `setFrame:...` may have destroyed `this`, so do the weak check again. bool is_valid = [weak_cocoa_window_move_loop weak].get() == strong; if (is_valid && !has_moved) {
diff --git a/components/search_engines/search_engine_choice_utils_unittest.cc b/components/search_engines/search_engine_choice_utils_unittest.cc index da6df668..0c510628 100644 --- a/components/search_engines/search_engine_choice_utils_unittest.cc +++ b/components/search_engines/search_engine_choice_utils_unittest.cc
@@ -627,11 +627,14 @@ "FUTURE_VERSION", future_version.GetString()); + std::string feature_param_value = param_dict.empty() ? "{}" : param_dict; + base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( switches::kSearchEngineChoiceTrigger, - {{switches::kSearchEngineChoiceTriggerRepromptParams.name, param_dict}}); - ASSERT_EQ(param_dict.empty() ? "{}" : param_dict, + {{switches::kSearchEngineChoiceTriggerRepromptParams.name, + feature_param_value}}); + ASSERT_EQ(feature_param_value, switches::kSearchEngineChoiceTriggerRepromptParams.Get()); // Initialize the preference with some previous choice.
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter index 3eec305..470200ce 100644 --- a/components/segmentation_platform/components_unittests.filter +++ b/components/segmentation_platform/components_unittests.filter
@@ -38,7 +38,6 @@ *PostProcessorTest.* *PowerUserModelTest.* *PrefsMigratorTest.* -*QueryTilesModelTest.* *RequestDispatcherTest.* *RequestHandlerTest.* *ResultMigrationUtilsTest.*
diff --git a/components/segmentation_platform/embedder/DEPS b/components/segmentation_platform/embedder/DEPS index 6a4375a..9ad3acb1e 100644 --- a/components/segmentation_platform/embedder/DEPS +++ b/components/segmentation_platform/embedder/DEPS
@@ -4,6 +4,5 @@ "+components/sync", "+components/sync_device_info", "+components/sync_sessions", - "+components/query_tiles", "+ui/base", ]
diff --git a/components/segmentation_platform/embedder/default_model/BUILD.gn b/components/segmentation_platform/embedder/default_model/BUILD.gn index 8ec7aca..dba49d7d 100644 --- a/components/segmentation_platform/embedder/default_model/BUILD.gn +++ b/components/segmentation_platform/embedder/default_model/BUILD.gn
@@ -57,12 +57,9 @@ "intentional_user_model.h", "power_user_segment.cc", "power_user_segment.h", - "query_tiles_model.cc", - "query_tiles_model.h", "tablet_productivity_user_model.cc", "tablet_productivity_user_model.h", ] - deps += [ "//components/query_tiles:public" ] } } @@ -95,7 +92,6 @@ "frequent_feature_user_model_unittest.cc", "intentional_user_model_unittest.cc", "power_user_segment_unittest.cc", - "query_tiles_model_unittest.cc", "tablet_productivity_user_model_unittest.cc", ] }
diff --git a/components/segmentation_platform/embedder/default_model/query_tiles_model.cc b/components/segmentation_platform/embedder/default_model/query_tiles_model.cc deleted file mode 100644 index e78c555..0000000 --- a/components/segmentation_platform/embedder/default_model/query_tiles_model.cc +++ /dev/null
@@ -1,131 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/segmentation_platform/embedder/default_model/query_tiles_model.h" - -#include <array> - -#include "base/metrics/field_trial_params.h" -#include "base/task/sequenced_task_runner.h" -#include "components/query_tiles/switches.h" -#include "components/segmentation_platform/internal/metadata/metadata_writer.h" -#include "components/segmentation_platform/public/config.h" -#include "components/segmentation_platform/public/constants.h" -#include "components/segmentation_platform/public/model_provider.h" -#include "components/segmentation_platform/public/proto/model_metadata.pb.h" - -namespace segmentation_platform { - -namespace { -using proto::SegmentId; - -// Default parameters for query tiles model. -constexpr SegmentId kQueryTilesSegmentId = - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES; -constexpr int64_t kQueryTilesSignalStorageLength = 28; -constexpr int64_t kQueryTilesMinSignalCollectionLength = 7; -constexpr int64_t kMvThreshold = 1; - -// See -// https://source.chromium.org/chromium/chromium/src/+/main:chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileUtils.java -const char kNumDaysKeepShowingQueryTiles[] = - "num_days_keep_showing_query_tiles"; -const char kNumDaysMVCkicksBelowThreshold[] = - "num_days_mv_clicks_below_threshold"; - -// DEFAULT_NUM_DAYS_KEEP_SHOWING_QUERY_TILES -constexpr int kQueryTilesDefaultSelectionTTLDays = 28; -// DEFAULT_NUM_DAYS_MV_CLICKS_BELOW_THRESHOLD -constexpr int kQueryTilesDefaultUnknownTTLDays = 7; - -// InputFeatures. -constexpr std::array<MetadataWriter::UMAFeature, 2> kQueryTilesUMAFeatures = { - MetadataWriter::UMAFeature::FromUserAction("MobileNTPMostVisited", 7), - MetadataWriter::UMAFeature::FromUserAction( - "Search.QueryTiles.NTP.Tile.Clicked", - 7)}; - -std::unique_ptr<DefaultModelProvider> GetQueryTilesDefaultModel() { - if (!base::GetFieldTrialParamByFeatureAsBool( - query_tiles::features::kQueryTilesSegmentation, - kDefaultModelEnabledParam, true)) { - return nullptr; - } - return std::make_unique<QueryTilesModel>(); -} - -} // namespace - -// static -std::unique_ptr<Config> QueryTilesModel::GetConfig() { - if (!base::FeatureList::IsEnabled( - query_tiles::features::kQueryTilesSegmentation)) { - return nullptr; - } - auto config = std::make_unique<Config>(); - config->segmentation_key = kQueryTilesSegmentationKey; - config->segmentation_uma_name = kQueryTilesUmaName; - config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES, - GetQueryTilesDefaultModel()); - config->auto_execute_and_cache = true; - - int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt( - query_tiles::features::kQueryTilesSegmentation, - kNumDaysKeepShowingQueryTiles, kQueryTilesDefaultSelectionTTLDays); - int unknown_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt( - query_tiles::features::kQueryTilesSegmentation, - kNumDaysMVCkicksBelowThreshold, kQueryTilesDefaultUnknownTTLDays); - config->segment_selection_ttl = base::Days(segment_selection_ttl_days); - config->unknown_selection_ttl = base::Days(unknown_selection_ttl_days); - config->is_boolean_segment = true; - return config; -} - -QueryTilesModel::QueryTilesModel() - : DefaultModelProvider(kQueryTilesSegmentId) {} - -std::unique_ptr<DefaultModelProvider::ModelConfig> -QueryTilesModel::GetModelConfig() { - proto::SegmentationModelMetadata query_tiles_metadata; - MetadataWriter writer(&query_tiles_metadata); - writer.SetDefaultSegmentationMetadataConfig( - kQueryTilesMinSignalCollectionLength, kQueryTilesSignalStorageLength); - - // Set discrete mapping. - writer.AddBooleanSegmentDiscreteMapping(kQueryTilesSegmentationKey); - - // Set features. - writer.AddUmaFeatures(kQueryTilesUMAFeatures.data(), - kQueryTilesUMAFeatures.size()); - - return std::make_unique<ModelConfig>(std::move(query_tiles_metadata), - /*model_version=*/2); -} - -void QueryTilesModel::ExecuteModelWithInput( - const ModelProvider::Request& inputs, - ExecutionCallback callback) { - // Invalid inputs. - if (inputs.size() != kQueryTilesUMAFeatures.size()) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), absl::nullopt)); - return; - } - - const int mv_clicks = inputs[0]; - const int query_tiles_clicks = inputs[1]; - float result = 0; - - // If mv clicks are below the threshold or below the query tiles clicks, query - // tiles should be enabled. - if (mv_clicks <= kMvThreshold || mv_clicks <= query_tiles_clicks) { - result = 1; // Enable query tiles; - } - - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), ModelProvider::Response(1, result))); -} - -} // namespace segmentation_platform
diff --git a/components/segmentation_platform/embedder/default_model/query_tiles_model.h b/components/segmentation_platform/embedder/default_model/query_tiles_model.h deleted file mode 100644 index f545669..0000000 --- a/components/segmentation_platform/embedder/default_model/query_tiles_model.h +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_QUERY_TILES_MODEL_H_ -#define COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_QUERY_TILES_MODEL_H_ - -#include "components/segmentation_platform/public/model_provider.h" - -namespace segmentation_platform { - -struct Config; - -// Segmentation query tiles model provider. Provides a default model and -// metadata for the query tiles optimization target. -class QueryTilesModel : public DefaultModelProvider { - public: - QueryTilesModel(); - ~QueryTilesModel() override = default; - - // Disallow copy/assign. - QueryTilesModel(const QueryTilesModel&) = delete; - QueryTilesModel& operator=(const QueryTilesModel&) = delete; - - static std::unique_ptr<Config> GetConfig(); - - // ModelProvider implementation. - std::unique_ptr<ModelConfig> GetModelConfig() override; - - void ExecuteModelWithInput(const ModelProvider::Request& inputs, - ExecutionCallback callback) override; -}; - -} // namespace segmentation_platform - -#endif // COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_QUERY_TILES_MODEL_H_
diff --git a/components/segmentation_platform/embedder/default_model/query_tiles_model_unittest.cc b/components/segmentation_platform/embedder/default_model/query_tiles_model_unittest.cc deleted file mode 100644 index 9404350..0000000 --- a/components/segmentation_platform/embedder/default_model/query_tiles_model_unittest.cc +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/segmentation_platform/embedder/default_model/query_tiles_model.h" - -#include "components/segmentation_platform/embedder/default_model/default_model_test_base.h" - -namespace segmentation_platform { - -class QueryTilesModelTest : public DefaultModelTestBase { - public: - QueryTilesModelTest() - : DefaultModelTestBase(std::make_unique<QueryTilesModel>()) {} - ~QueryTilesModelTest() override = default; -}; - -TEST_F(QueryTilesModelTest, InitAndFetchModel) { - ExpectInitAndFetchModel(); -} - -TEST_F(QueryTilesModelTest, ExecuteModelWithInput) { - const float mv_threshold = 1; - - // When mv clicks are below the minimum threshold, query tiles should be - // enabled. - float mv_clicks = 0; - float qt_clicks = 0; - ExpectExecutionWithInput(/*inputs=*/{mv_clicks, qt_clicks}, - /*expected_error=*/false, /*expected_result=*/{1}); - - // When mv clicks are above threshold, but below qt clicks, query tiles should - // be enabled. - mv_clicks = mv_threshold + 1; - qt_clicks = mv_clicks + 1; - ExpectExecutionWithInput(/*inputs=*/{mv_clicks, qt_clicks}, - /*expected_error=*/false, /*expected_result=*/{1}); - - // When mv clicks are above threshold, and above qt clicks, query tiles should - // be disabled. - mv_clicks = mv_threshold + 1; - qt_clicks = mv_clicks - 1; - ExpectExecutionWithInput(/*inputs=*/{mv_clicks, qt_clicks}, - /*expected_error=*/false, /*expected_result=*/{0}); - - // When invalid inputs are given, execution should not return a result. - ExpectExecutionWithInput(/*inputs=*/{mv_clicks}, /*expected_error=*/true, - /*expected_result=*/{0}); - ExpectExecutionWithInput(/*inputs=*/{mv_clicks, qt_clicks, qt_clicks}, - /*expected_error=*/true, /*expected_result=*/{0}); -} - -} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/metadata/metadata_utils.cc b/components/segmentation_platform/internal/metadata/metadata_utils.cc index f52b83d..ea2d2c4 100644 --- a/components/segmentation_platform/internal/metadata/metadata_utils.cc +++ b/components/segmentation_platform/internal/metadata/metadata_utils.cc
@@ -601,10 +601,7 @@ base::flat_set<SegmentId> segment_ids_use_legacy{ SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2}; + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE}; return segment_ids_use_legacy.contains(segment_id); }
diff --git a/components/segmentation_platform/internal/migration/result_migration_utils.cc b/components/segmentation_platform/internal/migration/result_migration_utils.cc index 0cd300e..06de6b6 100644 --- a/components/segmentation_platform/internal/migration/result_migration_utils.cc +++ b/components/segmentation_platform/internal/migration/result_migration_utils.cc
@@ -40,8 +40,7 @@ segmentation_key == kFrequentFeatureUserKey || segmentation_key == kIntentionalUserKey || segmentation_key == kResumeHeavyUserKey || - segmentation_key == kShoppingUserSegmentationKey || - segmentation_key == kQueryTilesSegmentationKey) { + segmentation_key == kShoppingUserSegmentationKey) { return proto::Predictor::kBinaryClassifier; } else if (segmentation_key == kFeedUserSegmentationKey || segmentation_key == kPowerUserKey ||
diff --git a/components/segmentation_platform/internal/segmentation_ukm_helper.cc b/components/segmentation_platform/internal/segmentation_ukm_helper.cc index a41a83f..77c85c634 100644 --- a/components/segmentation_platform/internal/segmentation_ukm_helper.cc +++ b/components/segmentation_platform/internal/segmentation_ukm_helper.cc
@@ -167,8 +167,7 @@ SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE, SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES}; + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY}; } sampling_rate_ = GetModelExecutionSamplingRate(); DCHECK_GE(sampling_rate_, 0);
diff --git a/components/segmentation_platform/internal/stats.cc b/components/segmentation_platform/internal/stats.cc index 7f77e8f1..c077c45 100644 --- a/components/segmentation_platform/internal/stats.cc +++ b/components/segmentation_platform/internal/stats.cc
@@ -44,7 +44,6 @@ case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE: case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY: case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID: - case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES: case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT: case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER: case SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING:
diff --git a/components/segmentation_platform/internal/stats_unittest.cc b/components/segmentation_platform/internal/stats_unittest.cc index 663a0f9..02c7790b 100644 --- a/components/segmentation_platform/internal/stats_unittest.cc +++ b/components/segmentation_platform/internal/stats_unittest.cc
@@ -302,11 +302,13 @@ // Test default case of multiplying result by 100. stats::RecordModelExecutionResult( - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES, 0.19, - proto::SegmentationModelMetadata::RETURN_TYPE_PROBABILITY); - EXPECT_EQ(1, - tester.GetBucketCount( - "SegmentationPlatform.ModelExecution.Result.QueryTiles", 19)); + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT, + 0.19, proto::SegmentationModelMetadata::RETURN_TYPE_PROBABILITY); + EXPECT_EQ( + 1, + tester.GetBucketCount( + "SegmentationPlatform.ModelExecution.Result.ChromeLowUserEngagement", + 19)); // Test segments that uses rank as scores, which should be recorded as-is. stats::RecordModelExecutionResult(
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h index 999f947..fa5b355c 100644 --- a/components/segmentation_platform/public/constants.h +++ b/components/segmentation_platform/public/constants.h
@@ -22,10 +22,6 @@ const char kChromeStartAndroidV2SegmentationKey[] = "chrome_start_android_v2"; const char kChromeStartAndroidV2UmaName[] = "ChromeStartAndroidV2"; -// The key is used to decide whether to show query tiles. -const char kQueryTilesSegmentationKey[] = "query_tiles"; -const char kQueryTilesUmaName[] = "QueryTiles"; - // The key is used to decide whether a user has low user engagement with chrome. // This is a generic model that can be used by multiple features targeting // low-engaged users. Typically low engaged users are active in chrome below a
diff --git a/components/services/patch/file_patcher_impl.cc b/components/services/patch/file_patcher_impl.cc index 5e597ee..74e871e8 100644 --- a/components/services/patch/file_patcher_impl.cc +++ b/components/services/patch/file_patcher_impl.cc
@@ -7,9 +7,6 @@ #include <utility> #include "base/functional/callback.h" -#include "base/notreached.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" #include "third_party/puffin/src/include/puffin/puffpatch.h" namespace patch { @@ -22,36 +19,6 @@ FilePatcherImpl::~FilePatcherImpl() = default; -// TODO(crbug.com/1349158): Remove this function once PatchFilePuffPatch is -// implemented as this becomes obsolete. -void FilePatcherImpl::PatchFileBsdiff(base::File input_file, - base::File patch_file, - base::File output_file, - PatchFileBsdiffCallback callback) { - DCHECK(input_file.IsValid()); - DCHECK(patch_file.IsValid()); - DCHECK(output_file.IsValid()); - - const int patch_result_status = bsdiff::ApplyBinaryPatch( - std::move(input_file), std::move(patch_file), std::move(output_file)); - std::move(callback).Run(patch_result_status); -} - -// TODO(crbug.com/1349158): Remove this function once PatchFilePuffPatch is -// implemented as this becomes obsolete. -void FilePatcherImpl::PatchFileCourgette(base::File input_file, - base::File patch_file, - base::File output_file, - PatchFileCourgetteCallback callback) { - DCHECK(input_file.IsValid()); - DCHECK(patch_file.IsValid()); - DCHECK(output_file.IsValid()); - - const int patch_result_status = courgette::ApplyEnsemblePatch( - std::move(input_file), std::move(patch_file), std::move(output_file)); - std::move(callback).Run(patch_result_status); -} - void FilePatcherImpl::PatchFilePuffPatch(base::File input_file, base::File patch_file, base::File output_file,
diff --git a/components/services/patch/file_patcher_impl.h b/components/services/patch/file_patcher_impl.h index 1c1aa23..e95ba95 100644 --- a/components/services/patch/file_patcher_impl.h +++ b/components/services/patch/file_patcher_impl.h
@@ -32,14 +32,6 @@ private: // patch::mojom::FilePatcher: - void PatchFileBsdiff(base::File input_file, - base::File patch_file, - base::File output_file, - PatchFileBsdiffCallback callback) override; - void PatchFileCourgette(base::File input_file, - base::File patch_file, - base::File output_file, - PatchFileCourgetteCallback callback) override; void PatchFilePuffPatch(base::File input_file_path, base::File patch_file_path, base::File output_file_path,
diff --git a/components/services/patch/public/cpp/patch.cc b/components/services/patch/public/cpp/patch.cc index 22477413..6fa156c 100644 --- a/components/services/patch/public/cpp/patch.cc +++ b/components/services/patch/public/cpp/patch.cc
@@ -15,7 +15,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" -#include "components/update_client/component_patcher_operation.h" // nogncheck #include "mojo/public/cpp/bindings/remote.h" namespace patch { @@ -25,7 +24,7 @@ class PatchParams : public base::RefCounted<PatchParams> { public: PatchParams(mojo::PendingRemote<mojom::FilePatcher> file_patcher, - PatchCallback callback) + base::OnceCallback<void(int result)> callback) : file_patcher_(std::move(file_patcher)), callback_(std::move(callback)) {} @@ -34,7 +33,7 @@ mojo::Remote<mojom::FilePatcher>& file_patcher() { return file_patcher_; } - PatchCallback TakeCallback() { return std::move(callback_); } + base::OnceCallback<void(int)> TakeCallback() { return std::move(callback_); } private: friend class base::RefCounted<PatchParams>; @@ -45,69 +44,23 @@ // the callback runs. mojo::Remote<mojom::FilePatcher> file_patcher_; - PatchCallback callback_; + base::OnceCallback<void(int)> callback_; }; void PatchDone(scoped_refptr<PatchParams> params, int result) { params->file_patcher().reset(); - PatchCallback cb = params->TakeCallback(); + base::OnceCallback<void(int)> cb = params->TakeCallback(); if (!cb.is_null()) std::move(cb).Run(result); } } // namespace -// TODO(crbug.com/1349158): Remove this function once PatchFilePuffPatch is -// implemented as this becomes obsolete. -void Patch(mojo::PendingRemote<mojom::FilePatcher> file_patcher, - const std::string& operation, - const base::FilePath& input_path, - const base::FilePath& patch_path, - const base::FilePath& output_path, - PatchCallback callback) { - DCHECK(!callback.is_null()); - - base::File input_file(input_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File patch_file(patch_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File output_file(output_path, base::File::FLAG_CREATE | - base::File::FLAG_WRITE | - base::File::FLAG_WIN_EXCLUSIVE_WRITE); - - if (!input_file.IsValid() || !patch_file.IsValid() || - !output_file.IsValid()) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), /*result=*/-1)); - return; - } - - // In order to share |callback| between the connection error handler and the - // FilePatcher calls, we have to use a context object. - scoped_refptr<PatchParams> patch_params = base::MakeRefCounted<PatchParams>( - std::move(file_patcher), std::move(callback)); - - patch_params->file_patcher().set_disconnect_handler( - base::BindOnce(&PatchDone, patch_params, /*result=*/-1)); - - if (operation == update_client::kBsdiff) { - patch_params->file_patcher()->PatchFileBsdiff( - std::move(input_file), std::move(patch_file), std::move(output_file), - base::BindOnce(&PatchDone, patch_params)); - } else if (operation == update_client::kCourgette) { - patch_params->file_patcher()->PatchFileCourgette( - std::move(input_file), std::move(patch_file), std::move(output_file), - base::BindOnce(&PatchDone, patch_params)); - } else { - NOTREACHED(); - } -} - void PuffPatch(mojo::PendingRemote<mojom::FilePatcher> file_patcher, base::File input_file, base::File patch_file, base::File output_file, - PatchCallback callback) { + base::OnceCallback<void(int)> callback) { // Use a context object to share callback. scoped_refptr<PatchParams> patch_params = base::MakeRefCounted<PatchParams>( std::move(file_patcher), std::move(callback));
diff --git a/components/services/patch/public/cpp/patch.h b/components/services/patch/public/cpp/patch.h index 06ad1f36..be2d8db19 100644 --- a/components/services/patch/public/cpp/patch.h +++ b/components/services/patch/public/cpp/patch.h
@@ -5,35 +5,19 @@ #ifndef COMPONENTS_SERVICES_PATCH_PUBLIC_CPP_PATCH_H_ #define COMPONENTS_SERVICES_PATCH_PUBLIC_CPP_PATCH_H_ -#include <string> - #include "base/functional/callback_forward.h" #include "components/services/patch/public/mojom/file_patcher.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" -namespace base { -class FilePath; -} - namespace patch { // Patches |input_abs_path| with |patch_abs_path| using the |operation| // algorithm and place the output in |output_abs_path|. -using PatchCallback = base::OnceCallback<void(int result)>; -void Patch(mojo::PendingRemote<mojom::FilePatcher> file_patcher, - const std::string& operation, - const base::FilePath& input_abs_path, - const base::FilePath& patch_abs_path, - const base::FilePath& output_abs_path, - PatchCallback callback); - -// Patches |input_abs_path| with |patch_abs_path| using the |operation| -// algorithm and place the output in |output_abs_path|. void PuffPatch(mojo::PendingRemote<mojom::FilePatcher> file_patcher, base::File input_abs_path, base::File patch_abs_path, base::File output_abs_path, - PatchCallback callback); + base::OnceCallback<void(int result)> callback); } // namespace patch
diff --git a/components/services/patch/public/mojom/file_patcher.mojom b/components/services/patch/public/mojom/file_patcher.mojom index e2e10c0..674be35e 100644 --- a/components/services/patch/public/mojom/file_patcher.mojom +++ b/components/services/patch/public/mojom/file_patcher.mojom
@@ -9,26 +9,10 @@ import "sandbox/policy/mojom/sandbox.mojom"; // Interface to the out-of-process file patcher. The file patcher runs -// bspatch, courgette, or other utilities to apply a differential -// patch to a file, often for the purposes of software updates. +// utilities to apply a differential patch to a file, often for the purposes of +// software updates. [ServiceSandbox=sandbox.mojom.Sandbox.kService] interface FilePatcher { - // Patch |input_file| with |patch_file| using the bsdiff algorithm - // (Courgette's version) and place the output in |output_file|. - // Returns |result| bsdiff::BSDiffStatus::OK on success. - PatchFileBsdiff( - mojo_base.mojom.ReadOnlyFile input_file, - mojo_base.mojom.ReadOnlyFile patch_file, - mojo_base.mojom.File output_file) => (int32 result); - - // Patch |input_file| with |patch_file| using the Courgette algorithm - // and place the output in |output_file|. - // Returns |result| courgette::Status::C_OK on success. - PatchFileCourgette( - mojo_base.mojom.ReadOnlyFile input_file, - mojo_base.mojom.ReadOnlyFile patch_file, - mojo_base.mojom.File output_file) => (int32 result); - // Patch |input_file_path| with |patch_file_path| using the Puffin PuffPatch // algorithm and place the output in |output_file_path|. // Returns |result| puffin::Status::P_OK on success.
diff --git a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc index 709420a..22a2f4e 100644 --- a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc +++ b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc
@@ -533,14 +533,28 @@ EXPECT_TRUE(metadata.ParseNamespaces(std::move(values), &migration_tasks)); EXPECT_EQ(2ul, migration_tasks.size()); - leveldb::WriteBatch batch; - DomStorageDatabase* null_db = nullptr; + // Make a database for testing. + base::RunLoop loop; + std::unique_ptr<AsyncDomStorageDatabase> database = + AsyncDomStorageDatabase::OpenInMemory( + std::nullopt, "SessionStorageMetadataMigrationTest", + base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}), + base::BindLambdaForTesting([&](leveldb::Status) { loop.Quit(); })); + loop.Run(); - // Run the tasks on our local batch object. Note that these migration tasks - // only manipulate |batch|, so it's safe enough to pass them a reference to a - // null database. - for (auto& task : migration_tasks) - std::move(task).Run(&batch, *null_db); + // Run the tasks on our local batch object. + leveldb::WriteBatch batch; + base::RunLoop loop2; + database->RunDatabaseTask( + base::OnceCallback<bool(const DomStorageDatabase&)>( + base::BindLambdaForTesting([&](const DomStorageDatabase& db) { + for (auto& task : migration_tasks) { + std::move(task).Run(&batch, db); + } + return true; + })), + base::BindLambdaForTesting([&](bool) { loop2.Quit(); })); + loop2.Run(); BatchCollector collector; batch.Iterate(&collector);
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java index aec9c88..a81cdbf 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountManagerDelegate.java
@@ -47,11 +47,6 @@ void attachAccountsChangeObserver(AccountsChangeObserver observer); /** Get all the accounts on device synchronously. */ - @Deprecated - @WorkerThread - Account[] getAccounts(); - - /** Get all the accounts on device synchronously. */ @WorkerThread Account[] getAccountsSynchronous() throws AccountManagerDelegateException;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java index a2e42fe..42db6c41 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
@@ -86,23 +86,6 @@ context, receiver, gmsPackageReplacedFilter); } - @Deprecated - @Override - public Account[] getAccounts() { - if (hasGetAccountsPermission() && isGooglePlayServicesAvailable()) { - long startTime = SystemClock.elapsedRealtime(); - Account[] accounts = - mAccountManager.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); - RecordHistogram.recordTimesHistogram( - "Signin.AndroidGetAccountsTime_AccountManager", - SystemClock.elapsedRealtime() - startTime); - return accounts; - } - // Account seeding relies on GoogleAuthUtil.getAccountId to get GAIA ids, - // so don't report any accounts if Google Play Services are out of date. - return new Account[] {}; - } - @Override public Account[] getAccountsSynchronous() throws AccountManagerDelegateException { if (!isGooglePlayServicesAvailable()) {
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java index 9ece8e6..654463c 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerDelegate.java
@@ -59,18 +59,6 @@ mObserver = observer; } - @Deprecated - @Override - public Account[] getAccounts() { - ArrayList<Account> result = new ArrayList<>(); - synchronized (mLock) { - for (AccountHolder ah : mAccounts) { - result.add(ah.getAccount()); - } - } - return result.toArray(new Account[0]); - } - @Override public Account[] getAccountsSynchronous() throws AccountManagerDelegateException { ArrayList<Account> result = new ArrayList<>();
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index c219bfc7..ae7db1af 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -78,6 +78,8 @@ "test/mock_invalidation_tracker.h", "test/mock_model_type_change_processor.cc", "test/mock_model_type_change_processor.h", + "test/mock_model_type_controller_delegate.cc", + "test/mock_model_type_controller_delegate.h", "test/mock_model_type_processor.cc", "test/mock_model_type_processor.h", "test/mock_model_type_worker.cc",
diff --git a/components/sync/test/mock_model_type_controller_delegate.cc b/components/sync/test/mock_model_type_controller_delegate.cc new file mode 100644 index 0000000..c933bd0 --- /dev/null +++ b/components/sync/test/mock_model_type_controller_delegate.cc
@@ -0,0 +1,13 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync/test/mock_model_type_controller_delegate.h" + +namespace syncer { + +MockModelTypeControllerDelegate::MockModelTypeControllerDelegate() = default; + +MockModelTypeControllerDelegate::~MockModelTypeControllerDelegate() = default; + +} // namespace syncer
diff --git a/components/sync/test/mock_model_type_controller_delegate.h b/components/sync/test/mock_model_type_controller_delegate.h new file mode 100644 index 0000000..cfbb7b0 --- /dev/null +++ b/components/sync/test/mock_model_type_controller_delegate.h
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_TEST_MOCK_MODEL_TYPE_CONTROLLER_DELEGATE_H_ +#define COMPONENTS_SYNC_TEST_MOCK_MODEL_TYPE_CONTROLLER_DELEGATE_H_ + +#include "components/sync/model/model_type_controller_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace syncer { + +class MockModelTypeControllerDelegate : public ModelTypeControllerDelegate { + public: + MockModelTypeControllerDelegate(); + ~MockModelTypeControllerDelegate() override; + + MOCK_METHOD(void, + OnSyncStarting, + (const DataTypeActivationRequest& request, + StartCallback callback), + (override)); + MOCK_METHOD(void, + OnSyncStopping, + (SyncStopMetadataFate metadata_fate), + (override)); + MOCK_METHOD(void, + GetAllNodesForDebugging, + (AllNodesCallback callback), + (override)); + MOCK_METHOD(void, + GetTypeEntitiesCountForDebugging, + (base::OnceCallback<void(const TypeEntitiesCount&)> callback), + (const override)); + MOCK_METHOD(void, RecordMemoryUsageAndCountsHistograms, (), (override)); + MOCK_METHOD(void, ClearMetadataIfStopped, (), (override)); +}; + +} // namespace syncer + +#endif // COMPONENTS_SYNC_TEST_MOCK_MODEL_TYPE_CONTROLLER_DELEGATE_H_
diff --git a/components/ukm/observers/ukm_consent_state_observer.cc b/components/ukm/observers/ukm_consent_state_observer.cc index 6634d5f..49316fe 100644 --- a/components/ukm/observers/ukm_consent_state_observer.cc +++ b/components/ukm/observers/ukm_consent_state_observer.cc
@@ -141,9 +141,6 @@ void UkmConsentStateObserver::UpdateUkmAllowedForAllProfiles(bool total_purge) { const UkmConsentState new_state = GetPreviousStatesForAllProfiles(); - base::UmaHistogramBoolean("UKM.ConsentObserver.AllowedForAllProfiles", - new_state.Has(MSBB)); - // Any change in profile states needs to call OnUkmAllowedStateChanged so that // the new settings take effect. if (total_purge || new_state != ukm_consent_state_) {
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn index 15eef22..053d0220 100644 --- a/components/update_client/BUILD.gn +++ b/components/update_client/BUILD.gn
@@ -42,8 +42,6 @@ deps = [ ":update_client", "//base", - "//courgette:bsdiff", - "//courgette:courgette_lib", "//third_party/puffin:libpuffpatch", ] include_dirs = [ "//third_party/puffin/src/include" ] @@ -92,12 +90,6 @@ "command_line_config_policy.h", "component.cc", "component.h", - "component_patcher.cc", - "component_patcher.h", - "component_patcher_operation.cc", - "component_patcher_operation.h", - "component_unpacker.cc", - "component_unpacker.h", "configurator.h", "crx_cache.cc", "crx_cache.h", @@ -170,7 +162,6 @@ "//components/crx_file", "//components/prefs", "//components/version_info:version_info", - "//courgette:courgette_lib", "//crypto", "//third_party/zlib/google:compression_utils", "//url", @@ -235,8 +226,6 @@ visibility = [ ":unit_tests" ] testonly = true sources = [ - "//components/test/data/update_client/binary_bsdiff_patch.bin", - "//components/test/data/update_client/binary_courgette_patch.bin", "//components/test/data/update_client/binary_input.bin", "//components/test/data/update_client/binary_output.bin", "//components/test/data/update_client/empty_file", @@ -272,9 +261,6 @@ source_set("unit_tests") { testonly = true sources = [ - "component_patcher_unittest.cc", - "component_patcher_unittest.h", - "component_unpacker_unittest.cc", "crx_cache_unittest.cc", "persisted_data_unittest.cc", "ping_manager_unittest.cc", @@ -317,7 +303,6 @@ "//components/services/patch:in_process", "//components/services/unzip:in_process", "//components/version_info:version_info", - "//courgette:courgette_lib", "//net:test_support", "//services/network:test_support", "//services/network/public/cpp:cpp",
diff --git a/components/update_client/component.cc b/components/update_client/component.cc index 7155818..c84fc5f 100644 --- a/components/update_client/component.cc +++ b/components/update_client/component.cc
@@ -27,7 +27,6 @@ #include "base/task/thread_pool.h" #include "base/values.h" #include "components/update_client/action_runner.h" -#include "components/update_client/component_unpacker.h" #include "components/update_client/configurator.h" #include "components/update_client/crx_cache.h" #include "components/update_client/crx_downloader_factory.h"
diff --git a/components/update_client/component_patcher.cc b/components/update_client/component_patcher.cc deleted file mode 100644 index bc68cef3..0000000 --- a/components/update_client/component_patcher.cc +++ /dev/null
@@ -1,116 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/update_client/component_patcher.h" - -#include <string> -#include <utility> - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/functional/bind.h" -#include "base/json/json_file_value_serializer.h" -#include "base/location.h" -#include "base/memory/weak_ptr.h" -#include "base/task/sequenced_task_runner.h" -#include "base/values.h" -#include "components/update_client/component_patcher_operation.h" -#include "components/update_client/patcher.h" -#include "components/update_client/update_client.h" -#include "components/update_client/update_client_errors.h" - -namespace update_client { - -namespace { - -// Deserialize the commands file (present in delta update packages). The top -// level must be a list. -absl::optional<base::Value::List> ReadCommands( - const base::FilePath& unpack_path) { - const base::FilePath commands = - unpack_path.Append(FILE_PATH_LITERAL("commands.json")); - if (!base::PathExists(commands)) - return absl::nullopt; - - JSONFileValueDeserializer deserializer(commands); - std::unique_ptr<base::Value> root = - deserializer.Deserialize(nullptr, nullptr); - - return (root.get() && root->is_list()) - ? absl::make_optional(std::move(*root).TakeList()) - : absl::nullopt; -} - -} // namespace - -ComponentPatcher::ComponentPatcher(const base::FilePath& input_dir, - const base::FilePath& unpack_dir, - scoped_refptr<CrxInstaller> installer, - scoped_refptr<Patcher> patcher) - : input_dir_(input_dir), - unpack_dir_(unpack_dir), - installer_(installer), - patcher_(patcher) {} - -ComponentPatcher::~ComponentPatcher() = default; - -void ComponentPatcher::Start(Callback callback) { - callback_ = std::move(callback); - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentPatcher::StartPatching, - scoped_refptr<ComponentPatcher>(this))); -} - -void ComponentPatcher::StartPatching() { - commands_ = ReadCommands(input_dir_); - if (!commands_) { - DonePatching(UnpackerError::kDeltaBadCommands, 0); - } else { - next_command_ = commands_->begin(); - PatchNextFile(); - } -} - -void ComponentPatcher::PatchNextFile() { - if (next_command_ == commands_->end()) { - DonePatching(UnpackerError::kNone, 0); - return; - } - if (!next_command_->is_dict()) { - DonePatching(UnpackerError::kDeltaBadCommands, 0); - return; - } - const base::Value::Dict& command_args = next_command_->GetDict(); - - if (const std::string* operation = command_args.FindString(kOp)) { - current_operation_ = CreateDeltaUpdateOp(*operation, patcher_); - } - - if (!current_operation_) { - DonePatching(UnpackerError::kDeltaUnsupportedCommand, 0); - return; - } - current_operation_->Run( - command_args, input_dir_, unpack_dir_, installer_, - base::BindOnce(&ComponentPatcher::DonePatchingFile, - scoped_refptr<ComponentPatcher>(this))); -} - -void ComponentPatcher::DonePatchingFile(UnpackerError error, - int extended_error) { - if (error != UnpackerError::kNone) { - DonePatching(error, extended_error); - } else { - ++next_command_; - PatchNextFile(); - } -} - -void ComponentPatcher::DonePatching(UnpackerError error, int extended_error) { - current_operation_ = nullptr; - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), error, extended_error)); -} - -} // namespace update_client
diff --git a/components/update_client/component_patcher.h b/components/update_client/component_patcher.h deleted file mode 100644 index 36bb5e83..0000000 --- a/components/update_client/component_patcher.h +++ /dev/null
@@ -1,106 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Component updates can be either differential updates or full updates. -// Full updates come in CRX format; differential updates come in CRX-style -// archives, but have a different magic number. They contain "commands.json", a -// list of commands for the patcher to follow. The patcher uses these commands, -// the other files in the archive, and the files from the existing installation -// of the component to create the contents of a full update, which is then -// installed normally. -// Component updates are specified by the 'codebasediff' attribute of an -// updatecheck response: -// <updatecheck codebase="http://example.com/extension_1.2.3.4.crx" -// hash="12345" size="9854" status="ok" version="1.2.3.4" -// prodversionmin="2.0.143.0" -// codebasediff="http://example.com/diff_1.2.3.4.crx" -// hashdiff="123" sizediff="101" -// fp="1.123"/> -// The component updater will attempt a differential update if it is available -// and allowed to, and fall back to a full update if it fails. -// -// After installation (diff or full), the component updater records "fp", the -// fingerprint of the installed files, to later identify the existing files to -// the server so that a proper differential update can be provided next cycle. - -#ifndef COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_H_ -#define COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_H_ - -#include "base/functional/callback_forward.h" -#include "base/memory/ref_counted.h" -#include "base/values.h" -#include "components/update_client/component_unpacker.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -// TODO(crbug.com/1349158): Remove this class once Puffin patches are fully -// implemented. - -namespace base { -class FilePath; -} - -namespace update_client { - -class CrxInstaller; -class DeltaUpdateOp; -class Patcher; -enum class UnpackerError; - -// The type of a patch file. -enum PatchType { - kPatchTypeUnknown, - kPatchTypeCourgette, - kPatchTypeBsdiff, -}; - -// Encapsulates a task for applying a differential update to a component. -class ComponentPatcher : public base::RefCountedThreadSafe<ComponentPatcher> { - public: - using Callback = base::OnceCallback<void(UnpackerError, int)>; - - // Takes an unpacked differential CRX (|input_dir|) and a component installer, - // and sets up the class to create a new (non-differential) unpacked CRX. - // If |in_process| is true, patching will be done completely within the - // existing process. Otherwise, some steps of patching may be done - // out-of-process. - ComponentPatcher(const base::FilePath& input_dir, - const base::FilePath& unpack_dir, - scoped_refptr<CrxInstaller> installer, - scoped_refptr<Patcher> patcher); - - ComponentPatcher(const ComponentPatcher&) = delete; - ComponentPatcher& operator=(const ComponentPatcher&) = delete; - - // Starts patching files. This member function returns immediately, after - // posting a task to do the patching. When patching has been completed, - // |callback| will be called with the error codes if any error codes were - // encountered. - void Start(Callback callback); - - private: - friend class base::RefCountedThreadSafe<ComponentPatcher>; - - virtual ~ComponentPatcher(); - - void StartPatching(); - - void PatchNextFile(); - - void DonePatchingFile(UnpackerError error, int extended_error); - - void DonePatching(UnpackerError error, int extended_error); - - const base::FilePath input_dir_; - const base::FilePath unpack_dir_; - scoped_refptr<CrxInstaller> installer_; - scoped_refptr<Patcher> patcher_; - Callback callback_; - absl::optional<base::Value::List> commands_; - base::Value::List::const_iterator next_command_; - scoped_refptr<DeltaUpdateOp> current_operation_; -}; - -} // namespace update_client - -#endif // COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_H_
diff --git a/components/update_client/component_patcher_operation.cc b/components/update_client/component_patcher_operation.cc deleted file mode 100644 index 74c57669..0000000 --- a/components/update_client/component_patcher_operation.cc +++ /dev/null
@@ -1,219 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/update_client/component_patcher_operation.h" - -#include <stdint.h> -#include <utility> - -#include "base/check.h" -#include "base/files/file_util.h" -#include "base/files/memory_mapped_file.h" -#include "base/functional/bind.h" -#include "base/location.h" -#include "base/notreached.h" -#include "base/strings/string_number_conversions.h" -#include "base/task/sequenced_task_runner.h" -#include "components/update_client/patcher.h" -#include "components/update_client/update_client.h" -#include "components/update_client/update_client_errors.h" -#include "components/update_client/utils.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" - -namespace update_client { - -namespace { - -const char kOutput[] = "output"; -const char kSha256[] = "sha256"; - -// The integer offset disambiguates between overlapping error ranges. -const int kCourgetteErrorOffset = 300; -const int kBsdiffErrorOffset = 600; - -} // namespace - -const char kOp[] = "op"; -const char kBsdiff[] = "bsdiff"; -const char kCourgette[] = "courgette"; -const char kInput[] = "input"; -const char kPatch[] = "patch"; - -DeltaUpdateOp* CreateDeltaUpdateOp(const std::string& operation, - scoped_refptr<Patcher> patcher) { - if (operation == "copy") { - return new DeltaUpdateOpCopy(); - } else if (operation == "create") { - return new DeltaUpdateOpCreate(); - } else if (operation == "bsdiff" || operation == "courgette") { - return new DeltaUpdateOpPatch(operation, patcher); - } - return nullptr; -} - -DeltaUpdateOp::DeltaUpdateOp() = default; - -DeltaUpdateOp::~DeltaUpdateOp() = default; - -void DeltaUpdateOp::Run(const base::Value::Dict& command_args, - const base::FilePath& input_dir, - const base::FilePath& unpack_dir, - scoped_refptr<CrxInstaller> installer, - ComponentPatcher::Callback callback) { - callback_ = std::move(callback); - const std::string* output_rel_path = command_args.FindString(kOutput); - const std::string* sha256_value = command_args.FindString(kSha256); - if (!output_rel_path || !sha256_value) { - DoneRunning(UnpackerError::kDeltaBadCommands, 0); - return; - } - output_sha256_ = *sha256_value; - - output_abs_path_ = - unpack_dir.Append(base::FilePath::FromUTF8Unsafe(*output_rel_path)); - UnpackerError parse_result = - DoParseArguments(command_args, input_dir, installer); - if (parse_result != UnpackerError::kNone) { - DoneRunning(parse_result, 0); - return; - } - - const base::FilePath parent = output_abs_path_.DirName(); - if (!base::DirectoryExists(parent)) { - if (!base::CreateDirectory(parent)) { - DoneRunning(UnpackerError::kIoError, 0); - return; - } - } - - DoRun(base::BindOnce(&DeltaUpdateOp::DoneRunning, - scoped_refptr<DeltaUpdateOp>(this))); -} - -void DeltaUpdateOp::DoneRunning(UnpackerError error, int extended_error) { - if (error == UnpackerError::kNone) - error = CheckHash(); - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), error, extended_error)); -} - -// Uses the hash as a checksum to confirm that the file now residing in the -// output directory probably has the contents it should. -UnpackerError DeltaUpdateOp::CheckHash() { - return VerifyFileHash256(output_abs_path_, output_sha256_) - ? UnpackerError::kNone - : UnpackerError::kDeltaVerificationFailure; -} - -DeltaUpdateOpCopy::DeltaUpdateOpCopy() = default; - -DeltaUpdateOpCopy::~DeltaUpdateOpCopy() = default; - -UnpackerError DeltaUpdateOpCopy::DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) { - const std::string* input_rel_path = command_args.FindString(kInput); - if (!input_rel_path) - return UnpackerError::kDeltaBadCommands; - - if (!installer->GetInstalledFile(*input_rel_path, &input_abs_path_)) - return UnpackerError::kDeltaMissingExistingFile; - - return UnpackerError::kNone; -} - -void DeltaUpdateOpCopy::DoRun(ComponentPatcher::Callback callback) { - if (!base::CopyFile(input_abs_path_, output_abs_path_)) - std::move(callback).Run(UnpackerError::kDeltaOperationFailure, 0); - else - std::move(callback).Run(UnpackerError::kNone, 0); -} - -DeltaUpdateOpCreate::DeltaUpdateOpCreate() = default; - -DeltaUpdateOpCreate::~DeltaUpdateOpCreate() = default; - -UnpackerError DeltaUpdateOpCreate::DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) { - const std::string* patch_rel_path = command_args.FindString(kPatch); - if (!patch_rel_path) - return UnpackerError::kDeltaBadCommands; - - patch_abs_path_ = - input_dir.Append(base::FilePath::FromUTF8Unsafe(*patch_rel_path)); - - return UnpackerError::kNone; -} - -void DeltaUpdateOpCreate::DoRun(ComponentPatcher::Callback callback) { - if (!base::Move(patch_abs_path_, output_abs_path_)) - std::move(callback).Run(UnpackerError::kDeltaOperationFailure, 0); - else - std::move(callback).Run(UnpackerError::kNone, 0); -} - -DeltaUpdateOpPatch::DeltaUpdateOpPatch(const std::string& operation, - scoped_refptr<Patcher> patcher) - : operation_(operation), patcher_(patcher) { - CHECK(operation == kBsdiff || operation == kCourgette); -} - -DeltaUpdateOpPatch::~DeltaUpdateOpPatch() = default; - -UnpackerError DeltaUpdateOpPatch::DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) { - const std::string* patch_rel_path = command_args.FindString(kPatch); - const std::string* input_rel_path = command_args.FindString(kInput); - if (!patch_rel_path || !input_rel_path) - return UnpackerError::kDeltaBadCommands; - - if (!installer->GetInstalledFile(*input_rel_path, &input_abs_path_)) - return UnpackerError::kDeltaMissingExistingFile; - - patch_abs_path_ = - input_dir.Append(base::FilePath::FromUTF8Unsafe(*patch_rel_path)); - - return UnpackerError::kNone; -} - -void DeltaUpdateOpPatch::DoRun(ComponentPatcher::Callback callback) { - if (operation_ == kBsdiff) { - patcher_->PatchBsdiff(input_abs_path_, patch_abs_path_, output_abs_path_, - base::BindOnce(&DeltaUpdateOpPatch::DonePatching, - this, std::move(callback))); - } else { - patcher_->PatchCourgette(input_abs_path_, patch_abs_path_, output_abs_path_, - base::BindOnce(&DeltaUpdateOpPatch::DonePatching, - this, std::move(callback))); - } -} - -void DeltaUpdateOpPatch::DonePatching(ComponentPatcher::Callback callback, - int result) { - if (operation_ == kBsdiff) { - if (result == bsdiff::OK) { - std::move(callback).Run(UnpackerError::kNone, 0); - } else { - std::move(callback).Run(UnpackerError::kDeltaOperationFailure, - result + kBsdiffErrorOffset); - } - } else if (operation_ == kCourgette) { - if (result == courgette::C_OK) { - std::move(callback).Run(UnpackerError::kNone, 0); - } else { - std::move(callback).Run(UnpackerError::kDeltaOperationFailure, - result + kCourgetteErrorOffset); - } - } else { - NOTREACHED(); - } -} - -} // namespace update_client
diff --git a/components/update_client/component_patcher_operation.h b/components/update_client/component_patcher_operation.h deleted file mode 100644 index 14cc91b..0000000 --- a/components/update_client/component_patcher_operation.h +++ /dev/null
@@ -1,166 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_OPERATION_H_ -#define COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_OPERATION_H_ - -#include <string> - -#include "base/files/file_path.h" -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/values.h" -#include "components/update_client/component_patcher.h" -#include "components/update_client/component_unpacker.h" - -// TODO(crbug.com/1349158): Remove this file once Puffin patches are fully -// implemented. - -namespace update_client { - -extern const char kOp[]; -extern const char kBsdiff[]; -extern const char kCourgette[]; -extern const char kInput[]; -extern const char kPatch[]; - -class CrxInstaller; -class Patcher; -enum class UnpackerError; - -class DeltaUpdateOp : public base::RefCountedThreadSafe<DeltaUpdateOp> { - public: - DeltaUpdateOp(); - - DeltaUpdateOp(const DeltaUpdateOp&) = delete; - DeltaUpdateOp& operator=(const DeltaUpdateOp&) = delete; - - // Parses, runs, and verifies the operation. Calls |callback| with the - // result of the operation. The callback is called using |task_runner|. - void Run(const base::Value::Dict& command_args, - const base::FilePath& input_dir, - const base::FilePath& unpack_dir, - scoped_refptr<CrxInstaller> installer, - ComponentPatcher::Callback callback); - - protected: - virtual ~DeltaUpdateOp(); - - std::string output_sha256_; - base::FilePath output_abs_path_; - - private: - friend class base::RefCountedThreadSafe<DeltaUpdateOp>; - - UnpackerError CheckHash(); - - // Subclasses must override DoParseArguments to parse operation-specific - // arguments. DoParseArguments returns DELTA_OK on success; any other code - // represents failure. - virtual UnpackerError DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) = 0; - - // Subclasses must override DoRun to actually perform the patching operation. - // They must call the provided callback when they have completed their - // operations. In practice, the provided callback is always for "DoneRunning". - virtual void DoRun(ComponentPatcher::Callback callback) = 0; - - // Callback given to subclasses for when they complete their operation. - // Validates the output, and posts a task to the patching operation's - // callback. - void DoneRunning(UnpackerError error, int extended_error); - - ComponentPatcher::Callback callback_; -}; - -// A 'copy' operation takes a file currently residing on the disk and moves it -// into the unpacking directory: this represents "no change" in the file being -// installed. -class DeltaUpdateOpCopy : public DeltaUpdateOp { - public: - DeltaUpdateOpCopy(); - - DeltaUpdateOpCopy(const DeltaUpdateOpCopy&) = delete; - DeltaUpdateOpCopy& operator=(const DeltaUpdateOpCopy&) = delete; - - private: - ~DeltaUpdateOpCopy() override; - - // Overrides of DeltaUpdateOp. - UnpackerError DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) override; - - void DoRun(ComponentPatcher::Callback callback) override; - - base::FilePath input_abs_path_; -}; - -// A 'create' operation takes a full file that was sent in the delta update -// archive and moves it into the unpacking directory: this represents the -// addition of a new file, or a file so different that no bandwidth could be -// saved by transmitting a differential update. -class DeltaUpdateOpCreate : public DeltaUpdateOp { - public: - DeltaUpdateOpCreate(); - - DeltaUpdateOpCreate(const DeltaUpdateOpCreate&) = delete; - DeltaUpdateOpCreate& operator=(const DeltaUpdateOpCreate&) = delete; - - private: - ~DeltaUpdateOpCreate() override; - - // Overrides of DeltaUpdateOp. - UnpackerError DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) override; - - void DoRun(ComponentPatcher::Callback callback) override; - - base::FilePath patch_abs_path_; -}; - -// Both 'bsdiff' and 'courgette' operations take an existing file on disk, -// and a bsdiff- or Courgette-format patch file provided in the delta update -// package, and run bsdiff or Courgette to construct an output file in the -// unpacking directory. -class DeltaUpdateOpPatch : public DeltaUpdateOp { - public: - DeltaUpdateOpPatch(const std::string& operation, - scoped_refptr<Patcher> patcher); - - DeltaUpdateOpPatch(const DeltaUpdateOpPatch&) = delete; - DeltaUpdateOpPatch& operator=(const DeltaUpdateOpPatch&) = delete; - - private: - ~DeltaUpdateOpPatch() override; - - // Overrides of DeltaUpdateOp. - UnpackerError DoParseArguments( - const base::Value::Dict& command_args, - const base::FilePath& input_dir, - scoped_refptr<CrxInstaller> installer) override; - - void DoRun(ComponentPatcher::Callback callback) override; - - // |success_code| is the code that indicates a successful patch. - // |result| is the code the patching operation returned. - void DonePatching(ComponentPatcher::Callback callback, int result); - - std::string operation_; - scoped_refptr<Patcher> patcher_; - base::FilePath patch_abs_path_; - base::FilePath input_abs_path_; -}; - -DeltaUpdateOp* CreateDeltaUpdateOp(const std::string& operation, - scoped_refptr<Patcher> patcher); - -} // namespace update_client - -#endif // COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_OPERATION_H_
diff --git a/components/update_client/component_patcher_unittest.cc b/components/update_client/component_patcher_unittest.cc deleted file mode 100644 index f1d103e..0000000 --- a/components/update_client/component_patcher_unittest.cc +++ /dev/null
@@ -1,185 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/update_client/component_patcher.h" - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/functional/bind.h" -#include "base/run_loop.h" -#include "base/values.h" -#include "components/services/patch/in_process_file_patcher.h" -#include "components/update_client/component_patcher_operation.h" -#include "components/update_client/component_patcher_unittest.h" -#include "components/update_client/patch/patch_impl.h" -#include "components/update_client/test_installer.h" -#include "components/update_client/test_utils.h" -#include "components/update_client/update_client_errors.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -// TODO(crbug.com/1441208): eliminate this class. The naming of the private -// data members is also not style compliant. -class TestCallback { - public: - TestCallback() = default; - - virtual ~TestCallback() = default; - void Set(update_client::UnpackerError error, int extra_code) { - error_ = error; - extra_code_ = extra_code; - called_ = true; - } - - update_client::UnpackerError error_ = update_client::UnpackerError::kNone; - int extra_code_ = -1; - bool called_ = false; -}; - -} // namespace - -namespace update_client { - -ComponentPatcherOperationTest::ComponentPatcherOperationTest() - : task_environment_(base::test::TaskEnvironment::MainThreadType::IO) { - EXPECT_TRUE(unpack_dir_.CreateUniqueTempDir()); - EXPECT_TRUE(input_dir_.CreateUniqueTempDir()); - EXPECT_TRUE(installed_dir_.CreateUniqueTempDir()); - installer_ = - base::MakeRefCounted<ReadOnlyTestInstaller>(installed_dir_.GetPath()); -} - -ComponentPatcherOperationTest::~ComponentPatcherOperationTest() = default; - -// Verify that a 'create' delta update operation works correctly. -TEST_F(ComponentPatcherOperationTest, CheckCreateOperation) { - EXPECT_TRUE(base::CopyFile( - GetTestFilePath("binary_output.bin"), - input_dir_.GetPath().Append(FILE_PATH_LITERAL("binary_output.bin")))); - - base::Value::Dict command_args; - command_args.Set("output", "output.bin"); - command_args.Set("sha256", binary_output_hash); - command_args.Set("op", "create"); - command_args.Set("patch", "binary_output.bin"); - - TestCallback callback; - scoped_refptr<DeltaUpdateOp> op = base::MakeRefCounted<DeltaUpdateOpCreate>(); - op->Run(command_args, input_dir_.GetPath(), unpack_dir_.GetPath(), nullptr, - base::BindOnce(&TestCallback::Set, base::Unretained(&callback))); - task_environment_.RunUntilIdle(); - - EXPECT_EQ(true, callback.called_); - EXPECT_EQ(UnpackerError::kNone, callback.error_); - EXPECT_EQ(0, callback.extra_code_); - EXPECT_TRUE(base::ContentsEqual( - unpack_dir_.GetPath().Append(FILE_PATH_LITERAL("output.bin")), - GetTestFilePath("binary_output.bin"))); -} - -// Verify that a 'copy' delta update operation works correctly. -TEST_F(ComponentPatcherOperationTest, CheckCopyOperation) { - EXPECT_TRUE(base::CopyFile( - GetTestFilePath("binary_output.bin"), - installed_dir_.GetPath().Append(FILE_PATH_LITERAL("binary_output.bin")))); - - base::Value::Dict command_args; - command_args.Set("output", "output.bin"); - command_args.Set("sha256", binary_output_hash); - command_args.Set("op", "copy"); - command_args.Set("input", "binary_output.bin"); - - TestCallback callback; - scoped_refptr<DeltaUpdateOp> op = base::MakeRefCounted<DeltaUpdateOpCopy>(); - op->Run(command_args, input_dir_.GetPath(), unpack_dir_.GetPath(), - installer_.get(), - base::BindOnce(&TestCallback::Set, base::Unretained(&callback))); - task_environment_.RunUntilIdle(); - - EXPECT_EQ(true, callback.called_); - EXPECT_EQ(UnpackerError::kNone, callback.error_); - EXPECT_EQ(0, callback.extra_code_); - EXPECT_TRUE(base::ContentsEqual( - unpack_dir_.GetPath().Append(FILE_PATH_LITERAL("output.bin")), - GetTestFilePath("binary_output.bin"))); -} - -// Verify that a 'courgette' delta update operation works correctly. -TEST_F(ComponentPatcherOperationTest, CheckCourgetteOperation) { - EXPECT_TRUE(base::CopyFile( - GetTestFilePath("binary_input.bin"), - installed_dir_.GetPath().Append(FILE_PATH_LITERAL("binary_input.bin")))); - EXPECT_TRUE(base::CopyFile(GetTestFilePath("binary_courgette_patch.bin"), - input_dir_.GetPath().Append(FILE_PATH_LITERAL( - "binary_courgette_patch.bin")))); - - base::Value::Dict command_args; - command_args.Set("output", "output.bin"); - command_args.Set("sha256", binary_output_hash); - command_args.Set("op", "courgette"); - command_args.Set("input", "binary_input.bin"); - command_args.Set("patch", "binary_courgette_patch.bin"); - - scoped_refptr<Patcher> patcher = - base::MakeRefCounted<PatchChromiumFactory>( - base::BindRepeating(&patch::LaunchInProcessFilePatcher)) - ->Create(); - - TestCallback callback; - scoped_refptr<DeltaUpdateOp> op = CreateDeltaUpdateOp("courgette", patcher); - op->Run(command_args, input_dir_.GetPath(), unpack_dir_.GetPath(), - installer_.get(), - base::BindOnce(&TestCallback::Set, base::Unretained(&callback))); - task_environment_.RunUntilIdle(); - - EXPECT_EQ(true, callback.called_); - EXPECT_EQ(UnpackerError::kNone, callback.error_); - EXPECT_EQ(0, callback.extra_code_); - EXPECT_TRUE(base::ContentsEqual( - unpack_dir_.GetPath().Append(FILE_PATH_LITERAL("output.bin")), - GetTestFilePath("binary_output.bin"))); -} - -// Verify that a 'bsdiff' delta update operation works correctly. -TEST_F(ComponentPatcherOperationTest, CheckBsdiffOperation) { - EXPECT_TRUE(base::CopyFile( - GetTestFilePath("binary_input.bin"), - installed_dir_.GetPath().Append(FILE_PATH_LITERAL("binary_input.bin")))); - EXPECT_TRUE(base::CopyFile(GetTestFilePath("binary_bsdiff_patch.bin"), - input_dir_.GetPath().Append(FILE_PATH_LITERAL( - "binary_bsdiff_patch.bin")))); - - base::Value::Dict command_args; - command_args.Set("output", "output.bin"); - command_args.Set("sha256", binary_output_hash); - command_args.Set("op", "courgette"); - command_args.Set("input", "binary_input.bin"); - command_args.Set("patch", "binary_bsdiff_patch.bin"); - - // The operation needs a Patcher to access the PatchService. - scoped_refptr<Patcher> patcher = - base::MakeRefCounted<PatchChromiumFactory>( - base::BindRepeating(&patch::LaunchInProcessFilePatcher)) - ->Create(); - - TestCallback callback; - scoped_refptr<DeltaUpdateOp> op = CreateDeltaUpdateOp("bsdiff", patcher); - op->Run(command_args, input_dir_.GetPath(), unpack_dir_.GetPath(), - installer_.get(), - base::BindOnce(&TestCallback::Set, base::Unretained(&callback))); - task_environment_.RunUntilIdle(); - - EXPECT_EQ(true, callback.called_); - EXPECT_EQ(UnpackerError::kNone, callback.error_); - EXPECT_EQ(0, callback.extra_code_); - EXPECT_TRUE(base::ContentsEqual( - unpack_dir_.GetPath().Append(FILE_PATH_LITERAL("output.bin")), - GetTestFilePath("binary_output.bin"))); -} - -} // namespace update_client
diff --git a/components/update_client/component_patcher_unittest.h b/components/update_client/component_patcher_unittest.h deleted file mode 100644 index 113e3f6..0000000 --- a/components/update_client/component_patcher_unittest.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_UNITTEST_H_ -#define COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_UNITTEST_H_ - -#include "base/files/scoped_temp_dir.h" -#include "base/memory/ref_counted.h" -#include "base/task/sequenced_task_runner.h" -#include "base/test/task_environment.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" -#include "testing/gtest/include/gtest/gtest.h" - -// TODO(crbug.com/1349158): Remove this file once Puffin patches are fully -// implemented. - -namespace update_client { - -class ReadOnlyTestInstaller; - -const char binary_output_hash[] = - "599aba6d15a7da390621ef1bacb66601ed6aed04dadc1f9b445dcfe31296142a"; - -class ComponentPatcherOperationTest : public testing::Test { - public: - ComponentPatcherOperationTest(); - ~ComponentPatcherOperationTest() override; - - protected: - base::test::TaskEnvironment task_environment_; - base::ScopedTempDir input_dir_; - base::ScopedTempDir installed_dir_; - base::ScopedTempDir unpack_dir_; - scoped_refptr<ReadOnlyTestInstaller> installer_; -}; - -} // namespace update_client - -#endif // COMPONENTS_UPDATE_CLIENT_COMPONENT_PATCHER_UNITTEST_H_
diff --git a/components/update_client/component_unpacker.cc b/components/update_client/component_unpacker.cc deleted file mode 100644 index 419ebb44..0000000 --- a/components/update_client/component_unpacker.cc +++ /dev/null
@@ -1,216 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/update_client/component_unpacker.h" - -#include <stdint.h> -#include <string> -#include <utility> -#include <vector> - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_file.h" -#include "base/functional/bind.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/numerics/safe_conversions.h" -#include "base/strings/string_number_conversions.h" -#include "base/task/sequenced_task_runner.h" -#include "components/crx_file/crx_verifier.h" -#include "components/update_client/component_patcher.h" -#include "components/update_client/patcher.h" -#include "components/update_client/unzipper.h" -#include "components/update_client/update_client.h" -#include "components/update_client/update_client_errors.h" -#include "components/update_client/utils.h" -#include "third_party/zlib/google/compression_utils.h" - -namespace { - -const base::FilePath::CharType kMetadataFolder[] = - FILE_PATH_LITERAL("_metadata"); - -base::FilePath GetVerifiedContentsPath(const base::FilePath& extension_path) { - return extension_path.Append(kMetadataFolder) - .Append(FILE_PATH_LITERAL("verified_contents.json")); -} - -} // namespace - -namespace update_client { - -ComponentUnpacker::Result::Result() = default; - -ComponentUnpacker::ComponentUnpacker(const std::vector<uint8_t>& pk_hash, - const base::FilePath& path, - scoped_refptr<CrxInstaller> installer, - std::unique_ptr<Unzipper> unzipper, - scoped_refptr<Patcher> patcher, - crx_file::VerifierFormat crx_format) - : pk_hash_(pk_hash), - path_(path), - is_delta_(false), - installer_(installer), - unzipper_(std::move(unzipper)), - patcher_tool_(patcher), - crx_format_(crx_format), - error_(UnpackerError::kNone), - extended_error_(0) {} - -ComponentUnpacker::~ComponentUnpacker() = default; - -void ComponentUnpacker::Unpack(Callback callback) { - callback_ = std::move(callback); - if (!Verify() || !BeginUnzipping()) - EndUnpacking(); -} - -bool ComponentUnpacker::Verify() { - VLOG(1) << "Verifying component: " << path_.value(); - if (path_.empty()) { - error_ = UnpackerError::kInvalidParams; - return false; - } - std::vector<std::vector<uint8_t>> required_keys; - if (!pk_hash_.empty()) - required_keys.push_back(pk_hash_); - const crx_file::VerifierResult result = crx_file::Verify( - path_, crx_format_, required_keys, std::vector<uint8_t>(), &public_key_, - nullptr, &compressed_verified_contents_); - if (result != crx_file::VerifierResult::OK_FULL && - result != crx_file::VerifierResult::OK_DELTA) { - error_ = UnpackerError::kInvalidFile; - extended_error_ = static_cast<int>(result); - return false; - } - is_delta_ = result == crx_file::VerifierResult::OK_DELTA; - VLOG(1) << "Verification successful: " << path_.value(); - return true; -} - -bool ComponentUnpacker::BeginUnzipping() { - // Mind the reference to non-const type, passed as an argument below. - base::FilePath& destination = is_delta_ ? unpack_diff_path_ : unpack_path_; - if (!base::CreateNewTempDirectory( - FILE_PATH_LITERAL("chrome_ComponentUnpacker_BeginUnzipping"), - &destination)) { - VLOG(1) << "Unable to create temporary directory for unpacking."; - error_ = UnpackerError::kUnzipPathError; - return false; - } - VLOG(1) << "Unpacking in: " << destination.value(); - unzipper_->Unzip(path_, destination, - base::BindOnce(&ComponentUnpacker::EndUnzipping, this)); - return true; -} - -void ComponentUnpacker::EndUnzipping(bool result) { - if (!result) { - VLOG(1) << "Unzipping failed."; - error_ = UnpackerError::kUnzipFailed; - EndUnpacking(); - return; - } - VLOG(1) << "Unpacked successfully"; - base::FilePath verified_contents_path = - GetVerifiedContentsPath(is_delta_ ? unpack_diff_path_ : unpack_path_); - // If the verified contents are already present in the _metadata folder, we - // can ignore the verified contents in the header. - if (compressed_verified_contents_.empty() || - base::PathExists(verified_contents_path)) { - BeginPatching(); - return; - } - - UncompressVerifiedContents(); -} - -void ComponentUnpacker::UncompressVerifiedContents() { - std::string verified_contents; - if (!compression::GzipUncompress(compressed_verified_contents_, - &verified_contents)) { - LOG(ERROR) << "Decompressing verified contents from header failed"; - BeginPatching(); - return; - } - - StoreVerifiedContentsInExtensionDir(verified_contents); -} - -void ComponentUnpacker::StoreVerifiedContentsInExtensionDir( - const std::string& verified_contents) { - base::FilePath extension_dir = is_delta_ ? unpack_diff_path_ : unpack_path_; - base::FilePath metadata_path = extension_dir.Append(kMetadataFolder); - if (!base::CreateDirectory(metadata_path)) { - LOG(ERROR) << "Could not create metadata directory " << metadata_path; - BeginPatching(); - return; - } - - base::FilePath verified_contents_path = - GetVerifiedContentsPath(extension_dir); - - // Cannot write the verified contents file. - if (!base::WriteFile(verified_contents_path, verified_contents)) { - LOG(ERROR) << "Could not write verified contents into file " - << verified_contents_path; - BeginPatching(); - return; - } - - BeginPatching(); -} - -void ComponentUnpacker::BeginPatching() { - if (is_delta_) { // Package is a diff package. - // Use a different temp directory for the patch output files. - if (!base::CreateNewTempDirectory( - FILE_PATH_LITERAL("chrome_ComponentUnpacker_BeginPatching"), - &unpack_path_)) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentUnpacker::EndPatching, this, - UnpackerError::kUnzipPathError, 0)); - return; - } - patcher_ = base::MakeRefCounted<ComponentPatcher>( - unpack_diff_path_, unpack_path_, installer_, patcher_tool_); - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(&ComponentPatcher::Start, patcher_, - base::BindOnce(&ComponentUnpacker::EndPatching, this))); - } else { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentUnpacker::EndPatching, this, - UnpackerError::kNone, 0)); - } -} - -void ComponentUnpacker::EndPatching(UnpackerError error, int extended_error) { - error_ = error; - extended_error_ = extended_error; - patcher_ = nullptr; - - EndUnpacking(); -} - -void ComponentUnpacker::EndUnpacking() { - if (!unpack_diff_path_.empty()) - base::DeletePathRecursively(unpack_diff_path_); - if (error_ != UnpackerError::kNone && !unpack_path_.empty()) - base::DeletePathRecursively(unpack_path_); - - Result result; - result.error = error_; - result.extended_error = extended_error_; - if (error_ == UnpackerError::kNone) { - result.unpack_path = unpack_path_; - result.public_key = public_key_; - } - - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback_), result)); -} - -} // namespace update_client
diff --git a/components/update_client/component_unpacker.h b/components/update_client/component_unpacker.h deleted file mode 100644 index 312c96c..0000000 --- a/components/update_client/component_unpacker.h +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_UPDATE_CLIENT_COMPONENT_UNPACKER_H_ -#define COMPONENTS_UPDATE_CLIENT_COMPONENT_UNPACKER_H_ - -#include <stdint.h> - -#include <memory> -#include <string> -#include <vector> - -#include "base/files/file_path.h" -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "components/update_client/update_client_errors.h" - -// TODO(crbug.com/1349158): Remove this class once Puffin patches are fully -// implemented. - -namespace crx_file { -enum class VerifierFormat; -} - -namespace update_client { - -class CrxInstaller; -class ComponentPatcher; -class Patcher; -class Unzipper; - -// In charge of unpacking the component CRX package and verifying that it is -// well formed and the cryptographic signature is correct. -// -// This class should be used only by the component updater. It is inspired by -// and overlaps with code in the extension's SandboxedUnpacker. -// The main differences are: -// - The public key hash is full SHA256. -// - Does not use a sandboxed unpacker. A valid component is fully trusted. -// - The manifest can have different attributes and resources are not -// transcoded. -// -// If the CRX is a delta CRX, the flow is: -// [ComponentUpdater] [ComponentPatcher] -// Unpack -// \_ Verify -// \_ Unzip -// \_ BeginPatching ---> DifferentialUpdatePatch -// ... -// EndPatching <------------ ... -// \_ EndUnpacking -// -// For a full CRX, the flow is: -// [ComponentUpdater] -// Unpack -// \_ Verify -// \_ Unzip -// \_ BeginPatching -// | -// V -// EndPatching -// \_ EndUnpacking -// -// During unzip step we also check for verified_contents.json in the header -// of crx file and unpack it to metadata_ folder if it doesn't already contain -// verified_contents file. -// In both cases, if there is an error at any point, the remaining steps will -// be skipped and EndUnpacking will be called. -class ComponentUnpacker : public base::RefCountedThreadSafe<ComponentUnpacker> { - public: - // Contains the result of the unpacking. - struct Result { - Result(); - - // Unpack error: 0 indicates success. - UnpackerError error = UnpackerError::kNone; - - // Additional error information, such as errno or last error. - int extended_error = 0; - - // Path of the unpacked files if the unpacking was successful. - base::FilePath unpack_path; - - // The extracted public key of the package if the unpacking was successful. - std::string public_key; - }; - - using Callback = base::OnceCallback<void(const Result& result)>; - - // Constructs an unpacker for a specific component unpacking operation. - // |pk_hash| is the expected public developer key's SHA256 hash. If empty, - // the unpacker accepts any developer key. |path| is the current location - // of the CRX. - ComponentUnpacker(const std::vector<uint8_t>& pk_hash, - const base::FilePath& path, - scoped_refptr<CrxInstaller> installer, - std::unique_ptr<Unzipper> unzipper, - scoped_refptr<Patcher> patcher, - crx_file::VerifierFormat crx_format); - - ComponentUnpacker(const ComponentUnpacker&) = delete; - ComponentUnpacker& operator=(const ComponentUnpacker&) = delete; - - // Begins the actual unpacking of the files. May invoke a patcher and the - // component installer if the package is a differential update. - // Calls |callback| with the result. - void Unpack(Callback callback); - - private: - friend class base::RefCountedThreadSafe<ComponentUnpacker>; - - virtual ~ComponentUnpacker(); - - // The first step of unpacking is to verify the file. Returns false if an - // error is encountered, the file is malformed, or the file is incorrectly - // signed. - bool Verify(); - - // The second step of unpacking is to unzip. Returns false if an early error - // is encountered. - bool BeginUnzipping(); - void EndUnzipping(bool error); - - // Decompresses verified contents fetched from the header of CRX. - void UncompressVerifiedContents(); - - // Stores the decompressed verified contents fetched from the header of CRX. - void StoreVerifiedContentsInExtensionDir( - const std::string& verified_contents); - - // The third step is to optionally patch files - this is a no-op for full - // (non-differential) updates. This step is asynchronous. - void BeginPatching(); - void EndPatching(UnpackerError error, int extended_error); - - // The final step is to do clean-up for things that can't be tidied as we go. - // If there is an error at any step, the remaining steps are skipped and - // EndUnpacking is called. EndUnpacking is responsible for calling the - // callback provided in Unpack(). - void EndUnpacking(); - - std::vector<uint8_t> pk_hash_; - base::FilePath path_; - base::FilePath unpack_path_; - base::FilePath unpack_diff_path_; - bool is_delta_; - scoped_refptr<ComponentPatcher> patcher_; - scoped_refptr<CrxInstaller> installer_; - Callback callback_; - std::unique_ptr<Unzipper> unzipper_; - scoped_refptr<Patcher> patcher_tool_; - crx_file::VerifierFormat crx_format_; - UnpackerError error_; - int extended_error_; - std::string public_key_; - - // The compressed verified contents extracted from the CRX header. - std::vector<uint8_t> compressed_verified_contents_; -}; - -} // namespace update_client - -#endif // COMPONENTS_UPDATE_CLIENT_COMPONENT_UNPACKER_H_
diff --git a/components/update_client/component_unpacker_unittest.cc b/components/update_client/component_unpacker_unittest.cc deleted file mode 100644 index 9ea4b03..0000000 --- a/components/update_client/component_unpacker_unittest.cc +++ /dev/null
@@ -1,154 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <iterator> -#include <utility> -#include <vector> - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/functional/bind.h" -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/run_loop.h" -#include "base/task/sequenced_task_runner.h" -#include "base/test/task_environment.h" -#include "components/crx_file/crx_verifier.h" -#include "components/services/patch/in_process_file_patcher.h" -#include "components/services/unzip/in_process_unzipper.h" -#include "components/update_client/component_unpacker.h" -#include "components/update_client/patch/patch_impl.h" -#include "components/update_client/patcher.h" -#include "components/update_client/test_configurator.h" -#include "components/update_client/test_installer.h" -#include "components/update_client/test_utils.h" -#include "components/update_client/unzip/unzip_impl.h" -#include "components/update_client/unzipper.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace update_client { - -class ComponentUnpackerTest : public testing::Test { - public: - ComponentUnpackerTest() = default; - ~ComponentUnpackerTest() override = default; - - void UnpackComplete(const ComponentUnpacker::Result& result) { - result_ = result; - main_thread_task_runner_->PostTask(FROM_HERE, std::move(quit_closure_)); - } - - protected: - void RunThreads() { runloop_.Run(); } - - base::test::TaskEnvironment task_environment_; - const scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner_ = - base::SequencedTaskRunner::GetCurrentDefault(); - base::RunLoop runloop_; - base::OnceClosure quit_closure_ = runloop_.QuitClosure(); - ComponentUnpacker::Result result_; -}; - -TEST_F(ComponentUnpackerTest, UnpackFullCrx) { - scoped_refptr<ComponentUnpacker> component_unpacker = - base::MakeRefCounted<ComponentUnpacker>( - std::vector<uint8_t>(std::begin(jebg_hash), std::end(jebg_hash)), - GetTestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"), nullptr, - base::MakeRefCounted<update_client::UnzipChromiumFactory>( - base::BindRepeating(&unzip::LaunchInProcessUnzipper)) - ->Create(), - base::MakeRefCounted<update_client::PatchChromiumFactory>( - base::BindRepeating(&patch::LaunchInProcessFilePatcher)) - ->Create(), - crx_file::VerifierFormat::CRX3); - component_unpacker->Unpack(base::BindOnce( - &ComponentUnpackerTest::UnpackComplete, base::Unretained(this))); - RunThreads(); - - EXPECT_EQ(UnpackerError::kNone, result_.error); - EXPECT_EQ(0, result_.extended_error); - - base::FilePath unpack_path = result_.unpack_path; - EXPECT_FALSE(unpack_path.empty()); - EXPECT_TRUE(base::DirectoryExists(unpack_path)); - EXPECT_EQ(jebg_public_key, result_.public_key); - - int64_t file_size = 0; - EXPECT_TRUE( - base::GetFileSize(unpack_path.AppendASCII("component1.dll"), &file_size)); - EXPECT_EQ(1024, file_size); - EXPECT_TRUE( - base::GetFileSize(unpack_path.AppendASCII("manifest.json"), &file_size)); - EXPECT_EQ(169, file_size); - - EXPECT_TRUE(base::DeletePathRecursively(unpack_path)); -} - -TEST_F(ComponentUnpackerTest, UnpackFileNotFound) { - scoped_refptr<ComponentUnpacker> component_unpacker = - base::MakeRefCounted<ComponentUnpacker>( - std::vector<uint8_t>(std::begin(jebg_hash), std::end(jebg_hash)), - GetTestFilePath("file-not-found.crx"), nullptr, nullptr, nullptr, - crx_file::VerifierFormat::CRX3); - component_unpacker->Unpack(base::BindOnce( - &ComponentUnpackerTest::UnpackComplete, base::Unretained(this))); - RunThreads(); - - EXPECT_EQ(UnpackerError::kInvalidFile, result_.error); - EXPECT_EQ(static_cast<int>(crx_file::VerifierResult::ERROR_FILE_NOT_READABLE), - result_.extended_error); - - EXPECT_TRUE(result_.unpack_path.empty()); -} - -// Tests a mismatch between the public key hash and the id of the component. -TEST_F(ComponentUnpackerTest, UnpackFileHashMismatch) { - scoped_refptr<ComponentUnpacker> component_unpacker = - base::MakeRefCounted<ComponentUnpacker>( - std::vector<uint8_t>(std::begin(abag_hash), std::end(abag_hash)), - GetTestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"), nullptr, - nullptr, nullptr, crx_file::VerifierFormat::CRX3); - component_unpacker->Unpack(base::BindOnce( - &ComponentUnpackerTest::UnpackComplete, base::Unretained(this))); - RunThreads(); - - EXPECT_EQ(UnpackerError::kInvalidFile, result_.error); - EXPECT_EQ( - static_cast<int>(crx_file::VerifierResult::ERROR_REQUIRED_PROOF_MISSING), - result_.extended_error); - - EXPECT_TRUE(result_.unpack_path.empty()); -} - -TEST_F(ComponentUnpackerTest, UnpackWithVerifiedContents) { - scoped_refptr<ComponentUnpacker> component_unpacker = - base::MakeRefCounted<ComponentUnpacker>( - std::vector<uint8_t>(), - GetTestFilePath("gndmhdcefbhlchkhipcnnbkcmicncehk_22_314.crx3"), - nullptr, - base::MakeRefCounted<update_client::UnzipChromiumFactory>( - base::BindRepeating(&unzip::LaunchInProcessUnzipper)) - ->Create(), - nullptr, crx_file::VerifierFormat::CRX3); - component_unpacker->Unpack(base::BindOnce( - &ComponentUnpackerTest::UnpackComplete, base::Unretained(this))); - RunThreads(); - - EXPECT_EQ(UnpackerError::kNone, result_.error); - EXPECT_EQ(0, result_.extended_error); - - base::FilePath unpack_path = result_.unpack_path; - EXPECT_FALSE(unpack_path.empty()); - EXPECT_TRUE(base::DirectoryExists(unpack_path)); - - int64_t file_size = 0; - EXPECT_TRUE(base::GetFileSize( - unpack_path.AppendASCII("_metadata/verified_contents.json"), &file_size)); - EXPECT_EQ(1538, file_size); - - EXPECT_TRUE(base::DeletePathRecursively(unpack_path)); -} - -} // namespace update_client
diff --git a/components/update_client/patch/in_process_patcher.cc b/components/update_client/patch/in_process_patcher.cc index 8e33d2a..a0d89788 100644 --- a/components/update_client/patch/in_process_patcher.cc +++ b/components/update_client/patch/in_process_patcher.cc
@@ -7,12 +7,8 @@ #include <utility> #include "base/files/file.h" -#include "base/files/file_path.h" #include "base/functional/callback.h" #include "base/memory/scoped_refptr.h" -#include "base/notreached.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" #include "third_party/puffin/src/include/puffin/puffpatch.h" namespace update_client { @@ -23,50 +19,6 @@ public: InProcessPatcher() = default; - // TODO(crbug.com/1349158): Remove this function once PatchPuffPatch is - // implemented as this becomes obsolete. - void PatchBsdiff(const base::FilePath& input_path, - const base::FilePath& patch_path, - const base::FilePath& output_path, - PatchCompleteCallback callback) const override { - base::File input_file(input_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File patch_file(patch_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File output_file(output_path, - base::File::FLAG_CREATE | base::File::FLAG_WRITE | - base::File::FLAG_WIN_EXCLUSIVE_WRITE); - if (!input_file.IsValid() || !patch_file.IsValid() || - !output_file.IsValid()) { - std::move(callback).Run(-1); - return; - } - std::move(callback).Run(bsdiff::ApplyBinaryPatch( - std::move(input_file), std::move(patch_file), std::move(output_file))); - } - - // TODO(crbug.com/1349158): Remove this function once PatchPuffPatch is - // implemented as this becomes obsolete. - void PatchCourgette(const base::FilePath& input_path, - const base::FilePath& patch_path, - const base::FilePath& output_path, - PatchCompleteCallback callback) const override { - base::File input_file(input_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File patch_file(patch_path, - base::File::FLAG_OPEN | base::File::FLAG_READ); - base::File output_file(output_path, - base::File::FLAG_CREATE | base::File::FLAG_WRITE | - base::File::FLAG_WIN_EXCLUSIVE_WRITE); - if (!input_file.IsValid() || !patch_file.IsValid() || - !output_file.IsValid()) { - std::move(callback).Run(-1); - return; - } - std::move(callback).Run(courgette::ApplyEnsemblePatch( - std::move(input_file), std::move(patch_file), std::move(output_file))); - } - void PatchPuffPatch(base::File input_file, base::File patch_file, base::File output_file,
diff --git a/components/update_client/patch/patch_impl.cc b/components/update_client/patch/patch_impl.cc index c0bb4e6..6ef083a5 100644 --- a/components/update_client/patch/patch_impl.cc +++ b/components/update_client/patch/patch_impl.cc
@@ -8,7 +8,6 @@ #include "base/functional/callback.h" #include "base/notreached.h" #include "components/services/patch/public/cpp/patch.h" -#include "components/update_client/component_patcher_operation.h" namespace update_client { @@ -19,22 +18,6 @@ explicit PatcherImpl(PatchChromiumFactory::Callback callback) : callback_(std::move(callback)) {} - void PatchBsdiff(const base::FilePath& old_file, - const base::FilePath& patch_file, - const base::FilePath& destination, - PatchCompleteCallback callback) const override { - patch::Patch(callback_.Run(), update_client::kBsdiff, old_file, patch_file, - destination, std::move(callback)); - } - - void PatchCourgette(const base::FilePath& old_file, - const base::FilePath& patch_file, - const base::FilePath& destination, - PatchCompleteCallback callback) const override { - patch::Patch(callback_.Run(), update_client::kCourgette, old_file, - patch_file, destination, std::move(callback)); - } - void PatchPuffPatch(base::File old_file, base::File patch_file, base::File destination_file,
diff --git a/components/update_client/patcher.h b/components/update_client/patcher.h index 0837ce6..1053168d 100644 --- a/components/update_client/patcher.h +++ b/components/update_client/patcher.h
@@ -9,7 +9,6 @@ #include "base/memory/ref_counted.h" namespace base { -class FilePath; class File; } // namespace base @@ -22,16 +21,6 @@ Patcher(const Patcher&) = delete; Patcher& operator=(const Patcher&) = delete; - virtual void PatchBsdiff(const base::FilePath& input_file, - const base::FilePath& patch_file, - const base::FilePath& destination, - PatchCompleteCallback callback) const = 0; - - virtual void PatchCourgette(const base::FilePath& input_file, - const base::FilePath& patch_file, - const base::FilePath& destination, - PatchCompleteCallback callback) const = 0; - virtual void PatchPuffPatch(base::File input_file_path, base::File patch_file_path, base::File output_file_path,
diff --git a/components/update_client/puffin_patcher.cc b/components/update_client/puffin_patcher.cc index e96047ef..b0b3cb0 100644 --- a/components/update_client/puffin_patcher.cc +++ b/components/update_client/puffin_patcher.cc
@@ -15,7 +15,6 @@ #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_runner.h" -#include "components/update_client/component_patcher_operation.h" #include "components/update_client/patcher.h" #include "components/update_client/update_client.h" #include "components/update_client/update_client_errors.h"
diff --git a/components/update_client/puffin_patcher.h b/components/update_client/puffin_patcher.h index 50fd8b1..31c4efcb 100644 --- a/components/update_client/puffin_patcher.h +++ b/components/update_client/puffin_patcher.h
@@ -19,14 +19,10 @@ #define COMPONENTS_UPDATE_CLIENT_PUFFIN_PATCHER_H_ #include "base/files/file.h" -#include "base/functional/callback_forward.h" +#include "base/functional/callback.h" #include "base/memory/ref_counted.h" #include "base/sequence_checker.h" -#include "components/update_client/component_unpacker.h" - -namespace base { -class File; -} +#include "components/update_client/update_client_errors.h" namespace update_client {
diff --git a/components/update_client/puffin_patcher_unittest.cc b/components/update_client/puffin_patcher_unittest.cc index 1babd02..577c468 100644 --- a/components/update_client/puffin_patcher_unittest.cc +++ b/components/update_client/puffin_patcher_unittest.cc
@@ -23,8 +23,6 @@ #include "components/update_client/test_installer.h" #include "components/update_client/test_utils.h" #include "components/update_client/update_client_errors.h" -#include "courgette/courgette.h" -#include "courgette/third_party/bsdiff/bsdiff.h" #include "testing/gtest/include/gtest/gtest.h" namespace update_client {
diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc index b1877327..41e7130 100644 --- a/components/update_client/update_client_unittest.cc +++ b/components/update_client/update_client_unittest.cc
@@ -33,7 +33,6 @@ #include "components/prefs/testing_pref_service.h" #include "components/services/unzip/in_process_unzipper.h" #include "components/update_client/activity_data_service.h" -#include "components/update_client/component_unpacker.h" #include "components/update_client/crx_downloader_factory.h" #include "components/update_client/crx_update_item.h" #include "components/update_client/features.h"
diff --git a/components/variations/service/variations_field_trial_creator_base.cc b/components/variations/service/variations_field_trial_creator_base.cc index 1bf8758..eccaccbd 100644 --- a/components/variations/service/variations_field_trial_creator_base.cc +++ b/components/variations/service/variations_field_trial_creator_base.cc
@@ -498,21 +498,25 @@ } #endif // BUILDFLAG(FIELDTRIAL_TESTING_ENABLED) -bool VariationsFieldTrialCreatorBase::HasSeedExpired(bool is_safe_seed) { +base::Time VariationsFieldTrialCreatorBase::CalculateSeedFreshness() { // TODO(crbug/1462588): Consider comparing the server-provided fetch time with // the network time. - const base::Time fetch_time = is_safe_seed - ? GetSeedStore()->GetSafeSeedFetchTime() - : GetSeedStore()->GetLastFetchTime(); + return seed_type_ == SeedType::kSafeSeed + ? GetSeedStore()->GetSafeSeedFetchTime() + : GetSeedStore()->GetLastFetchTime(); +} +bool VariationsFieldTrialCreatorBase::HasSeedExpired() { + const base::Time fetch_time = CalculateSeedFreshness(); // If the fetch time is null, skip the expiry check. If the seed is a regular // seed (i.e. not a safe seed) and the fetch time is missing, then this must // be the first run of Chrome. If the seed is a safe seed, the fetch time may // be missing because the pref was added about a milestone later than most of // the other safe seed prefs. if (fetch_time.is_null()) { - RecordSeedExpiry(is_safe_seed, VariationsSeedExpiry::kFetchTimeMissing); - if (!is_safe_seed) { + RecordSeedExpiry(seed_type_ == SeedType::kSafeSeed, + VariationsSeedExpiry::kFetchTimeMissing); + if (seed_type_ != SeedType::kSafeSeed) { // Store the current time as the last fetch time for Chrome's first run. GetSeedStore()->RecordLastFetchTime(base::Time::Now()); // Record freshness of "0", since we expect a first run seed to be fresh. @@ -524,9 +528,9 @@ if (!has_seed_expired) { RecordSeedFreshness(base::Time::Now() - fetch_time); } - RecordSeedExpiry(is_safe_seed, has_seed_expired - ? VariationsSeedExpiry::kExpired - : VariationsSeedExpiry::kNotExpired); + RecordSeedExpiry(seed_type_ == SeedType::kSafeSeed, + has_seed_expired ? VariationsSeedExpiry::kExpired + : VariationsSeedExpiry::kNotExpired); return has_seed_expired; } @@ -626,7 +630,7 @@ : SeedUsage::kUnloadableRegularSeedNotUsed); return false; } - if (HasSeedExpired(/*is_safe_seed=*/run_in_safe_mode)) { + if (HasSeedExpired()) { RecordVariationsSeedUsage(run_in_safe_mode ? SeedUsage::kExpiredSafeSeedNotUsed : SeedUsage::kExpiredRegularSeedNotUsed);
diff --git a/components/variations/service/variations_field_trial_creator_base.h b/components/variations/service/variations_field_trial_creator_base.h index 61be9045..5d9aae2a 100644 --- a/components/variations/service/variations_field_trial_creator_base.h +++ b/components/variations/service/variations_field_trial_creator_base.h
@@ -193,6 +193,9 @@ // overridden. void OverrideVariationsPlatform(Study::Platform platform_override); + // Calculates the Seed Freshness + base::Time CalculateSeedFreshness(); + // Returns the locale that was used for evaluating trials. const std::string& application_locale() const { return application_locale_; } @@ -236,7 +239,7 @@ // older than the binary build time. // // Also, records a couple VariationsSeed-related metrics. - bool HasSeedExpired(bool is_safe_seed); + bool HasSeedExpired(); // Returns true if the loaded VariationsSeed is for a future milestone (e.g. // if the client is on M92 and the seed was fetched with M93). A seed for a
diff --git a/content/browser/network/trust_token_origin_trial_browsertest.cc b/content/browser/network/trust_token_origin_trial_browsertest.cc index b182665..12cc4aa 100644 --- a/content/browser/network/trust_token_origin_trial_browsertest.cc +++ b/content/browser/network/trust_token_origin_trial_browsertest.cc
@@ -122,7 +122,6 @@ } struct TestDescription { - network::mojom::TrustTokenMajorVersion version; Op op; Outcome outcome; TrialType trial_type; @@ -240,43 +239,28 @@ }; const TestDescription kTestDescriptions[] = { - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kIssuance, Outcome::kSuccess, + {Op::kIssuance, Outcome::kSuccess, TrialType::kOnlyIssuanceRequiresOriginTrial, TrialEnabled::kEnabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kRedemption, Outcome::kSuccess, + {Op::kRedemption, Outcome::kSuccess, TrialType::kOnlyIssuanceRequiresOriginTrial, TrialEnabled::kEnabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kRedemption, Outcome::kSuccess, + {Op::kRedemption, Outcome::kSuccess, TrialType::kOnlyIssuanceRequiresOriginTrial, TrialEnabled::kDisabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kIssuance, Outcome::kSuccess, + {Op::kIssuance, Outcome::kSuccess, TrialType::kAllOperationsRequireOriginTrial, TrialEnabled::kEnabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kIssuance, Outcome::kSuccessWithoutTrustTokenParams, + {Op::kIssuance, Outcome::kSuccessWithoutTrustTokenParams, TrialType::kAllOperationsRequireOriginTrial, TrialEnabled::kDisabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kRedemption, Outcome::kSuccess, + {Op::kRedemption, Outcome::kSuccess, TrialType::kAllOperationsRequireOriginTrial, TrialEnabled::kEnabled}, - {network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - Op::kRedemption, Outcome::kSuccessWithoutTrustTokenParams, + {Op::kRedemption, Outcome::kSuccessWithoutTrustTokenParams, TrialType::kAllOperationsRequireOriginTrial, TrialEnabled::kDisabled}, }; -std::string ToString(network::mojom::TrustTokenMajorVersion version) { - if (version == network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1) { - return "1"; - } - NOTREACHED(); - return ""; -} - // Prints a string representation to use for generating test names. std::string ToString(Op op) { switch (op) { @@ -297,9 +281,9 @@ const TestDescription& test_description = std::get<1>(info.param); return base::ReplaceStringPlaceholders( - "$1_$2_$3_$4_$5", - {ToString(interface), ToString(test_description.version), - ToString(test_description.op), ToString(test_description.trial_type), + "$1_$2_$3_$4", + {ToString(interface), ToString(test_description.op), + ToString(test_description.trial_type), ToString(test_description.trial_enabled)}, nullptr); } @@ -349,8 +333,7 @@ } network::TrustTokenTestParameters trust_token_params( - test_description.version, test_description.op, absl::nullopt, - absl::nullopt); + 1, test_description.op, absl::nullopt, absl::nullopt); network::TrustTokenParametersAndSerialization expected_params_and_serialization =
diff --git a/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc b/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc index 74a637c..a8b1211 100644 --- a/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc +++ b/content/browser/renderer_host/accessibility_tree_linkage_win_browsertest.cc
@@ -47,8 +47,8 @@ const AccessibilityTreeLinkageWinBrowserTest&) = delete; ~AccessibilityTreeLinkageWinBrowserTest() override { - dummy_ax_platform_node_->Destroy(); - dummy_ax_platform_node_ = nullptr; + // Calling Destroy will delete `dummy_ax_platform_node_`. + dummy_ax_platform_node_.ExtractAsDangling()->Destroy(); } void SetUpCommandLine(base::CommandLine* command_line) override { @@ -73,7 +73,7 @@ protected: ui::AXPlatformNodeDelegate dummy_ax_node_; - raw_ptr<ui::AXPlatformNode, DanglingUntriaged> dummy_ax_platform_node_; + raw_ptr<ui::AXPlatformNode> dummy_ax_platform_node_; }; IN_PROC_BROWSER_TEST_P(AccessibilityTreeLinkageWinBrowserTest, Linkage) {
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 904901b..2906d59 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -1753,8 +1753,6 @@ // Prepare to intercept BeginNavigation mojo IPC. This has to be done before // the test creates the RenderFrameHostImpl that is the target of the IPC. auto params = network::mojom::TrustTokenParams::New(); - params->version = - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; params->operation = network::mojom::TrustTokenOperationType::kRedemption; BeginNavigationTrustTokenParamsReplacer replacer(web_contents, std::move(params)); @@ -1793,8 +1791,6 @@ // Prepare to intercept BeginNavigation mojo IPC. This has to be done before // the test creates the RenderFrameHostImpl that is the target of the IPC. auto params = network::mojom::TrustTokenParams::New(); - params->version = - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; params->operation = network::mojom::TrustTokenOperationType::kSigning; BeginNavigationTrustTokenParamsReplacer replacer(web_contents, std::move(params)); @@ -1833,8 +1829,6 @@ // Prepare to intercept BeginNavigation mojo IPC. This has to be done before // the test creates the RenderFrameHostImpl that is the target of the IPC. auto params = network::mojom::TrustTokenParams::New(); - params->version = - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; params->operation = network::mojom::TrustTokenOperationType::kIssuance; BeginNavigationTrustTokenParamsReplacer replacer(web_contents, std::move(params));
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index c08faa8c..ed190dc 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -1038,8 +1038,9 @@ void FederatedAuthRequestImpl::CancelTokenRequest() { if (!auth_request_token_callback_) { - mojo::ReportBadMessage( - "The abort controller must be used after initiating a token request."); + // TODO(crbug.com/1500499): this should only happen with a compromised + // renderer process but for some reason that is not the case. We should + // investigate what could go wrong about the abort controller. return; }
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 6f971e5c..32aac181 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -69,6 +69,9 @@ #include "third_party/blink/public/web/web_script_source.h" #include "third_party/blink/public/web/web_view.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/color/color_provider.h" +#include "ui/color/color_provider_manager.h" +#include "ui/color/color_provider_source.h" #include "ui/events/base_event_utils.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/native_theme/native_theme_features.h" @@ -144,6 +147,37 @@ receivers_; }; +class MockColorProviderSource : public ui::ColorProviderSource { + public: + explicit MockColorProviderSource() { provider_.GenerateColorMap(); } + MockColorProviderSource(const MockColorProviderSource&) = delete; + MockColorProviderSource& operator=(const MockColorProviderSource&) = delete; + ~MockColorProviderSource() override = default; + + // ui::ColorProviderSource: + const ui::ColorProvider* GetColorProvider() const override { + return &provider_; + } + + const ui::RendererColorMap GetRendererColorMap( + ui::ColorProviderKey::ColorMode color_mode, + ui::ColorProviderKey::ForcedColors forced_colors) const override { + auto key = GetColorProviderKey(); + key.color_mode = color_mode; + key.forced_colors = forced_colors; + ui::ColorProvider* color_provider = + ui::ColorProviderManager::Get().GetColorProviderFor(key); + CHECK(color_provider); + return ui::CreateRendererColorMap(*color_provider); + } + + ui::ColorProviderKey GetColorProviderKey() const override { return key_; } + + private: + ui::ColorProvider provider_; + ui::ColorProviderKey key_; +}; + // Converts |ascii_character| into |key_code| and returns true on success. // Handles only the characters needed by tests. bool GetWindowsKeyCode(char ascii_character, int* key_code) { @@ -434,11 +468,28 @@ process_ = std::make_unique<RenderProcess>(); + // This is used to get the renderer color maps for the purpose of creating the + // color providers in Blink::Page. + MockColorProviderSource mock_color_provider_source_ = + MockColorProviderSource(); + + blink::ColorProviderColorMaps color_maps = blink::ColorProviderColorMaps{ + mock_color_provider_source_.GetRendererColorMap( + ui::ColorProviderKey::ColorMode::kLight, + ui::ColorProviderKey::ForcedColors::kNone), + mock_color_provider_source_.GetRendererColorMap( + ui::ColorProviderKey::ColorMode::kDark, + ui::ColorProviderKey::ForcedColors::kNone), + mock_color_provider_source_.GetRendererColorMap( + mock_color_provider_source_.GetColorMode(), + ui::ColorProviderKey::ForcedColors::kActive)}; + mojom::CreateViewParamsPtr view_params = mojom::CreateViewParams::New(); view_params->opener_frame_token = absl::nullopt; view_params->window_was_opened_by_another_window = false; view_params->renderer_preferences = blink::RendererPreferences(); view_params->web_preferences = blink::web_pref::WebPreferences(); + view_params->color_provider_colors = color_maps; view_params->replication_state = blink::mojom::FrameReplicationState::New(); view_params->blink_page_broadcast = page_broadcast_.BindNewEndpointAndPassDedicatedReceiver();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index a545f267..d7d2b586 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -585,6 +585,7 @@ "//ui/base/clipboard", "//ui/base/clipboard:clipboard_test_support", "//ui/base/ime", + "//ui/color:mixers", "//ui/compositor:test_support", "//ui/display", "//ui/events:dom_keycode_converter",
diff --git a/device/bluetooth/floss/bluetooth_device_floss.cc b/device/bluetooth/floss/bluetooth_device_floss.cc index 265f23be2..146b50b4 100644 --- a/device/bluetooth/floss/bluetooth_device_floss.cc +++ b/device/bluetooth/floss/bluetooth_device_floss.cc
@@ -262,6 +262,13 @@ pending_set_connection_latency_ = absl::nullopt; } + // If there is no active connection, UpdateConnectionParameters succeeds + // silently and won't generates any callbacks. Run callback right here. + if (!IsConnected()) { + std::move(callback).Run(); + return; + } + pending_set_connection_latency_ = std::make_pair(std::move(callback), std::move(error_callback)); }
diff --git a/gpu/command_buffer/client/client_shared_image.cc b/gpu/command_buffer/client/client_shared_image.cc index 3f8775b..0e7bf17c 100644 --- a/gpu/command_buffer/client/client_shared_image.cc +++ b/gpu/command_buffer/client/client_shared_image.cc
@@ -103,4 +103,12 @@ return scoped_mapping; } +#if BUILDFLAG(IS_APPLE) +void ClientSharedImage::SetColorSpaceOnNativeBuffer( + const gfx::ColorSpace& color_space) { + CHECK(gpu_memory_buffer_); + gpu_memory_buffer_->SetColorSpace(color_space); +} +#endif + } // namespace gpu
diff --git a/gpu/command_buffer/client/client_shared_image.h b/gpu/command_buffer/client/client_shared_image.h index cc9b2ae8..8116b2a 100644 --- a/gpu/command_buffer/client/client_shared_image.h +++ b/gpu/command_buffer/client/client_shared_image.h
@@ -84,6 +84,14 @@ return gpu_memory_buffer_->CloneHandle(); } +#if BUILDFLAG(IS_APPLE) + // Sets the color space in which the native buffer backing this SharedImage + // should be interpreted when used as an overlay. Note that this will not + // impact texturing from the buffer. Used only for SharedImages backed by a + // client-accessible IOSurface. + void SetColorSpaceOnNativeBuffer(const gfx::ColorSpace& color_space); +#endif + base::trace_event::MemoryAllocatorDumpGuid GetGUIDForTracing() { return gpu::GetSharedImageGUIDForTracing(mailbox_); }
diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc index 57bb519..abecf27 100644 --- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc
@@ -125,7 +125,9 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_DISPLAY_READ; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, @@ -188,7 +190,9 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_DISPLAY_READ; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ; auto backing = backing_factory_->CreateSharedImage( mailbox, format, size, color_space, surface_origin, alpha_type, usage, "TestLabel", initial_data); @@ -216,7 +220,8 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, alpha_type, usage, "TestLabel", /*is_thread_safe=*/false); @@ -232,7 +237,8 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, alpha_type, usage, "TestLabel", /*is_thread_safe=*/false); @@ -253,7 +259,8 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, alpha_type, usage, "TestLabel", /*is_thread_safe=*/false); @@ -466,7 +473,8 @@ // SHARED_IMAGE_USAGE_DISPLAY_READ for skia read and SHARED_IMAGE_USAGE_RASTER // for skia write. - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_RASTER; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | SHARED_IMAGE_USAGE_RASTER; if (!is_thread_safe) { usage |= SHARED_IMAGE_USAGE_DISPLAY_READ; }
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc index 3051d42..584dce4 100644 --- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
@@ -919,9 +919,9 @@ const auto format = viz::SinglePlaneFormat::kRGBA_8888; const gfx::Size size(1, 1); const auto color_space = gfx::ColorSpace::CreateSRGB(); - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | - SHARED_IMAGE_USAGE_DISPLAY_READ | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = shared_image_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, @@ -1034,9 +1034,9 @@ const auto format = viz::SinglePlaneFormat::kRGBA_8888; const gfx::Size size(1, 1); const auto color_space = gfx::ColorSpace::CreateSRGB(); - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | - SHARED_IMAGE_USAGE_DISPLAY_READ | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = shared_image_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, @@ -1290,9 +1290,9 @@ const auto format = viz::SinglePlaneFormat::kRGBA_8888; const gfx::Size size(1, 1); const auto color_space = gfx::ColorSpace::CreateSRGB(); - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | - SHARED_IMAGE_USAGE_DISPLAY_READ | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = shared_image_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, @@ -1409,9 +1409,9 @@ const auto format = viz::SinglePlaneFormat::kRGBA_8888; const gfx::Size size(1, 1); const auto color_space = gfx::ColorSpace::CreateSRGB(); - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | - SHARED_IMAGE_USAGE_DISPLAY_READ | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = shared_image_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space,
diff --git a/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc index 7c330df8..bfdbbf3c 100644 --- a/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/egl_image_backing_factory_unittest.cc
@@ -669,7 +669,8 @@ // SHARED_IMAGE_USAGE_DISPLAY_READ for skia read and SHARED_IMAGE_USAGE_RASTER // for skia write. - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_RASTER; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | SHARED_IMAGE_USAGE_RASTER; if (!is_thread_safe) usage |= SHARED_IMAGE_USAGE_DISPLAY_READ; if (upload_initial_data) {
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory_unittest.cc index 2960a49..d8f5937 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory_unittest.cc
@@ -167,7 +167,8 @@ TEST_F(GLTextureImageBackingFactoryTest, InvalidFormat) { auto format = viz::LegacyMultiPlaneFormat::kNV12; gfx::Size size(256, 256); - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; bool supported = backing_factory_->CanCreateSharedImage( usage, format, size, /*thread_safe=*/false, gfx::EMPTY_BUFFER, GrContextType::kGL, {}); @@ -184,7 +185,8 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; bool supported = backing_factory_->CanCreateSharedImage( usage, format, size, /*thread_safe=*/false, gfx::EMPTY_BUFFER, @@ -257,7 +259,8 @@ TEST_P(GLTextureImageBackingFactoryWithFormatTest, IsSupported) { auto format = get_format(); gfx::Size size(256, 256); - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; bool supported = backing_factory_->CanCreateSharedImage( usage, format, size, /*thread_safe=*/false, gfx::EMPTY_BUFFER, @@ -293,7 +296,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; bool supported = backing_factory_->CanCreateSharedImage( @@ -402,7 +406,8 @@ } gfx::Size size(0, 0); - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; bool supported = backing_factory_->CanCreateSharedImage( usage, format, size, /*thread_safe=*/false, gfx::EMPTY_BUFFER, GrContextType::kGL, {}); @@ -426,7 +431,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; std::vector<uint8_t> initial_data( viz::ResourceSizes::CheckedSizeInBytes<unsigned int>(size, format)); @@ -480,7 +486,8 @@ } gfx::Size size(256, 256); - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; size_t required_size = viz::ResourceSizes::CheckedSizeInBytes<size_t>(size, format); std::vector<uint8_t> initial_data_small(required_size / 2); @@ -508,7 +515,9 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_CPU_UPLOAD; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_CPU_UPLOAD; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; bool supported = backing_factory_->CanCreateSharedImage( @@ -550,7 +559,9 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_CPU_UPLOAD; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_CPU_UPLOAD; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; bool supported = backing_factory_->CanCreateSharedImage(
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc index 71571899..05793fd 100644 --- a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc
@@ -125,7 +125,8 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_SCANOUT; + uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | SHARED_IMAGE_USAGE_SCANOUT; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, alpha_type, usage, "TestLabel", /*is_thread_safe=*/false); @@ -315,8 +316,9 @@ GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_SCANOUT | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_WEBGPU; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, alpha_type, usage, "TestLabel", /*is_thread_safe=*/false); @@ -419,8 +421,9 @@ const auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_SCANOUT | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, @@ -510,8 +513,9 @@ const auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_SCANOUT | - SHARED_IMAGE_USAGE_WEBGPU; + const uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_WEBGPU; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin, @@ -569,7 +573,9 @@ const auto color_space = gfx::ColorSpace::CreateSRGB(); GrSurfaceOrigin surface_origin = kTopLeft_GrSurfaceOrigin; SkAlphaType alpha_type = kPremul_SkAlphaType; - const uint32_t usage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_SCANOUT; + const uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ | + SHARED_IMAGE_USAGE_GLES2_WRITE | + SHARED_IMAGE_USAGE_SCANOUT; const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; auto backing = backing_factory_->CreateSharedImage( mailbox, format, surface_handle, size, color_space, surface_origin,
diff --git a/gpu/command_buffer/service/shared_image/shared_image_factory_unittest.cc b/gpu/command_buffer/service/shared_image/shared_image_factory_unittest.cc index 29c2ad7..ecff2bd5 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_factory_unittest.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_factory_unittest.cc
@@ -62,7 +62,8 @@ gfx::Size size(256, 256); auto color_space = gfx::ColorSpace::CreateSRGB(); gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; EXPECT_TRUE(factory_->CreateSharedImage( mailbox, format, size, color_space, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, surface_handle, usage, "TestLabel")); @@ -75,7 +76,8 @@ gfx::Size size(256, 256); auto color_space = gfx::ColorSpace::CreateSRGB(); gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; EXPECT_TRUE(factory_->CreateSharedImage( mailbox, format, size, color_space, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, surface_handle, usage, "TestLabel"));
diff --git a/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc b/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc index 6c9af93..fc1b9c6 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_manager_unittest.cc
@@ -29,7 +29,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; return std::make_unique<TestImageBacking>(mailbox, format, size, color_space, surface_origin, alpha_type, usage, @@ -47,7 +48,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = std::make_unique<TestImageBacking>( mailbox, format, size, color_space, surface_origin, alpha_type, usage, @@ -129,7 +131,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = std::make_unique<TestImageBacking>( mailbox, format, size, color_space, surface_origin, alpha_type, usage, @@ -161,7 +164,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = std::make_unique<TestImageBacking>( mailbox, format, size, color_space, surface_origin, alpha_type, usage, @@ -231,7 +235,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = std::make_unique<TestImageBacking>( mailbox, format, size, color_space, surface_origin, alpha_type, usage,
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation_unittest.cc b/gpu/command_buffer/service/shared_image/shared_image_representation_unittest.cc index ec307f7f..973a3386 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation_unittest.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_representation_unittest.cc
@@ -27,7 +27,8 @@ auto color_space = gfx::ColorSpace::CreateSRGB(); auto surface_origin = kTopLeft_GrSurfaceOrigin; auto alpha_type = kPremul_SkAlphaType; - uint32_t usage = SHARED_IMAGE_USAGE_GLES2; + uint32_t usage = + SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE; auto backing = std::make_unique<TestImageBacking>( mailbox_, format, size, color_space, surface_origin, alpha_type, usage,
diff --git a/gpu/command_buffer/tests/fuzzer_main.cc b/gpu/command_buffer/tests/fuzzer_main.cc index c061adeb..d152c82 100644 --- a/gpu/command_buffer/tests/fuzzer_main.cc +++ b/gpu/command_buffer/tests/fuzzer_main.cc
@@ -414,8 +414,8 @@ context_state_.get(), shared_image_manager_.get(), /*memory_tracker=*/nullptr, /*is_for_display_compositor=*/false); - for (uint32_t usage = SHARED_IMAGE_USAGE_GLES2; usage <= LAST_CLIENT_USAGE; - usage <<= 1) { + for (uint32_t usage = SHARED_IMAGE_USAGE_GLES2_READ; + usage <= LAST_CLIENT_USAGE; usage <<= 1) { Mailbox::Name name; memset(name, 0, sizeof(name)); name[0] = usage;
diff --git a/infra/config/generated/builders/ci/android-binary-size-generator/gn-args.json b/infra/config/generated/builders/ci/android-binary-size-generator/gn-args.json index 1df19b5..7ef231c9 100644 --- a/infra/config/generated/builders/ci/android-binary-size-generator/gn-args.json +++ b/infra/config/generated/builders/ci/android-binary-size-generator/gn-args.json
@@ -7,6 +7,7 @@ "is_on_release_branch": true, "proprietary_codecs": true, "symbol_level": 1, + "target_cpu": "arm64", "target_os": "android", "use_remoteexec": true }
diff --git a/infra/config/generated/builders/try/android-binary-size/gn-args.json b/infra/config/generated/builders/try/android-binary-size/gn-args.json index 1df19b5..7ef231c9 100644 --- a/infra/config/generated/builders/try/android-binary-size/gn-args.json +++ b/infra/config/generated/builders/try/android-binary-size/gn-args.json
@@ -7,6 +7,7 @@ "is_on_release_branch": true, "proprietary_codecs": true, "symbol_level": 1, + "target_cpu": "arm64", "target_os": "android", "use_remoteexec": true }
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index 239aa1c..31853c6 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -786,6 +786,7 @@ gn_args = gn_args.config( configs = [ "android_builder", + "arm64", "chrome_with_codecs", "reclient", "minimal_symbols",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 760c41a..0f893e5 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -233,6 +233,7 @@ gn_args = gn_args.config( configs = [ "android_builder", + "arm64", "chrome_with_codecs", "reclient", "minimal_symbols",
diff --git a/ios/chrome/app/spotlight/actions_spotlight_manager.mm b/ios/chrome/app/spotlight/actions_spotlight_manager.mm index 9b36f2d1..3f822eb5 100644 --- a/ios/chrome/app/spotlight/actions_spotlight_manager.mm +++ b/ios/chrome/app/spotlight/actions_spotlight_manager.mm
@@ -16,6 +16,7 @@ #import "ios/chrome/browser/ui/lens/lens_availability.h" #import "ios/chrome/browser/ui/lens/lens_entrypoint.h" #import "ios/chrome/common/app_group/app_group_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "net/base/mac/url_conversions.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/app/spotlight/spotlight_util.mm b/ios/chrome/app/spotlight/spotlight_util.mm index daab758..4e7af91 100644 --- a/ios/chrome/app/spotlight/spotlight_util.mm +++ b/ios/chrome/app/spotlight/spotlight_util.mm
@@ -11,6 +11,7 @@ #import "base/strings/sys_string_conversions.h" #import "build/branding_buildflags.h" #import "ios/chrome/app/spotlight/spotlight_logger.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h" #import "url/gurl.h"
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index 8f0afbc..912828e 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -875,6 +875,173 @@ <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack"> Chromium automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings. </message> + <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser."> + Set Chromium as Default Browser + </message> + <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only]."> + This will be used to create events in your Apple Calendar from Chromium and Google Lens. + </message> + <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]"> + To personalize your Discover feed and Chromium, turn on sync. + </message> + <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list."> + Visit a site and click Follow in the Chromium menu + </message> + <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]"> + Chromium will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. + </message> + <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]"> + Open in Chromium Incognito + </message> + <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]"> + Open in Chromium + </message> + <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only]."> + Open URLs in Chromium in Incognito + </message> + <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only]."> + Opens the inputted URLs in Chromium in Incognito. + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only]."> + Start a search in a new Chromium tab. + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only]."> + Search in Chromium + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> + Search in Chromium + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> + Search in Chromium + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the + user is adding or editing a Search in Chromium shortcut[iOS only]."> + Search ${searchPhrase} in Chromium + </message> + <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync."> + Chromium data in your account + </message> + <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only]."> + Allow Chromium to use Google Maps to give you directions and local info on detected addresses. + </message> + <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen."> + Chromium will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button"> + To disable Lockdown Mode in Chromium turn it off on your iPad. + </message> + <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button"> + To disable Lockdown Mode in Chromium turn it off on your iPhone. + </message> + <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]"> + When you're signed in to Chromium, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]"> + Chromium is Signed Out + </message> + <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]"> + Your family member can't receive passwords right now. Ask them to update Chromium and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> + </message> + <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]"> + Your password wasn't shared. Check your internet connection and make sure you're signed in to Chromium. Then, try again. + </message> + <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO."> + Your organization turned off the ability to use and save Chromium data in your Google Account. New bookmarks, passwords, and more will be saved only to this device. + </message> + <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]"> + This address is currently saved to Chromium. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. + </message> + <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility."> + You can open links in Chromium automatically by making it your Default Browser App. + </message> + <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app"> + Open Chromium Settings + </message> + <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser."> + 1. Open Chromium Settings + </message> + <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser."> + 3. Select Chromium + </message> + <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc = "Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo."> + To send this tab to another device, sign in to Chromium on both devices. + </message> + <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc = "Text shown when a user with no available target devices attempts to use send-tab-to-self."> + To send this tab to another device, sign in to Chromium there. + </message> + <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]"> + Open the Chromium Menu + </message> + <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]"> + Use Chromium By Default + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE" desc="Use Chrome By Default subtitle displayed in What's New. [iOS only]"> + You can now use Chromium anytime you browse or tap links in messages, documents, and other apps. + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of Passwords In Other Apps in What's New. [iOS only]"> + Select Chromium + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]"> + Use Chromium Actions on iOS + </message> + <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]"> + Signed in to Chromium + </message> + <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]"> + Passphrase encryption doesn’t include payment methods and addresses from Google Pay. + +To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]"> + Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chromium won’t sync. + +Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase."> + Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. + +Your data is encrypted with your passphrase. Enter it to use and save Chromium data in your Google Account. + </message> + <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase."> + Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. + +Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chromium data in your Google Account. + </message> + <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]"> + If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Share Chromium + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Chromium for iOS + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Download Chromium here. + </message> + <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]"> + Finish what you were doing in your other open Chromium window. + </message> + <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen"> + {count, plural, + =1 {Now showing 1 Chromium window} + other {Now showing {count} Chromium windows}} + </message> + <message name="IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE" desc="Title of a section in a table view to inform users about a chrome tip."> + Chromium Tip + </message> + <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]"> + Chromium Actions + </message> + <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> + Chromium is out of date, update to the latest version to stay secure. + </message> + <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> + Your Chromium is out of date. + </message> + <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3" desc="Third step of the instructions for the Password Manager widget's installation."> + In the Search Widgets box, enter Chromium + </message> </messages> </release> </grit>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 similarity index 100% rename from ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 rename to ios/chrome/app/strings/ios_chromium_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index 5fe299d..33e1056 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -881,6 +881,173 @@ <message name="IDS_IOS_SETTINGS_SAFETY_CHECK_MAGIC_STACK_PAGE_HEADER" desc="Informational header at the top of the safety check page when opened via the Magic Stack"> Chrome automatically runs Safety Check every day to keep you safe from data breaches, unsafe websites and more. You can find more about Safety Check in Settings. </message> + <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser."> + Set Chrome as Default Browser + </message> + <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only]."> + This will be used to create events in your Apple Calendar from Chrome and Google Lens. + </message> + <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]"> + To personalize your Discover feed and Chrome, turn on sync. + </message> + <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list."> + Visit a site and click Follow in the Chrome menu + </message> + <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]"> + Chrome will detect package tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. + </message> + <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]"> + Open in Chrome Incognito + </message> + <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]"> + Open in Chrome + </message> + <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only]."> + Open URLs in Chrome in Incognito + </message> + <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only]."> + Opens the inputted URLs in Google Chrome in Incognito. + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only]."> + Start a search in a new Chrome tab. + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only]."> + Search in Chrome + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> + Search in Chrome + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> + Search in Chrome + </message> + <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the + user is adding or editing a Search in Chrome shortcut[iOS only]."> + Search ${searchPhrase} in Chrome + </message> + <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync."> + Chrome data in your account + </message> + <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only]."> + Allow Chrome to use Google Maps to give you directions and local info on detected addresses. + </message> + <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen."> + Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your data will be shared with Google to provide this feature and to improve Shopping for everyone. You can change this in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button"> + To disable Lockdown Mode in Chrome turn it off on your iPad. + </message> + <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button"> + To disable Lockdown Mode in Chrome turn it off on your iPhone. + </message> + <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]"> + When you're signed in to Chrome, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]"> + Chrome is Signed Out + </message> + <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]"> + Your family member can't receive passwords right now. Ask them to update Chrome and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> + </message> + <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]"> + Your password wasn't shared. Check your internet connection and make sure you're signed in to Chrome. Then, try again. + </message> + <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO."> + Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device. + </message> + <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]"> + This address is currently saved to Chrome. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. + </message> + <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility."> + You can open links in Chrome automatically by making it your Default Browser App. + </message> + <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app"> + Open Chrome Settings + </message> + <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser."> + 1. Open Chrome Settings + </message> + <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser."> + 3. Select Chrome + </message> + <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc = "Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo."> + To send this tab to another device, sign in to Chrome on both devices. + </message> + <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc = "Text shown when a user with no available target devices attempts to use send-tab-to-self."> + To send this tab to another device, sign in to Chrome there. + </message> + <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]"> + Open the Chrome Menu + </message> + <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]"> + Use Chrome By Default + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE" desc="Use Chrome By Default subtitle displayed in What's New. [iOS only]"> + You can now use Chrome anytime you browse or tap links in messages, documents, and other apps. + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of Passwords In Other Apps in What's New. [iOS only]"> + Select Chrome + </message> + <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]"> + Use Chrome Actions on iOS + </message> + <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]"> + Signed in to Chrome + </message> + <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]"> + Passphrase encryption doesn’t include payment methods and addresses from Google Pay. + +To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]"> + Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chrome won’t sync. + +Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase."> + Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. + +Your data is encrypted with your passphrase. Enter it to use and save Chrome data in your Google Account. + </message> + <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase."> + Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. + +Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chrome data in your Google Account. + </message> + <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]"> + If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Share Chrome + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Chrome for iOS + </message> + <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> + Download Chrome here. + </message> + <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]"> + Finish what you were doing in your other open Chrome window. + </message> + <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen"> + {count, plural, + =1 {Now showing 1 Chrome window} + other {Now showing {count} Chrome windows}} + </message> + <message name="IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE" desc="Title of a section in a table view to inform users about a chrome tip."> + Chrome Tip + </message> + <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]"> + Chrome Actions + </message> + <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> + Chrome is out of date, update to the latest version to stay secure. + </message> + <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> + Your Chrome is out of date. + </message> + <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3" desc="Third step of the instructions for the Password Manager widget's installation."> + In the Search Widgets box, enter Chrome + </message> </messages> </release> </grit>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CALENDARS_USAGE_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1 new file mode 100644 index 0000000..f3ff016 --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER.png.sha1
@@ -0,0 +1 @@ +600bbf6af9eb92ac99ab27fd9f906296f1e9a995 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_MINI_MAP_CONSENT_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1 new file mode 100644 index 0000000..188cf4e5 --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +07e14b36db360bacac24f323dc17dc882de5a639 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_HEADER_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SETTINGS_SELECT_CHROME_STEP.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_SYNC_PASSPHRASE_RECOVER.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 similarity index 100% copy from ios/chrome/app/strings/ios_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1 copy to ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL.png.sha1
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 4502813..5284efa8 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -263,9 +263,6 @@ <message name="IDS_IOS_APPLICATION_SHORTCUT_VOICE_SEARCH_TITLE" desc="Message when opening a Voice Search from springboard force touch static shortcuts. [Length: unlimited] [iOS only]." meaning="3D Touch entry to trigger a voice search."> Voice Search </message> - <message name="IDS_IOS_APPLICATION_SHORTCUT_SET_DEFAULT_BROWSER" desc="The title of the spotlight item to set Chrome as a default browser. [Length: unlimited] [iOS only]." meaning="Spotlight item title for setting default browser."> - Set Chrome as Default Browser - </message> <message name="IDS_IOS_APP_LAUNCHER_OPEN_APP_BUTTON_LABEL" desc="Label of a button to open an application. [Length: 10em] [iOS only]"> Open </message> @@ -723,9 +720,6 @@ =1 {Bookmark saved in your Google Account, {email}.} other {Bookmarks saved in your Google Account, {email}.}} </message> - <message name="IDS_IOS_CALENDARS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's calendar while the app is in use [Length: unlimited] [iOS only]."> - This will be used to create events in your Apple Calendar from Chrome and Google Lens. - </message> <message name="IDS_IOS_CONTACTS_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's contacts while the app is in use [Length: unlimited] [iOS only]."> This will be used to show you possible invitees to your event. </message> @@ -1224,9 +1218,6 @@ <message name="IDS_IOS_FEED_CARD_SIGN_IN_ONLY_PROMO_LABEL" desc="This string is on a promo intended to promote signing in to Chrome with the user's Google Account. It appears at the bottom of the Discover news feed on the New Tab Page when the user is not signed in. It explains that the user can sign in to see content suggestions related to their existing content interests and preferences. [iOS only]."> Manage your interests and preferences. </message> - <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_DESC" desc="Description of the feed card sync half sheet. [iOS only]"> - To personalize your Discover feed and Chrome, turn on sync. - </message> <message name="IDS_IOS_FEED_CARD_SYNC_HALF_SHEET_TITLE" desc="Title of the feed card sync half sheet. [iOS only]"> Turn on sync to manage the content you see </message> @@ -1302,9 +1293,6 @@ <message name="IDS_IOS_FOLLOW_WHILE_BROWSING_IPH" desc="The text of the while browsing follow IPH."> To see updates from this site, follow it here. </message> - <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TEXT" desc="The text of an empty following list."> - Visit a site and click Follow in the Chrome menu - </message> <message name="IDS_IOS_FOLLOW_MANAGEMENT_EMPTY_TITLE" desc="The title of an empty following list."> You'll find your followed sites here </message> @@ -1434,9 +1422,6 @@ <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_NEVER" desc="Parcel tracking feature option to never auto-track for all detected packages. [iOS only]"> Never Auto-Detect Packages </message> - <message name="IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTO_TRACK_PACKAGES_FOOTER" desc="Parcel tracking feature setting page footer detailing how the data is shared. [iOS only]"> - Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your shopping data will be sent to Google to provide this feature and to improve Google Shopping for everyone. - </message> <message name="IDS_IOS_GOOGLE_SYNC_SETTINGS_TITLE" desc="Title for the view in the Settings for enabling/disabling Sync. [Length: 26em] [iOS only]"> Sync </message> @@ -1618,12 +1603,6 @@ <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_URL_READ_MORE_BUTTON" desc="Button to unfold a URL which is being truncated, so as to let the user read more of the URL. [iOS only]"> more </message> - <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME_INCOGNITO" desc="Button to open a link from an external app in Incognito mode rather than a regular tab. [iOS only]"> - Open in Chrome Incognito - </message> - <message name="IDS_IOS_INCOGNITO_INTERSTITIAL_OPEN_IN_CHROME" desc="Button to open a link from an external app in a regular tab rather than in Incognito mode. [iOS only]"> - Open in Chrome - </message> <message name="IDS_IOS_INCOGNITO_REAUTH_SYSTEM_DIALOG_REASON" desc="Text for system biometric authentication dialog to explain why authentication is required when the user attempts to authenticate to access Incognito tabs. [iOS only]"> Use <ph name="BIOMETRIC_AUTHENITCATION_TYPE">$1<ex>Face ID</ex></ph> to unlock your Incognito tabs. </message> @@ -1702,31 +1681,9 @@ <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts.app format for displaying the URL input [iOS only]."> Open ${url} </message> - <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_TITLE" desc="Shortcut name to open URL in Chrome in Incognito [iOS only]."> - Open URLs in Chrome in Incognito - </message> - <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_DESCRIPTION" desc="Shortcut description to open URLs in Chrome in Incognito [iOS only]."> - Opens the inputted URLs in Google Chrome in Incognito. - </message> <message name="IDS_IOS_INTENTS_OPEN_IN_CHROME_INCOGNITO_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts.app format for displaying the URL input [iOS only]."> Open ${url} in Incognito </message> - <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_DESCRIPTION" desc="Siri Shortcut for search in chrome description [iOS only]."> - Start a search in a new Chrome tab. - </message> - <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_INVOCATION_PHRASE" desc="Siri Shortcut, spoken suggestion for search in chrome [iOS only]."> - Search in Chrome - </message> - <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> - Search in Chrome - </message> - <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_SUGGEST_TITLE" desc="Siri Shortcut for search in chrome title [iOS only]."> - Search in Chrome - </message> - <message name="IDS_IOS_INTENTS_SEARCH_IN_CHROME_PARAMETER_COMBINATION_TITLE" desc="Apple Shortcuts App's format for displaying the user search phrase input, shown by the Siri Shortcut app when the - user is adding or editing a Search in Chrome shortcut[iOS only]."> - Search ${searchPhrase} in Chrome - </message> <message name="IDS_IOS_INTENTS_URL_PARAMETER" desc="The URL the user would like to pass as input parameter to Shortcuts that require a URL as input [iOS only]."> URL </message> @@ -1877,9 +1834,6 @@ <message name="IDS_IOS_REMOVE_ACTION_TITLE" desc="Title of the action used to remove a selected item. [iOS only]"> Remove </message> - <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_TITLE" desc="Title for the cell to open 'Review data in your account' web page where the user can control all their data data from sync."> - Chrome data in your account - </message> <message name="IDS_IOS_MANAGE_DATA_IN_YOUR_ACCOUNT_DESCRIPTION" desc="Subtitle for the cell to open 'Data from Chromium sync' web page where the user can control all their data data from sync."> Review your account data </message> @@ -1988,9 +1942,6 @@ <message name="IDS_IOS_MINI_MAP_CONSENT_MORE" desc="The text of the button to show more text of the consent [iOS only]."> More </message> - <message name="IDS_IOS_MINI_MAP_CONSENT_SUBTITLE" desc="The subtitle of the consent screen for mini map [iOS only]."> - Allow Chrome to use Google Maps to give you directions and local info on detected addresses. - </message> <message name="IDS_IOS_MINI_MAP_CONSENT_TITLE" desc="The title of the consent screen for mini map [iOS only]."> Address Found </message> @@ -2320,9 +2271,6 @@ <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SECONDARY_ACTION" desc="Text for the secondary action string of the parcel tracking opt-in half-sheet screen."> No Thanks </message> - <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_SUBTITLE" desc="Text for the subtitle string of the parcel tracking opt-in half-sheet screen."> - Chrome will detect tracking numbers on sites you visit and show you package updates on the New Tab page. Your shopping data will be sent to Google to provide this feature and to improve Google Shopping for everyone. You can update this anytime in <ph name="BEGIN_LINK">BEGIN_LINK</ph>Package Tracking Settings<ph name="END_LINK">END_LINK</ph>. - </message> <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TERTIARY_ACTION" desc="Text for the tertiary action string of the parcel tracking opt-in half-sheet screen."> Ask Me Every Time </message> @@ -2518,13 +2466,6 @@ <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_TITLE" desc="Title for Lockdown Mode."> This setting is enabled on your device </message> - - <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPAD" desc="iPad summary for lockdown mode info button"> - To disable Lockdown Mode in Chrome turn it off on your iPad. - </message> - <message name="IDS_IOS_LOCKDOWN_MODE_INFO_BUTTON_SUMMARY_FOR_IPHONE" desc="iPhone summary for lockdown mode info button"> - To disable Lockdown Mode in Chrome turn it off on your iPhone. - </message> <message name="IDS_IOS_LOCKDOWN_MODE_FOOTER" desc="Title for Lockdown Mode."> When turned on, certain web technologies are blocked, which might cause some websites to load more slowly or not operate correctly. </message> @@ -2645,9 +2586,6 @@ <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_TITLE" desc="Title of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]"> Passwords on All Your Devices </message> - <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_SUBTITLE" desc="Subtitle of the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]"> - When you're signed in to Chrome, passwords you save will go in your Google Account. To turn this off, <ph name="BEGIN_LINK">BEGIN_LINK</ph>go to settings<ph name="END_LINK">END_LINK</ph>. - </message> <message name="IDS_IOS_PASSWORDS_ACCOUNT_STORAGE_NOTICE_BUTTON_TEXT" desc="Button text for the sheet that notifies the user they are saving passwords to their Google Account. [Length: unlimited] [iOS only]"> Got It </message> @@ -2848,9 +2786,6 @@ <message name="IDS_IOS_POST_RESTORE_SIGN_IN_FULLSCREEN_NOTE_IPAD" desc="Text above the action buttons of the fullscreen post-restore sign-in promo. [iOS only]"> You were signed out as part of your iPad reset. Tap continue below to sign in. </message> - <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE" desc="The title text of the alert post restore sign-in promo. [iOS only]"> - Chrome is Signed Out - </message> <message name="IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_MESSAGE_IPHONE" desc="The message text of the alert post restore sign-in promo. [iOS only]"> You were signed out of your account, <ph name="USER_NAME">$1<ex>example@gmail.com</ex></ph>, as part of your iPhone reset. To sign back in, tap "Continue" below. </message> @@ -3280,18 +3215,12 @@ <message name="IDS_IOS_PASSWORD_SHARING_CANCELLED_TITLE" desc="Title text on the sharing status view when the sharing was cancelled. [iOS only]"> Password Was Not Shared </message> - <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_MEMBER_INELIGIBLE" desc="Info text in the recipient picker view of the password sharing flow explaining why one of the family members is not eligible to be a recipient. [iOS Only]"> - Your family member can't receive passwords right now. Ask them to update Chrome and sync their passwords. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> - </message> <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_BACK_BUTTON" desc="Button text for the navigation back action in the family picker view in the password sharing flow. [iOS only]"> Back </message> <message name="IDS_IOS_PASSWORD_SHARING_FAMILY_PICKER_SUBTITLE" desc="Header text in the view that allows to choose recipients for password sharing from a list of family members explaining what happens when the user shares their password with them. [iOS Only]"> When you share a copy of your username and password, your family member can fill them using Google Password Manager. </message> - <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR" desc="Description on the alert view explaining an error in the password sharing flow. [iOS only]"> - Your password wasn't shared. Check your internet connection and make sure you're signed in to Chrome. Then, try again. - </message> <message name="IDS_IOS_PASSWORD_SHARING_FETCHING_RECIPIENTS_ERROR_TITLE" desc="Title text on the alert view explaining an error in the password sharing flow. [iOS only]"> Something Went Wrong </message> @@ -3491,9 +3420,6 @@ <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE" desc="Message displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]"> Your organization turned off sync. You can still see your bookmarks, history, passwords and other settings on this device. If you make changes, they won’t sync to your account. </message> - <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO."> - Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device. - </message> <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE" desc="Title displayed in a prompt when sync is disabled due to an enterprise policy. [iOS only]"> Sync has Been Turned Off </message> @@ -3524,9 +3450,6 @@ <message name="IDS_IOS_SETTINGS_AUTOFILL_ACCOUNT_ADDRESS_FOOTER_TEXT" desc="Footer text of an account address profile when it is viewed in settings. [iOS only]"> You can use saved addresses across Google products. This address is saved in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. </message> - <message name="IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER" desc="Footer text shown in the address migration prompt to account. [iOS only]"> - This address is currently saved to Chrome. To use it across Google products, save it in your Google Account, <ph name="USER_EMAIL">$1<ex>janedoe@google.com</ex></ph>. - </message> <message name="IDS_IOS_SETTINGS_EDIT_AUTOFILL_ADDRESS_REQUIREMENT_ERROR" desc="Error shown when the address is edited in settings and one of the required fields is empty. [iOS only]"> {count, plural, =1 {A required field is empty. Fill it before saving.} @@ -3564,27 +3487,15 @@ <message name="IDS_IOS_SETTINGS_EXPORT_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to export the passwords, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]"> To export passwords, you must first set a passcode on your device. </message> - <message name="IDS_IOS_SETTINGS_HEADER_TEXT" desc="Header of the Default Browser Settings page explaining the default browser feature's utility."> - You can open links in Chrome automatically by making it your Default Browser App. - </message> <message name="IDS_IOS_SETTINGS_FOLLOW_STEPS_BELOW_TEXT" desc="The prompt under the Default Browser Settings page's header text."> Follow the steps below: </message> - <message name="IDS_IOS_SETTINGS_OPEN_CHROME_SETTINGS_BUTTON_TEXT" desc="Label of the button that opens the Chrome panel in Settings.app"> - Open Chrome Settings - </message> - <message name="IDS_IOS_SETTINGS_OPEN_SETTINGS_STEP" desc="Text of the row indicating the first step of setting the default browser."> - 1. Open Chrome Settings - </message> <message name="IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER" desc="Label of the row that opens the Default Browser Settings page"> Default Browser </message> <message name="IDS_IOS_SETTINGS_TAP_DEFAULT_BROWSER_APP_STEP" desc="Text of the row indicating the second step of setting the default browser."> 2. Tap Default Browser App </message> - <message name="IDS_IOS_SETTINGS_SELECT_CHROME_STEP" desc="Text of the row indicating the third step of setting the default browser."> - 3. Select Chrome - </message> <message name="IDS_IOS_SAVE_PASSWORDS_MANAGE_ACCOUNT_HEADER" desc="Header text with link for the view in Settings for managing saved passwords. [Length: unlimited] [iOS only]"> Create, save, and manage your passwords so you can easily sign in to sites and apps. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> </message> @@ -4052,12 +3963,6 @@ <message name="IDS_IOS_SHARE_MENU_SEND_TAB_TO_SELF_ACTION" desc="Text label to the Send Tab To Self action in the extension menu that sends the current tab to the user's other devices. This is Title Case. [iOS only]" meaning="Action from the displayed menu after the user tap on the share button. In Title Case."> Send to Your Devices </message> - <message name="IDS_SEND_TAB_TO_SELF_SIGN_IN_PROMO_LABEL" desc = "Text when a signed out user attempts to use send-tab-to-self, then sees a sign-in promo."> - To send this tab to another device, sign in to Chrome on both devices. - </message> - <message name="IDS_SEND_TAB_TO_SELF_NO_TARGET_DEVICE_LABEL" desc = "Text shown when a user with no available target devices attempts to use send-tab-to-self."> - To send this tab to another device, sign in to Chrome there. - </message> <message name="IDS_IOS_SHARE_PAGE_BUTTON_LABEL" desc="Label of a button which will initiate a share flow for the current page. [iOS only]"> Share Page... </message> @@ -4208,18 +4113,9 @@ <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE" desc="New Menu subtitle displayed in What's New. [iOS only]"> Now your saved bookmarks, passwords and more are at the top. </message> - <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1" desc="Text of the row indicating the first step of New Menu in What's New. [iOS only]"> - Open the Chrome Menu - </message> <message name="IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2" desc="Text of the row indicating the second step of New Menu in What's New. [iOS only]"> Explore the options in the menu bar </message> - <message name="IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE" desc="Use Chrome By Default title displayed in What's New. [iOS only]"> - Use Chrome By Default - </message> - <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE" desc="Use Chrome By Default subtitle displayed in What's New. [iOS only]"> - You can now use Chrome anytime you browse or tap links in messages, documents, and other apps. - </message> <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1" desc="Text of the row indicating the first step of Use Chrome By Default in What's New. [iOS only]"> Open Settings </message> @@ -4241,9 +4137,6 @@ <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2_IOS16" desc="Text of the row indicating the first step of shortened instruction of of turning on iOS auto-fill from Chrome password manager on iOS 16 and above [iOS only]"> Turn on AutoFill Passwords </message> - <message name="IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2" desc="Text of the row indicating the second step of Passwords In Other Apps in What's New. [iOS only]"> - Select Chrome - </message> <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_TITLE" desc="Open in incognito tabs from other apps title displayed in What's New. [iOS only]"> Open links from other apps in Incognito </message> @@ -4262,9 +4155,6 @@ <message name="IDS_IOS_WHATS_NEW_INCOGNITO_TABS_FROM_OTHER_APPS_STEP_3" desc="Text of the row indicating the third step of opening in incognito tabs from other apps. [iOS only]"> Turn on "Ask to Open Links from Other Apps in Incognito." </message> - <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_TITLE" desc="Chrome Actions title displayed in What's New. [iOS only]"> - Use Chrome Actions on iOS - </message> <message name="IDS_IOS_WHATS_NEW_CHROME_ACTIONS_SUBTITLE" desc="Chrome Actions subtitle displayed in What's New. [iOS only]"> Shortcuts to quickly modify settings and use features from the address bar. </message> @@ -4382,9 +4272,6 @@ <message name="IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_MESSAGE" desc="Alert message to display an error after a reauthentication, related to IDS_IOS_SIGN_TRUSTED_VAULT_ERROR_DIALOG_TITLE [iOS only]"> Error code: <ph name="ERROR_CODE">$1<ex>2</ex></ph> </message> - <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE" desc="Notification title for the user's signed-in state [iOS only]"> - Signed in to Chrome - </message> <message name="IDS_IOS_SIGNIN_ACCOUNT_NOTIFICATION_TITLE_WITH_USERNAME" desc="Notification title for the user's signed-in state that includes the user's full name [iOS only]"> Signed in as <ph name="USER">$1<ex>Jane Doe</ex></ph> </message> @@ -4466,16 +4353,6 @@ <message name="IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION" desc="The short description to display when the user need to enter its sync passphrase. [Length: 60em] [iOS only]"> Passphrase required </message> - <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_HINT" desc="The information text on how to reset encryption passphrase for sync, shown on the sync encryption settings [Length: 300em] [iOS only]"> - Passphrase encryption doesn’t include payment methods and addresses from Google Pay. - -To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. - </message> - <message name="IDS_IOS_NEW_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]"> - Payment methods and addresses from Google Pay won’t be encrypted. Browsing history from Chrome won’t sync. - -Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. - </message> <message name="IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON" desc="Button title displayed when the signed in user needs to reauthenticate. Syncing of encrypted types (e.g. passwords) is blocked until the user completes the reauth flow."> Verify It's You </message> @@ -4485,16 +4362,6 @@ <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BUTTON" desc="Button title displayed when the signed in user needs to enter its sync passphrase. [Length: 20em] [iOS only]"> Enter Passphrase </message> - <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase."> - Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. - -Your data is encrypted with your passphrase. Enter it to use and save Chrome data in your Google Account. - </message> - <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL_AND_DATE" desc="Instructions for the dialog where the user enters the passphrase."> - Signed in as <ph name="EMAIL">$1<ex>johndoe@gmail.com</ex></ph>. - -Your data was encrypted with your passphrase on <ph name="TIME">$2<ex>Sept 1, 2012</ex></ph>. Enter it to use and save Chrome data in your Google Account. - </message> <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_TITLE" desc="Title for the dialog where the user enters the passphrase."> Enter Passphrase </message> @@ -4531,9 +4398,6 @@ <message name="IDS_IOS_SYNC_PASSPHRASE_ENCRYPTING" desc="The title for the passphrase page while it is encrypting. [Length: 21em] [iOS only]"> Encrypting… </message> - <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]"> - If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. - </message> <message name="IDS_IOS_SYNC_PASSWORDS_ERROR_TITLE" desc="Title of the error message shown for sync errors when it affects passwords only. [iOS only]"> Password Sync Isn't Working </message> @@ -4982,15 +4846,6 @@ <message name="IDS_IOS_OVERFLOW_MENU_HIDE_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a shown item." meaning="[In Title case] [iOS only]"> Hides this item </message> - <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME" desc="The iOS menu item for opening a share sheet with the URL to the Chrome app in the iOS app store" meaning="[In Title case] [iOS only] [Length: Unlimited]"> - Share Chrome - </message> - <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_TITLE" desc="The title displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> - Chrome for iOS - </message> - <message name="IDS_IOS_OVERFLOW_MENU_SHARE_CHROME_DESC" desc="The description displayed along with the app store link to Chrome, when sharing the chrome app" meaning="[In Title case] [iOS only] [Length: Unlimited]"> - Download Chrome here. - </message> <message name="IDS_IOS_OVERFLOW_MENU_SHOW_ITEM_ACCESSIBILITY_HINT" desc="Accessibility hint telling users what will happen if they take action on a hidden item." meaning="[In Title case] [iOS only]"> Shows this item </message> @@ -5333,9 +5188,6 @@ <message name="IDS_IOS_SHARE_LINK_TO_TEXT" desc="Option that appears in the iOS Edit Menu when highlighting text (alongside options like Copy, Paste, and Share). When selected, this generates a special URL that will open the current page and jump to/highlight the user's current selection. The user will then have the chance to share this special URL through the normal iOS sharing menu."> Create Link </message> - <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_DESCRIPTION" desc="Explanatory text that appears when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used. [iOS only]"> - Finish what you were doing in your other open Chrome window. - </message> <message name="IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_SWITCH_WINDOW_ACTION" desc="Button label that appears on a button to switch to some other window, when the user has multiple windows open, and one window is showing a dialog that has to be interacted with before any other window can be used."> Switch to Open Window </message> @@ -5354,11 +5206,6 @@ =1 {{domain} and 1 other} other {{domain} and {count} others}} </message> - <message name="IDS_IOS_WINDOW_COUNT_CHANGE" is_accessibility_with_no_ui="true" desc="VoiceOver text spoken when the count of visible windows changes -- note: this text is only spoken, never displayed on screen"> - {count, plural, - =1 {Now showing 1 Chrome window} - other {Now showing {count} Chrome windows}} - </message> <message name="IDS_IOS_WHATS_NEW_TITLE" desc="Title of the What's new Feature"> What's New </message> @@ -5374,9 +5221,6 @@ <message name="IDS_IOS_WHATS_NEW_LEARN_MORE_ACTION_TITLE" desc="Label of the button for users to learn more about a feature or a chrome tip."> Learn More </message> - <message name="IDS_IOS_WHATS_NEW_SECTION_CHROME_TIP_TITLE" desc="Title of a section in a table view to inform users about a chrome tip."> - Chrome Tip - </message> <message name="IDS_IOS_WHATS_NEW_SECTION_NEW_TITLE" desc="Title of a section in a table view to inform users about new features."> New </message> @@ -5529,9 +5373,6 @@ <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_BUTTON_LABEL" desc="The label of the verify your account action button in the identity error info bar. [iOS only]"> Verify </message> - <message name="IDS_IOS_SPOTLIGHT_CHROME_ACTIONS_LABEL" desc="Tag label title displayed for chrome actions spotlight items. [iOS only]"> - Chrome Actions - </message> <message name="IDS_IOS_SPOTLIGHT_OPEN_TAB_LABEL" desc="Tag label title displayed for opent tabs spotlight items. [iOS only]"> Open Tab </message> @@ -5568,12 +5409,6 @@ <message name="IDS_IOS_SAFETY_CHECK_TITLE_UPDATE_CHROME" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> Update Your Browser </message> - <message name="IDS_IOS_SAFETY_CHECK_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> - Chrome is out of date, update to the latest version to stay secure. - </message> - <message name="IDS_IOS_SAFETY_CHECK_COMPACT_DESCRIPTION_UPDATE_CHROME" desc="Tag label description displayed for the Safety Check module in the Magic Stack when the Update Chrome check finds an issue. [iOS only]"> - Your Chrome is out of date. - </message> <message name="IDS_IOS_SAFETY_CHECK_TITLE_PASSWORD" desc="Tag label title displayed for the Safety Check module in the Magic Stack when the Password check finds an issue. [iOS only]"> Change Your Passwords </message> @@ -5688,9 +5523,6 @@ <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_2" desc="Second step of the instructions for the Password Manager widget's installation."> At the top of the screen, tap + </message> - <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_3" desc="Third step of the instructions for the Password Manager widget's installation."> - In the Search Widgets box, enter Chrome - </message> <message name="IDS_IOS_WIDGET_PROMO_INSTRUCTIONS_STEP_4" desc="Fourth step of the instructions for the Password Manager widget's installation."> Select Password Manager, then tap Add Widget </message>
diff --git a/ios/chrome/browser/accessibility/model/window_accessibility_change_notifier_app_agent.mm b/ios/chrome/browser/accessibility/model/window_accessibility_change_notifier_app_agent.mm index 89ed536e..c7f9088 100644 --- a/ios/chrome/browser/accessibility/model/window_accessibility_change_notifier_app_agent.mm +++ b/ios/chrome/browser/accessibility/model/window_accessibility_change_notifier_app_agent.mm
@@ -10,7 +10,7 @@ #import "base/strings/sys_string_conversions.h" #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" -#import "ios/chrome/grit/ios_strings.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ui/base/l10n/l10n_util.h" #import "ui/base/resource/resource_bundle.h"
diff --git a/ios/chrome/browser/browser_state/model/BUILD.gn b/ios/chrome/browser/browser_state/model/BUILD.gn index 1fae421..c6d1d3c 100644 --- a/ios/chrome/browser/browser_state/model/BUILD.gn +++ b/ios/chrome/browser/browser_state/model/BUILD.gn
@@ -87,6 +87,7 @@ "//ios/chrome/browser/dom_distiller/model", "//ios/chrome/browser/download/model", "//ios/chrome/browser/download/model/background_service", + "//ios/chrome/browser/drive/model:drive_service_factory", "//ios/chrome/browser/enterprise/model/idle", "//ios/chrome/browser/favicon", "//ios/chrome/browser/feature_engagement/model", @@ -126,6 +127,7 @@ "//ios/chrome/browser/shared/model/prefs:browser_prefs", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/url:constants", + "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/signin/model", "//ios/chrome/browser/signin/model:system_identity", "//ios/chrome/browser/signin/model:trusted_vault_factory",
diff --git a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm index 4576875..15f5b09 100644 --- a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
@@ -27,6 +27,7 @@ #import "ios/chrome/browser/dom_distiller/model/dom_distiller_service_factory.h" #import "ios/chrome/browser/download/model/background_service/background_download_service_factory.h" #import "ios/chrome/browser/download/model/browser_download_service_factory.h" +#import "ios/chrome/browser/drive/model/drive_service_factory.h" #import "ios/chrome/browser/enterprise/model/idle/idle_service_factory.h" #import "ios/chrome/browser/favicon/favicon_service_factory.h" #import "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h" @@ -70,6 +71,7 @@ #import "ios/chrome/browser/segmentation_platform/model/segmentation_platform_service_factory.h" #import "ios/chrome/browser/sessions/session_restoration_service_factory.h" #import "ios/chrome/browser/shared/model/browser/browser_list_factory.h" +#import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/signin/model/about_signin_internals_factory.h" #import "ios/chrome/browser/signin/model/account_consistency_service_factory.h" #import "ios/chrome/browser/signin/model/account_reconcilor_factory.h" @@ -177,6 +179,9 @@ OptimizationGuideServiceFactory::GetInstance(); policy::UserPolicySigninServiceFactory::GetInstance(); PhotosServiceFactory::GetInstance(); + if (base::FeatureList::IsEnabled(kIOSSaveToDrive)) { + drive::DriveServiceFactory::GetInstance(); + } TabsSearchServiceFactory::GetInstance(); PushNotificationBrowserStateServiceFactory::GetInstance(); SyncServiceFactory::GetInstance();
diff --git a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h index c79b3e5..9157250 100644 --- a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h +++ b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h
@@ -30,8 +30,7 @@ class ShoppingService; } // namespace commerce -class CommercePushNotificationClient - : public OptimizationGuidePushNotificationClient { +class CommercePushNotificationClient : public PushNotificationClient { public: CommercePushNotificationClient(); ~CommercePushNotificationClient() override; @@ -44,6 +43,21 @@ NSArray<UNNotificationCategory*>* RegisterActionableNotifications() override; void OnSceneActiveForegroundBrowserReady() override; + // Convert escaped serialized payload from push notification into + // optimization_guide::proto::HintNotificationPayload. + static std::unique_ptr<optimization_guide::proto::HintNotificationPayload> + ParseHintNotificationPayload(NSString* serialized_payload_escaped); + + // Allows tests to set the last used ChromeBrowserState returned in + // GetLastUsedBrowserState(). + void SetLastUsedChromeBrowserStateForTesting( + ChromeBrowserState* chrome_browser_state) { + last_used_browser_state_for_testing_ = chrome_browser_state; + } + + protected: + ChromeBrowserState* GetLastUsedBrowserState(); + private: friend class ::CommercePushNotificationClientTest; @@ -61,5 +75,9 @@ NSString* action_identifier, NSDictionary* user_info, base::RunLoop* on_complete_for_testing = nil); + + // Allows tests to override the last used ChromeBrowserState returned in + // GetLastUsedBrowserState(). + ChromeBrowserState* last_used_browser_state_for_testing_ = nullptr; }; #endif // IOS_CHROME_BROWSER_COMMERCE_MODEL_PUSH_NOTIFICATION_COMMERCE_PUSH_NOTIFICATION_CLIENT_H_
diff --git a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm index 6967640..8ae52163 100644 --- a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm +++ b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm
@@ -4,9 +4,11 @@ #import "ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h" +#import "base/base64.h" #import "base/metrics/histogram_functions.h" #import "base/metrics/user_metrics.h" #import "base/run_loop.h" +#import "base/strings/sys_string_conversions.h" #import "components/bookmarks/browser/bookmark_model.h" #import "components/bookmarks/browser/bookmark_node.h" #import "components/commerce/core/price_tracking_utils.h" @@ -15,6 +17,7 @@ #import "ios/chrome/browser/bookmarks/model/local_or_syncable_bookmark_model_factory.h" #import "ios/chrome/browser/push_notification/model/push_notification_client_id.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" +#import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser/browser_list.h" #import "ios/chrome/browser/shared/model/browser/browser_list_factory.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" @@ -46,11 +49,32 @@ } // namespace CommercePushNotificationClient::CommercePushNotificationClient() - : OptimizationGuidePushNotificationClient( - PushNotificationClientId::kCommerce) {} + : PushNotificationClient(PushNotificationClientId::kCommerce) {} CommercePushNotificationClient::~CommercePushNotificationClient() = default; +// static +std::unique_ptr<optimization_guide::proto::HintNotificationPayload> +CommercePushNotificationClient::ParseHintNotificationPayload( + NSString* serialized_payload_escaped) { + std::string serialized_payload_unescaped; + if (!base::Base64Decode(base::SysNSStringToUTF8(serialized_payload_escaped), + &serialized_payload_unescaped)) { + return nullptr; + } + optimization_guide::proto::Any any; + if (!any.ParseFromString(serialized_payload_unescaped) || !any.has_value()) { + return nullptr; + } + std::unique_ptr<optimization_guide::proto::HintNotificationPayload> + hint_notification_payload = std::make_unique< + optimization_guide::proto::HintNotificationPayload>(); + if (!hint_notification_payload->ParseFromString(any.value())) { + return nullptr; + } + return hint_notification_payload; +} + void CommercePushNotificationClient::HandleNotificationInteraction( UNNotificationResponse* notification_response) { NSDictionary* user_info = @@ -131,7 +155,7 @@ base::RunLoop* on_complete_for_testing) { std::unique_ptr<optimization_guide::proto::HintNotificationPayload> hint_notification_payload = - OptimizationGuidePushNotificationClient::ParseHintNotificationPayload( + CommercePushNotificationClient::ParseHintNotificationPayload( [user_info objectForKey:kSerializedPayloadKey]); if (!hint_notification_payload) { return; @@ -196,3 +220,12 @@ })); } } + +ChromeBrowserState* CommercePushNotificationClient::GetLastUsedBrowserState() { + if (last_used_browser_state_for_testing_) { + return last_used_browser_state_for_testing_; + } + return GetApplicationContext() + ->GetChromeBrowserStateManager() + ->GetLastUsedBrowserState(); +}
diff --git a/ios/chrome/browser/drive/model/BUILD.gn b/ios/chrome/browser/drive/model/BUILD.gn index 441232d..f28fd10 100644 --- a/ios/chrome/browser/drive/model/BUILD.gn +++ b/ios/chrome/browser/drive/model/BUILD.gn
@@ -8,6 +8,7 @@ "drive_availability.mm", ] deps = [ + ":drive_service", "//components/signin/public/base", "//components/signin/public/identity_manager", "//ios/chrome/browser/shared/model/browser_state", @@ -26,3 +27,28 @@ "//ios/chrome/browser/shared/model/browser_state", ] } + +source_set("drive_service_factory") { + sources = [ + "drive_service_factory.h", + "drive_service_factory.mm", + ] + deps = [ + ":drive_service", + "//base", + "//components/keyed_service/ios", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/public/provider/chrome/browser/drive:drive_api", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "drive_service_factory_unittest.mm" ] + deps = [ + ":drive_service_factory", + "//base/test:test_support", + "//ios/chrome/browser/shared/model/browser_state:test_support", + "//testing/gtest", + ] +}
diff --git a/ios/chrome/browser/drive/model/drive_availability.h b/ios/chrome/browser/drive/model/drive_availability.h index 360dc935..fa50fb78 100644 --- a/ios/chrome/browser/drive/model/drive_availability.h +++ b/ios/chrome/browser/drive/model/drive_availability.h
@@ -11,9 +11,12 @@ namespace drive { +class DriveService; + // Returns whether the Save to Drive entry point can be presented. bool IsSaveToDriveAvailable(bool is_incognito, - signin::IdentityManager* identity_manager); + signin::IdentityManager* identity_manager, + drive::DriveService* drive_service); } // namespace drive
diff --git a/ios/chrome/browser/drive/model/drive_availability.mm b/ios/chrome/browser/drive/model/drive_availability.mm index 409afca..64e6928b 100644 --- a/ios/chrome/browser/drive/model/drive_availability.mm +++ b/ios/chrome/browser/drive/model/drive_availability.mm
@@ -5,18 +5,25 @@ #import "ios/chrome/browser/drive/model/drive_availability.h" #import "components/signin/public/identity_manager/identity_manager.h" +#import "ios/chrome/browser/drive/model/drive_service.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/public/features/features.h" namespace drive { bool IsSaveToDriveAvailable(bool is_incognito, - signin::IdentityManager* identity_manager) { + signin::IdentityManager* identity_manager, + drive::DriveService* drive_service) { // Check flag. if (!base::FeatureList::IsEnabled(kIOSSaveToDrive)) { return false; } + // Check if DriveService is supported. + if (!drive_service || !drive_service->IsSupported()) { + return false; + } + // TODO(crbug.com/1497976): Check policy. // Check incognito.
diff --git a/ios/chrome/browser/drive/model/drive_service_factory.h b/ios/chrome/browser/drive/model/drive_service_factory.h new file mode 100644 index 0000000..54daf362 --- /dev/null +++ b/ios/chrome/browser/drive/model/drive_service_factory.h
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_SERVICE_FACTORY_H_ + +#import <memory> + +#import "base/no_destructor.h" +#import "components/keyed_service/ios/browser_state_keyed_service_factory.h" + +class ChromeBrowserState; + +namespace drive { + +class DriveService; + +// Singleton that owns all instances of DriveService and associates them with +// instances of ChromeBrowserState. +class DriveServiceFactory final : public BrowserStateKeyedServiceFactory { + public: + static DriveService* GetForBrowserState(ChromeBrowserState* browser_state); + static DriveServiceFactory* GetInstance(); + + private: + friend class base::NoDestructor<DriveServiceFactory>; + + DriveServiceFactory(); + ~DriveServiceFactory() override; + + // BrowserStateKeyedServiceFactory implementation. + std::unique_ptr<KeyedService> BuildServiceInstanceFor( + web::BrowserState* context) const override; + web::BrowserState* GetBrowserStateToUse( + web::BrowserState* context) const override; +}; + +} // namespace drive + +#endif // IOS_CHROME_BROWSER_DRIVE_MODEL_DRIVE_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/drive/model/drive_service_factory.mm b/ios/chrome/browser/drive/model/drive_service_factory.mm new file mode 100644 index 0000000..803bb71 --- /dev/null +++ b/ios/chrome/browser/drive/model/drive_service_factory.mm
@@ -0,0 +1,47 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/drive/model/drive_service_factory.h" + +#import "components/keyed_service/ios/browser_state_dependency_manager.h" +#import "ios/chrome/browser/drive/model/drive_service.h" +#import "ios/chrome/browser/drive/model/drive_service_configuration.h" +#import "ios/chrome/browser/shared/model/browser_state/browser_state_otr_helper.h" +#import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" +#import "ios/public/provider/chrome/browser/drive/drive_api.h" + +namespace drive { + +// static +DriveService* DriveServiceFactory::GetForBrowserState( + ChromeBrowserState* browser_state) { + return static_cast<DriveService*>( + GetInstance()->GetServiceForBrowserState(browser_state, true)); +} + +// static +DriveServiceFactory* DriveServiceFactory::GetInstance() { + static base::NoDestructor<DriveServiceFactory> instance; + return instance.get(); +} + +DriveServiceFactory::DriveServiceFactory() + : BrowserStateKeyedServiceFactory( + "DriveService", + BrowserStateDependencyManager::GetInstance()) {} + +DriveServiceFactory::~DriveServiceFactory() = default; + +std::unique_ptr<KeyedService> DriveServiceFactory::BuildServiceInstanceFor( + web::BrowserState* context) const { + drive::DriveServiceConfiguration configuration{}; + return ios::provider::CreateDriveService(configuration); +} + +web::BrowserState* DriveServiceFactory::GetBrowserStateToUse( + web::BrowserState* context) const { + return GetBrowserStateRedirectedInIncognito(context); +} + +} // namespace drive
diff --git a/ios/chrome/browser/drive/model/drive_service_factory_unittest.mm b/ios/chrome/browser/drive/model/drive_service_factory_unittest.mm new file mode 100644 index 0000000..ec65950 --- /dev/null +++ b/ios/chrome/browser/drive/model/drive_service_factory_unittest.mm
@@ -0,0 +1,30 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/drive/model/drive_service_factory.h" + +#import "base/test/task_environment.h" +#import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" +#import "testing/platform_test.h" + +class DriveServiceFactoryTest : public PlatformTest { + protected: + DriveServiceFactoryTest() + : browser_state_(TestChromeBrowserState::Builder().Build()) {} + + base::test::TaskEnvironment task_environment_; + std::unique_ptr<ChromeBrowserState> browser_state_; +}; + +// Checks that the same instance is returned for on-the-record and +// off-the-record browser states. +TEST_F(DriveServiceFactoryTest, BrowserStateRedirectedInIncognito) { + drive::DriveService* on_the_record_service = + drive::DriveServiceFactory::GetForBrowserState(browser_state_.get()); + drive::DriveService* off_the_record_service = + drive::DriveServiceFactory::GetForBrowserState( + browser_state_->GetOffTheRecordChromeBrowserState()); + EXPECT_TRUE(on_the_record_service != nullptr); + EXPECT_EQ(on_the_record_service, off_the_record_service); +}
diff --git a/ios/chrome/browser/metrics/model/demographics_egtest.mm b/ios/chrome/browser/metrics/model/demographics_egtest.mm index ddf960a..5c74124 100644 --- a/ios/chrome/browser/metrics/model/demographics_egtest.mm +++ b/ios/chrome/browser/metrics/model/demographics_egtest.mm
@@ -187,14 +187,6 @@ GREYAssertTrue([MetricsAppInterface UKMReportHasBirthYear:birthYear_ gender:kTestGender], @"The report should contain the specified user demographics"); - - const int success = - static_cast<int>(metrics::UserDemographicsStatus::kSuccess); - GREYAssertNil([MetricsAppInterface - expectUniqueSampleWithCount:1 - forBucket:success - forHistogram:@"UKM.UserDemographics.Status"], - @"Unexpected histogram contents"); } // Tests that user demographics are neither recorded by UKM nor logged in @@ -217,9 +209,6 @@ GREYAssertFalse([MetricsAppInterface UKMReportHasUserDemographics], @"The report should not contain user demographics."); - GREYAssertNil([MetricsAppInterface expectSum:0 - forHistogram:@"UKM.UserDemographics.Status"], - @"Unexpected histogram contents."); } // Tests that user demographics are synced, recorded by UMA, and logged in
diff --git a/ios/chrome/browser/optimization_guide/model/optimization_guide_push_notification_client.h b/ios/chrome/browser/optimization_guide/model/optimization_guide_push_notification_client.h index 79e11cb..c4cc1b8 100644 --- a/ios/chrome/browser/optimization_guide/model/optimization_guide_push_notification_client.h +++ b/ios/chrome/browser/optimization_guide/model/optimization_guide_push_notification_client.h
@@ -14,6 +14,8 @@ // Abstract class to be inherited from by push notification clients which // utilize the OptimizationGuide push notification infrastructure. +// TODO(b/315149599): Remove this client and migrate any tests that are not +// already covered by Commerce client tests. class OptimizationGuidePushNotificationClient : public PushNotificationClient { public: OptimizationGuidePushNotificationClient(
diff --git a/ios/chrome/browser/photos/model/BUILD.gn b/ios/chrome/browser/photos/model/BUILD.gn index 0abca14..5475523 100644 --- a/ios/chrome/browser/photos/model/BUILD.gn +++ b/ios/chrome/browser/photos/model/BUILD.gn
@@ -10,6 +10,7 @@ "photos_service_configuration.mm", ] public_deps = [ + ":metrics", "//base", "//components/keyed_service/core", ]
diff --git a/ios/chrome/browser/photos/model/photos_metrics.h b/ios/chrome/browser/photos/model/photos_metrics.h index ef3eed8..186d747 100644 --- a/ios/chrome/browser/photos/model/photos_metrics.h +++ b/ios/chrome/browser/photos/model/photos_metrics.h
@@ -5,15 +5,21 @@ #ifndef IOS_CHROME_BROWSER_PHOTOS_MODEL_PHOTOS_METRICS_H_ #define IOS_CHROME_BROWSER_PHOTOS_MODEL_PHOTOS_METRICS_H_ +#import <Foundation/Foundation.h> + // UMA histogram names. extern const char kSaveToPhotosActionsHistogram[]; extern const char kSaveToPhotosAccountPickerActionsHistogram[]; extern const char kSaveToPhotosContextMenuActionsHistogram[]; extern const char kSaveToPhotosSettingsActionsHistogram[]; +extern const char kSaveToPhotosUploadSuccessLatencyHistogram[]; +extern const char kSaveToPhotosUploadFailureLatencyHistogram[]; +extern const char kSaveToPhotosUploadFailureTypeHistogram[]; // Enum for the IOS.SaveToPhotos histogram. // Keep in sync with "IOSSaveToPhotosType" -// in src/tools/metrics/histograms/enums.xml. +// in tools/metrics/histograms/metadata/ios/enums.xml. +// LINT.IfChange enum class SaveToPhotosActions { kFailureWebStateDestroyed = 0, kFailureUserSignedOut = 1, @@ -28,10 +34,12 @@ kSuccessAndOpenStoreKitAndAppInstalled = 8, kMaxValue = kSuccessAndOpenStoreKitAndAppInstalled, }; +// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml) // Enum for the IOS.SaveToPhotos.AccountPicker histogram. // Keep in sync with "IOSSaveToPhotosAccountPickerType" -// in src/tools/metrics/histograms/enums.xml. +// in tools/metrics/histograms/metadata/ios/enums.xml. +// LINT.IfChange enum class SaveToPhotosAccountPickerActions { kSkipped = 0, // Account picker not presented because a default account exists @@ -39,10 +47,12 @@ kSelectedIdentity = 2, // User selected an identity in the account picker kMaxValue = kSelectedIdentity, }; +// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml) // Enum for the IOS.SaveToPhotos.ContextMenu histogram. // Keep in sync with "IOSSaveToPhotosContextMenuType" -// in src/tools/metrics/histograms/enums.xml. +// in tools/metrics/histograms/metadata/ios/enums.xml. +// LINT.IfChange enum class SaveToPhotosContextMenuActions { kUnavailableDidSaveImageLocally = 0, // "Save to Google Photos" action was unavailable and the user tapped @@ -55,10 +65,12 @@ // "Save to Google Photos" kMaxValue = kAvailableDidSaveImageToGooglePhotos, }; +// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml) // Enum for the IOS.SaveToPhotos.Settings histogram. // Keep in sync with "IOSSaveToPhotosSettingsType" -// in src/tools/metrics/histograms/enums.xml. +// in tools/metrics/histograms/metadata/ios/enums.xml. +// LINT.IfChange enum class SaveToPhotosSettingsActions { kDefaultAccountNotSet = 0, // User has NOT set a default Save to Photos account and did NOT @@ -77,5 +89,30 @@ // device anymore; the user did opt-in to skip the account picker kMaxValue = kDefaultAccountSetNotValidSkipAccountPicker, }; +// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml) + +// Types of failure which can occur during upload. +// Keep in sync with "IOSPhotosServiceUploadFailureType" +// in tools/metrics/histograms/metadata/ios/enums.xml. +// LINT.IfChange +enum class PhotosServiceUploadFailureType : NSUInteger { + // No failure + kNone = 0, + // There is already an ongoing upload. + kAlreadyUploading = 1, + // An error occurred while trying to retrieve an existing album. + kRetrieveAlbum = 10, + // An error occurred while trying to create a new album. + kCreateAlbum = 20, + // An error occurred during the first step of a photo upload. + kUploadPhoto1 = 30, + kUploadPhoto1NoData = 31, + kUploadPhoto1ContentIsNotText = 32, + kUploadPhoto1TokenIsNil = 33, + // An error occurred during the second step of a photo upload. + kUploadPhoto2 = 40, + kMaxValue = kUploadPhoto2, +}; +// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml) #endif // IOS_CHROME_BROWSER_PHOTOS_MODEL_PHOTOS_METRICS_H_
diff --git a/ios/chrome/browser/photos/model/photos_metrics.mm b/ios/chrome/browser/photos/model/photos_metrics.mm index 0b187af7..0d1cd781 100644 --- a/ios/chrome/browser/photos/model/photos_metrics.mm +++ b/ios/chrome/browser/photos/model/photos_metrics.mm
@@ -14,3 +14,12 @@ const char kSaveToPhotosSettingsActionsHistogram[] = "IOS.SaveToPhotos.Settings"; + +const char kSaveToPhotosUploadSuccessLatencyHistogram[] = + "IOS.SaveToPhotos.UploadSuccessLatency"; + +const char kSaveToPhotosUploadFailureLatencyHistogram[] = + "IOS.SaveToPhotos.UploadFailureLatency"; + +const char kSaveToPhotosUploadFailureTypeHistogram[] = + "IOS.SaveToPhotos.UploadFailureType";
diff --git a/ios/chrome/browser/photos/model/photos_service.h b/ios/chrome/browser/photos/model/photos_service.h index 56e3611e..1b8dd1d34 100644 --- a/ios/chrome/browser/photos/model/photos_service.h +++ b/ios/chrome/browser/photos/model/photos_service.h
@@ -9,6 +9,7 @@ #import "base/functional/callback.h" #import "components/keyed_service/core/keyed_service.h" +#import "ios/chrome/browser/photos/model/photos_metrics.h" @protocol SystemIdentity; @@ -29,6 +30,10 @@ struct UploadResult { // Whether the upload operation is successful. bool successful = false; + // If the upload operation failed, the type of failure. + PhotosServiceUploadFailureType failure_type{}; + // If the upload operation failed, an error object may be provided here. + NSError* error = nil; }; // Callback reporting progress of upload operation.
diff --git a/ios/chrome/browser/sessions/session_migration.mm b/ios/chrome/browser/sessions/session_migration.mm index cee812b..959d2ed 100644 --- a/ios/chrome/browser/sessions/session_migration.mm +++ b/ios/chrome/browser/sessions/session_migration.mm
@@ -6,6 +6,8 @@ #import <Foundation/Foundation.h> +#import <optional> + #import "base/apple/foundation_util.h" #import "base/files/file.h" #import "base/files/file_enumerator.h" @@ -55,7 +57,6 @@ // session_metadata.pb // ${WebStateID}/ // data.pb -// metadata.pb // state.pb // ... // ... @@ -63,10 +64,258 @@ namespace ios::sessions { namespace { -// Directory containing WebState session for `identifier` relative to `path`. -base::FilePath OptimizedWebStateDirectory(const base::FilePath& path, - web::WebStateID identifier) { - return path.Append(base::StringPrintf("%08x", identifier.identifier())); +// Helper class used to simplify the conversion of session between legacy +// and optimised format. +class OptimizedSession { + public: + // Creates an instance from `legacy_session` in legacy format. + static std::optional<OptimizedSession> FromLegacy( + SessionWindowIOS* legacy_session); + + // Creates an instance loading a session in optimized format from + // `session_dir`. + static std::optional<OptimizedSession> FromPath( + const base::FilePath& session_dir); + + // Converts the session to legacy format. + SessionWindowIOS* ToLegacy() const; + + // Saves the session in optimised format at `session_dir`. The native + // WKWebView session data can be found in `web_sessions`. + bool SaveTo(const base::FilePath& session_dir, + const base::FilePath& web_sessions) const; + + private: + OptimizedSession(ios::proto::WebStateListStorage metadata_storage, + std::vector<web::proto::WebStateStorage> storage); + + explicit OptimizedSession(SessionWindowIOS* legacy_session); + + // Helper adding an item to the current object from its legacy + // representation in `item`. + void AddItem(CRWSessionStorage* item); + + ios::proto::WebStateListStorage metadata_storage_; + std::vector<web::proto::WebStateStorage> storage_; +}; + +// static +std::optional<OptimizedSession> OptimizedSession::FromLegacy( + SessionWindowIOS* legacy_session) { + return OptimizedSession(legacy_session); +} + +// static +std::optional<OptimizedSession> OptimizedSession::FromPath( + const base::FilePath& session_dir) { + const base::FilePath session_path = + session_dir.Append(kSessionMetadataFilename); + + ios::proto::WebStateListStorage metadata_storage; + if (!ParseProto(session_path, metadata_storage)) { + return std::nullopt; + } + + const int count = metadata_storage.items_size(); + std::vector<web::proto::WebStateStorage> storage; + storage.reserve(count); + + for (int index = 0; index < count; ++index) { + const ios::proto::WebStateListItemStorage& item_storage = + metadata_storage.items(index); + + const base::FilePath item_dir = session_dir.Append( + base::StringPrintf("%08x", item_storage.identifier())); + + // While developing the optimised session storage, at some point, the + // metadata for WebStates were saved in individual files. As all those + // metadata files had to be loaded on startup, this resulted in many + // file loads for users with a large number of tabs. This code is here + // to convert those sessions to the new storage. + // + // Since saving in many individual files was never released to stable, + // nor enabled via finch, the only users that manually enabled it via + // chrome://flags may have the data in that state. + // + // Thus there is no need to keep this code for many releases (as the + // feature was not yet supported when enabled). This workaround can + // be removed as soon as M-123. + // + // TODO(crbug.com/1504753): cleanup when no longer required. + if (!item_storage.has_metadata()) { + const base::FilePath item_metadata_path = + item_dir.Append(kWebStateMetadataStorageFilename); + + google::protobuf::RepeatedPtrField<ios::proto::WebStateListItemStorage>& + repeated_field = *metadata_storage.mutable_items(); + + web::proto::WebStateMetadataStorage& item_metadata = + *(repeated_field[index].mutable_metadata()); + + if (!ParseProto(item_metadata_path, item_metadata)) { + return std::nullopt; + } + } + + const base::FilePath item_path = item_dir.Append(kWebStateStorageFilename); + if (!ParseProto(item_path, storage.emplace_back())) { + return std::nullopt; + } + } + + return OptimizedSession(std::move(metadata_storage), std::move(storage)); +} + +SessionWindowIOS* OptimizedSession::ToLegacy() const { + DCHECK_EQ(metadata_storage_.items_size(), static_cast<int>(storage_.size())); + const int count = metadata_storage_.items_size(); + const int pinned_count = metadata_storage_.pinned_item_count(); + + NSMutableArray<CRWSessionStorage*>* items = [[NSMutableArray alloc] init]; + for (int index = 0; index < count; ++index) { + const ios::proto::WebStateListItemStorage& item_storage = + metadata_storage_.items(index); + + web::proto::WebStateStorage item_data_storage = storage_[index]; + *item_data_storage.mutable_metadata() = item_storage.metadata(); + + const web::WebStateID identifier = + web::WebStateID::FromSerializedValue(item_storage.identifier()); + + CRWSessionStorage* item = + [[CRWSessionStorage alloc] initWithProto:item_data_storage + uniqueIdentifier:identifier + stableIdentifier:[[NSUUID UUID] UUIDString]]; + + if (index < pinned_count || item_storage.has_opener()) { + CRWSessionUserData* user_data = [[CRWSessionUserData alloc] init]; + + if (index < pinned_count) { + [user_data setObject:@YES forKey:kLegacyWebStateListPinnedStateKey]; + } + + if (item_storage.has_opener()) { + const ios::proto::OpenerStorage& opener_storage = item_storage.opener(); + [user_data setObject:@(opener_storage.index()) + forKey:kLegacyWebStateListOpenerIndexKey]; + [user_data setObject:@(opener_storage.navigation_index()) + forKey:kLegacyWebStateListOpenerNavigationIndexKey]; + } + + item.userData = user_data; + } + + [items addObject:item]; + } + + NSUInteger selected_index = NSNotFound; + const int active_index = metadata_storage_.active_index(); + if (0 <= active_index && active_index < count) { + selected_index = static_cast<NSUInteger>(active_index); + } + + return [[SessionWindowIOS alloc] initWithSessions:items + selectedIndex:selected_index]; +} + +bool OptimizedSession::SaveTo(const base::FilePath& session_dir, + const base::FilePath& web_sessions) const { + DCHECK_EQ(metadata_storage_.items_size(), static_cast<int>(storage_.size())); + const int count = metadata_storage_.items_size(); + + // First write the individual WebState's data. + for (int index = 0; index < count; ++index) { + const ios::proto::WebStateListItemStorage& item_storage = + metadata_storage_.items(index); + + const base::FilePath item_dir = session_dir.Append( + base::StringPrintf("%08x", item_storage.identifier())); + + const base::FilePath item_path = item_dir.Append(kWebStateStorageFilename); + + // Save the WebState data. + if (!WriteProto(item_path, storage_[index])) { + return false; + } + + const base::FilePath item_native_data_path = web_sessions.Append( + base::StringPrintf("%08u", item_storage.identifier())); + + // Copy the WebState WKWebView native data if it exists. It is okay if + // the copy fails, since loading the sessions accepts their absence. + if (FileExists(item_native_data_path)) { + std::ignore = ios::sessions::CopyFile( + item_native_data_path, item_dir.Append(kWebStateSessionFilename)); + } + } + + const base::FilePath session_path = + session_dir.Append(kSessionMetadataFilename); + + // Save the session metadata. + if (!WriteProto(session_path, metadata_storage_)) { + return false; + } + + return true; +} + +OptimizedSession::OptimizedSession( + ios::proto::WebStateListStorage metadata_storage, + std::vector<web::proto::WebStateStorage> storage) + : metadata_storage_(std::move(metadata_storage)), + storage_(std::move(storage)) {} + +OptimizedSession::OptimizedSession(SessionWindowIOS* legacy_session) { + metadata_storage_.set_active_index(legacy_session.selectedIndex); + for (CRWSessionStorage* legacy_item in legacy_session.sessions) { + AddItem(legacy_item); + } +} + +void OptimizedSession::AddItem(CRWSessionStorage* legacy_item) { + ios::proto::WebStateListItemStorage& item = *metadata_storage_.add_items(); + item.set_identifier(legacy_item.uniqueIdentifier.identifier()); + + // Serialize the item to protobuf message format, and move the metadata + // to the WebStateListStorage (since is is where the optimised format + // stores the WebState's metadata). + [legacy_item serializeToProto:storage_.emplace_back()]; + DCHECK(storage_.back().has_metadata()); + + std::unique_ptr<web::proto::WebStateMetadataStorage> item_metadata( + storage_.back().release_metadata()); + DCHECK(!storage_.back().has_metadata()); + + item_metadata->Swap(item.mutable_metadata()); + DCHECK(item.has_metadata()); + + // The legacy format stores some WebStateList metadata in `item`. + CRWSessionUserData* user_data = legacy_item.userData; + if (user_data) { + NSNumber* opener_index = base::apple::ObjCCast<NSNumber>( + [user_data objectForKey:kLegacyWebStateListOpenerIndexKey]); + NSNumber* opener_navigation_index = base::apple::ObjCCast<NSNumber>( + [user_data objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]); + + if (opener_index && opener_navigation_index) { + ios::proto::OpenerStorage& opener_storage = *item.mutable_opener(); + opener_storage.set_index([opener_index intValue]); + opener_storage.set_navigation_index([opener_navigation_index intValue]); + } + + NSNumber* is_pinned = base::apple::ObjCCast<NSNumber>( + [user_data objectForKey:kLegacyWebStateListPinnedStateKey]); + if (is_pinned && [is_pinned boolValue]) { + metadata_storage_.set_pinned_item_count( + metadata_storage_.pinned_item_count() + 1); + } + } + + // Check the class invariants. + DCHECK_EQ(metadata_storage_.items_size(), static_cast<int>(storage_.size())); + DCHECK_LE(metadata_storage_.pinned_item_count(), + metadata_storage_.items_size()); } // Name of the web session file for `identifier` relative to `path`. @@ -75,99 +324,6 @@ return path.Append(base::StringPrintf("%08u", identifier.identifier())); } -// Writes `session` in optimized format to `path` and returns whether the -// operation was a success. -[[nodiscard]] bool WriteSessionStorageOptimized(const base::FilePath& path, - CRWSessionStorage* session) { - // Convert `session` to proto. - web::proto::WebStateStorage storage; - [session serializeToProto:storage]; - - // Write the metadata first. - if (!WriteProto(path.Append(kWebStateMetadataStorageFilename), - storage.metadata())) { - return false; - } - - // Clear the metadata from `storage` and save the data. This is how the - // optimised file format save `data` and `metadata` in two separate files. - storage.clear_metadata(); - return WriteProto(path.Append(kWebStateStorageFilename), storage); -} - -// Loads optimized WebState's state from `path` and converts it to -// CRWSessionStorage*. -[[nodiscard]] CRWSessionStorage* LoadSessionStorageFromOptimized( - const base::FilePath& path, - web::WebStateID web_state_id) { - // Load the data and metadata. - web::proto::WebStateStorage storage; - if (!ParseProto(path.Append(kWebStateStorageFilename), storage)) { - return nil; - } - - if (!ParseProto(path.Append(kWebStateMetadataStorageFilename), - *storage.mutable_metadata())) { - return nil; - } - - return [[CRWSessionStorage alloc] initWithProto:storage - uniqueIdentifier:web_state_id - stableIdentifier:[[NSUUID UUID] UUIDString]]; -} - -// Loads optimized session from `path` and converts it to SessionWindowIOS. -[[nodiscard]] SessionWindowIOS* LoadSessionWindowFromOptimized( - const base::FilePath& path) { - // Load the optimized session metadata. - ios::proto::WebStateListStorage storage; - if (!ParseProto(path.Append(kSessionMetadataFilename), storage)) { - return nil; - } - - // Capture the number of pinned tabs and allocate array to store the tabs. - const int32_t pinned_items = storage.pinned_item_count(); - NSMutableArray<CRWSessionStorage*>* sessions = [[NSMutableArray alloc] init]; - - // Load all the individual tabs' state. - for (const auto& item : storage.items()) { - const int32_t index = static_cast<int32_t>(sessions.count); - const auto ident = web::WebStateID::FromSerializedValue(item.identifier()); - const base::FilePath item_dir = OptimizedWebStateDirectory(path, ident); - - CRWSessionStorage* session = - LoadSessionStorageFromOptimized(item_dir, ident); - if (!session) { - return nil; - } - - CRWSessionUserData* user_data = nil; - if (item.has_opener() || index < pinned_items) { - user_data = [[CRWSessionUserData alloc] init]; - if (item.has_opener()) { - const ios::proto::OpenerStorage& opener = item.opener(); - [user_data setObject:@(opener.index()) - forKey:kLegacyWebStateListOpenerIndexKey]; - [user_data setObject:@(opener.navigation_index()) - forKey:kLegacyWebStateListOpenerNavigationIndexKey]; - } - if (index < pinned_items) { - [user_data setObject:@YES forKey:kLegacyWebStateListPinnedStateKey]; - } - } - - session.userData = user_data; - session.uniqueIdentifier = ident; - [sessions addObject:session]; - } - - const NSUInteger selected_index = - storage.active_index() != -1 ? storage.active_index() : NSNotFound; - - return [[SessionWindowIOS alloc] initWithSessions:sessions - selectedIndex:selected_index]; -} - // Deletes data for a legacy session. Ignores errors. Used for cleanup. void DeleteLegacySession(const base::FilePath& path, const base::FilePath& web_sessions, @@ -229,8 +385,8 @@ return MigrationResult{.status = Status::kSkipped}; } - static MigrationResult Success() { - return MigrationResult{.status = Status::kSuccess}; + static MigrationResult Success(NSArray<CRWSessionStorage*>* sessions) { + return MigrationResult{.status = Status::kSuccess, .sessions = sessions}; } static MigrationResult Failure(NSArray<CRWSessionStorage*>* sessions) { @@ -245,81 +401,26 @@ const base::FilePath& from, const base::FilePath& dest, const base::FilePath& web_sessions) { - const base::FilePath session_path = from.Append(kLegacySessionFilename); - if (!FileExists(session_path)) { + const base::FilePath legacy_path = from.Append(kLegacySessionFilename); + if (!FileExists(legacy_path)) { return MigrationResult::Skipped(); } - SessionWindowIOS* session = ReadSessionWindow(session_path); - if (!session) { + SessionWindowIOS* legacy = ReadSessionWindow(legacy_path); + if (!legacy) { // Can't load session. Can't migrate it, nor record the tabs as closed. // Delete the session, so that we don't try to convert it anymore. return MigrationResult::Failure(nil); } - for (CRWSessionStorage* item in session.sessions) { - // Write the item in optimized format. - const base::FilePath item_path = - OptimizedWebStateDirectory(dest, item.uniqueIdentifier); - if (!WriteSessionStorageOptimized(item_path, item)) { - return MigrationResult::Failure(session.sessions); - } + std::optional<OptimizedSession> optimized = + OptimizedSession::FromLegacy(legacy); + + if (!optimized || !optimized->SaveTo(dest, web_sessions)) { + return MigrationResult::Failure(legacy.sessions); } - // Migrate the storage for the WebStateList. - ios::proto::WebStateListStorage storage; - storage.set_active_index(session.selectedIndex); - for (CRWSessionStorage* item in session.sessions) { - ios::proto::WebStateListItemStorage& item_storage = *storage.add_items(); - item_storage.set_identifier(item.uniqueIdentifier.identifier()); - - // The legacy format stores some WebStateList metadata in the items. - // Restore it from there and populate the information in `storage`. - CRWSessionUserData* user_data = item.userData; - if (user_data) { - NSNumber* opener_index = base::apple::ObjCCast<NSNumber>( - [user_data objectForKey:kLegacyWebStateListOpenerIndexKey]); - NSNumber* opener_navigation_index = base::apple::ObjCCast<NSNumber>( - [user_data objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]); - - if (opener_index && opener_navigation_index) { - ios::proto::OpenerStorage& opener_storage = - *item_storage.mutable_opener(); - opener_storage.set_index([opener_index intValue]); - opener_storage.set_navigation_index([opener_navigation_index intValue]); - } - - NSNumber* is_pinned = base::apple::ObjCCast<NSNumber>( - [user_data objectForKey:kLegacyWebStateListPinnedStateKey]); - if (is_pinned && [is_pinned boolValue]) { - storage.set_pinned_item_count(storage.pinned_item_count() + 1); - } - } - } - - // Write the session metadata. - const base::FilePath metadata_path = dest.Append(kSessionMetadataFilename); - if (!WriteProto(metadata_path, storage)) { - return MigrationResult::Failure(session.sessions); - } - - // Migrate the web session files if possible. - for (CRWSessionStorage* item in session.sessions) { - const base::FilePath web_session_from_path = - LegacyWebSessionFilename(web_sessions, item.uniqueIdentifier); - if (!FileExists(web_session_from_path)) { - continue; - } - - // Rename the web session file (failure is okay, the code can load - // the session even if the file is missing). - const base::FilePath web_session_dest_path = - OptimizedWebStateDirectory(dest, item.uniqueIdentifier) - .Append(kWebStateSessionFilename); - std::ignore = RenameFile(web_session_from_path, web_session_dest_path); - } - - return MigrationResult::Success(); + return MigrationResult::Success(legacy.sessions); } // Migrates session stored in `from` in optimized format to `dest` in legacy @@ -334,36 +435,38 @@ return MigrationResult::Skipped(); } - // Load the optimized session and convert it in memory to the legacy format. - SessionWindowIOS* session = LoadSessionWindowFromOptimized(from); - if (!session) { - // Can't load session. Can't migrate it, nor record the tabs as closed. - // Delete the session, so that we don't try to convert it anymore. + std::optional<OptimizedSession> optimized = OptimizedSession::FromPath(from); + if (!optimized) { return MigrationResult::Failure(nil); } + SessionWindowIOS* legacy = optimized->ToLegacy(); + DCHECK(legacy); + // Write the legacy session to destination. - if (!WriteSessionWindow(dest.Append(kLegacySessionFilename), session)) { - return MigrationResult::Failure(session.sessions); + if (!WriteSessionWindow(dest.Append(kLegacySessionFilename), legacy)) { + return MigrationResult::Failure(legacy.sessions); } // Migrate the web session files if possible. - for (CRWSessionStorage* item in session.sessions) { - const base::FilePath web_session_from_path = - OptimizedWebStateDirectory(from, item.uniqueIdentifier) - .Append(kWebStateSessionFilename); - if (!FileExists(web_session_from_path)) { - continue; - } + for (CRWSessionStorage* item in legacy.sessions) { + const base::FilePath item_dir = from.Append( + base::StringPrintf("%08x", item.uniqueIdentifier.identifier())); - // Rename the web session file (failure is okay, the code can load - // the session even if the file is missing). - const base::FilePath web_session_dest_path = - LegacyWebSessionFilename(web_sessions, item.uniqueIdentifier); - std::ignore = RenameFile(web_session_from_path, web_session_dest_path); + const base::FilePath item_native_data_path = + item_dir.Append(kWebStateSessionFilename); + + // Copy the WebState WKWebView native data if it exists. It is okay if + // the copy fails, since loading the sessions accepts their absence. + if (FileExists(item_native_data_path)) { + std::ignore = ios::sessions::CopyFile( + item_native_data_path, + web_sessions.Append( + base::StringPrintf("%08u", item.uniqueIdentifier.identifier()))); + } } - return MigrationResult::Success(); + return MigrationResult::Success(legacy.sessions); } // Migrates session stored in `from` in legacy format to `dest` in optimized
diff --git a/ios/chrome/browser/sessions/session_migration_unittest.mm b/ios/chrome/browser/sessions/session_migration_unittest.mm index d5c7d68..6368e894 100644 --- a/ios/chrome/browser/sessions/session_migration_unittest.mm +++ b/ios/chrome/browser/sessions/session_migration_unittest.mm
@@ -222,6 +222,62 @@ tab_info.opener_navigation_index); } + // Set the metadata into the WebStateListItemStorage. + *item_storage.mutable_metadata() = CreateWebStateMetadataStorage(); + + // Write the tab data file. + if (!ios::sessions::WriteProto(item_dir.Append(kWebStateStorageFilename), + CreateWebStateStorage())) { + return false; + } + + // Create fake web session data for the tab. As the file contains + // opaque data from WebKit, the migration code does not care about + // the format. + if (tab_info.create_web_session) { + const base::FilePath filename = item_dir.Append(kWebStateSessionFilename); + + NSData* data = [[NSString stringWithFormat:@"data %zu", index] + dataUsingEncoding:NSUTF8StringEncoding]; + if (!ios::sessions::WriteFile(filename, data)) { + return false; + } + } + } + + // Write the session metadata file. + const base::FilePath filename = session_dir.Append(kSessionMetadataFilename); + return ios::sessions::WriteProto(filename, storage); +} + +// Creates an optimized session named `name` following `session_info` and +// writes it to the expected location relative to `root`. It returns +// whether the creation was a success. The format will be pre M-122. +bool GenerateOptimizedSessionPreM122(const base::FilePath& root, + const std::string& name, + SessionInfo session_info) { + const base::FilePath session_dir = GetOptimizedSessionDir(root, name); + + ios::proto::WebStateListStorage storage; + storage.set_active_index(session_info.active_index); + storage.set_pinned_item_count(session_info.pinned_tab_count); + + // Create all the tabs for the session. Note that the WebStateList metadata + // is stored with the tab in the legacy format. + for (size_t index = 0; index < session_info.tabs.size(); ++index) { + const web::WebStateID identifier = web::WebStateID::NewUnique(); + const base::FilePath item_dir = + GetOptimizedWebStateDir(session_dir, identifier); + const TabInfo& tab_info = session_info.tabs[index]; + + ios::proto::WebStateListItemStorage& item_storage = *storage.add_items(); + item_storage.set_identifier(identifier.identifier()); + if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) { + item_storage.mutable_opener()->set_index(tab_info.opener_index); + item_storage.mutable_opener()->set_navigation_index( + tab_info.opener_navigation_index); + } + // Write the tab metadata file. if (!ios::sessions::WriteProto( item_dir.Append(kWebStateMetadataStorageFilename), @@ -315,10 +371,9 @@ const base::FilePath item_dir = GetOptimizedWebStateDir( dest_dir, web::WebStateID::FromSerializedValue(item_info.identifier())); - // Load the tab metadata and check for correctness. - web::proto::WebStateMetadataStorage metadata; - EXPECT_TRUE(ios::sessions::ParseProto( - item_dir.Append(kWebStateMetadataStorageFilename), metadata)); + // Check the tab metadata for correctness. + ASSERT_TRUE(item_info.has_metadata()); + const web::proto::WebStateMetadataStorage& metadata = item_info.metadata(); EXPECT_TRUE(metadata.has_active_page()); EXPECT_EQ(metadata.navigation_item_count(), 1); @@ -563,6 +618,90 @@ } } +// Tests migrating a session from optimize (pre M-122) to legacy works +// correctly. +TEST_F(SessionMigrationTest, ToLegacyPreM122) { + base::ScopedTempDir scoped_temp_dir; + ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); + const base::FilePath root = scoped_temp_dir.GetPath(); + + // Generate an optimized session. + EXPECT_TRUE( + GenerateOptimizedSessionPreM122(root, kSessionName, kSessionInfo)); + + // Ask to migrate the session. + FakeTabRestoreService restore_service; + ios::sessions::MigrateNamedSessionToLegacy(root, kSessionName, + &restore_service); + + // Check that the tabs have not been recorded. + EXPECT_EQ(restore_service.entries().size(), 0u); + + // Check that the optimized session directory was deleted and its parent too + // since it was empty. + const base::FilePath from_dir = GetOptimizedSessionDir(root, kSessionName); + EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir)); + EXPECT_FALSE(ios::sessions::DirectoryExists(from_dir.DirName())); + + // Check that an optimized session was created. + const base::FilePath dest_dir = GetLegacySessionDir(root, kSessionName); + EXPECT_TRUE(ios::sessions::DirectoryExists(dest_dir)); + + // Check that the directory containing the web sessions was also created + // and is not empty. + const base::FilePath web_sessions = root.Append(kLegacyWebSessionsDirname); + EXPECT_TRUE(ios::sessions::DirectoryExists(web_sessions)); + EXPECT_FALSE(ios::sessions::DirectoryEmpty(web_sessions)); + + // Load the session and check that it agress with `kSessionInfo`. + SessionWindowIOS* session_window = + ios::sessions::ReadSessionWindow(dest_dir.Append(kLegacySessionFilename)); + ASSERT_TRUE(session_window); + + EXPECT_EQ(session_window.selectedIndex, kSessionInfo.active_index); + + // Check that the information for each tab is correct. + ASSERT_EQ(session_window.sessions.count, kSessionInfo.tabs.size()); + for (size_t index = 0; index < kSessionInfo.tabs.size(); ++index) { + CRWSessionStorage* session = session_window.sessions[index]; + const TabInfo& tab_info = kSessionInfo.tabs[index]; + + CRWSessionUserData* user_data = session.userData; + if (tab_info.opener_index != -1 && tab_info.opener_navigation_index != -1) { + EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data + objectForKey:kLegacyWebStateListOpenerIndexKey]), + @(tab_info.opener_index)); + EXPECT_NSEQ( + base::apple::ObjCCast<NSNumber>([user_data + objectForKey:kLegacyWebStateListOpenerNavigationIndexKey]), + @(tab_info.opener_navigation_index)); + } + + if (index < kSessionInfo.pinned_tab_count) { + EXPECT_NSEQ(base::apple::ObjCCast<NSNumber>([user_data + objectForKey:kLegacyWebStateListPinnedStateKey]), + @YES); + } + + // Check that a stable identifier was generated (randomized). + EXPECT_TRUE(session.stableIdentifier); + + // Check the data for correctness. + EXPECT_EQ(session.lastCommittedItemIndex, 0); + EXPECT_NE(session.creationTime, base::Time()); + ASSERT_EQ(session.itemStorages.count, 1u); + + CRWNavigationItemStorage* navigation_item = session.itemStorages[0]; + EXPECT_EQ(base::UTF16ToUTF8(navigation_item.title), kPageTitle); + EXPECT_EQ(navigation_item.virtualURL, GURL(kPageURL)); + + // Check that the web session file exists (if created). + EXPECT_EQ(ios::sessions::FileExists(GetLegacyWebSessionsFile( + web_sessions, session.uniqueIdentifier)), + tab_info.create_web_session); + } +} + // Tests migrating a session from optimized to legacy when there is no session. TEST_F(SessionMigrationTest, ToLegacy_NoSession) { base::ScopedTempDir scoped_temp_dir;
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm index 802f388..bba61cc 100644 --- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm +++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -667,6 +667,7 @@ registry->RegisterBooleanPref(prefs::kDetectUnitsEnabled, true); + registry->RegisterTimePref(prefs::kLastSigninTimestamp, base::Time()); registry->RegisterListPref(kSigninLastAccounts); registry->RegisterBooleanPref(kSigninLastAccountsMigrated, false);
diff --git a/ios/chrome/browser/shared/model/prefs/pref_names.cc b/ios/chrome/browser/shared/model/prefs/pref_names.cc index 58a9d917..b839ad2 100644 --- a/ios/chrome/browser/shared/model/prefs/pref_names.cc +++ b/ios/chrome/browser/shared/model/prefs/pref_names.cc
@@ -436,6 +436,14 @@ const char kIncognitoAuthenticationSetting[] = "ios.settings.incognito_authentication_enabled"; +// Timestamp set when a user signs in. It is used for policies that clear data +// on sign-out only for the duration the user was signed in. It is also used for +// user policies that should clear data only from the time of sign-in and not +// for the entire browser. An example of the latter would be when +// `IdleTimeoutActions` policy is set to clear data as a user policy not a +// browser policy. +const char kLastSigninTimestamp[] = "signin.last_signin_timestamp"; + // Integer that represents the value of BrowserSigninPolicy. Values are defined // in ios/chrome/browser/policy/policy_util.h. const char kBrowserSigninPolicy[] = "signin.browser_signin_policy";
diff --git a/ios/chrome/browser/shared/model/prefs/pref_names.h b/ios/chrome/browser/shared/model/prefs/pref_names.h index 75160c1..da94ffd 100644 --- a/ios/chrome/browser/shared/model/prefs/pref_names.h +++ b/ios/chrome/browser/shared/model/prefs/pref_names.h
@@ -116,6 +116,7 @@ extern const char kIncognitoAuthenticationSetting[]; +extern const char kLastSigninTimestamp[]; extern const char kBrowserSigninPolicy[]; extern const char kAllowChromeDataInBackups[];
diff --git a/ios/chrome/browser/shared/public/commands/BUILD.gn b/ios/chrome/browser/shared/public/commands/BUILD.gn index c769a16..6b7fc63 100644 --- a/ios/chrome/browser/shared/public/commands/BUILD.gn +++ b/ios/chrome/browser/shared/public/commands/BUILD.gn
@@ -47,6 +47,7 @@ "reading_list_add_command.mm", "save_image_to_photos_command.h", "save_image_to_photos_command.mm", + "save_to_drive_commands.h", "save_to_photos_commands.h", "search_image_with_lens_command.h", "search_image_with_lens_command.mm", @@ -54,6 +55,8 @@ "share_download_overlay_commands.h", "share_highlight_command.h", "share_highlight_command.mm", + "show_save_to_drive_command.h", + "show_save_to_drive_command.mm", "show_signin_command.h", "show_signin_command.mm", "snackbar_commands.h",
diff --git a/ios/chrome/browser/shared/public/commands/save_to_drive_commands.h b/ios/chrome/browser/shared/public/commands/save_to_drive_commands.h new file mode 100644 index 0000000..8db4e68 --- /dev/null +++ b/ios/chrome/browser/shared/public/commands/save_to_drive_commands.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SAVE_TO_DRIVE_COMMANDS_H_ +#define IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SAVE_TO_DRIVE_COMMANDS_H_ + +@class ShowSaveToDriveCommand; + +// Commands related to Save to Drive. +@protocol SaveToDriveCommands + +// Starts Save to Drive UI. +- (void)showSaveToDrive:(ShowSaveToDriveCommand*)command; + +// Stops Save to Drive UI. +- (void)hideSaveToDrive; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SAVE_TO_DRIVE_COMMANDS_H_
diff --git a/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h b/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h new file mode 100644 index 0000000..f1e9eb39 --- /dev/null +++ b/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SHOW_SAVE_TO_DRIVE_COMMAND_H_ +#define IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SHOW_SAVE_TO_DRIVE_COMMAND_H_ + +#import <Foundation/Foundation.h> + +// Contains the data necessary to show the Save to Drive UI. +@interface ShowSaveToDriveCommand : NSObject + +// The filename of the file to save to Drive. +@property(nonatomic, copy) NSString* fileName; + +// The size of the file to save to Drive, in bytes. If unknown, set to -1. +@property(nonatomic, assign) int64_t fileSize; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_SHOW_SAVE_TO_DRIVE_COMMAND_H_
diff --git a/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.mm b/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.mm new file mode 100644 index 0000000..578a0bf --- /dev/null +++ b/ios/chrome/browser/shared/public/commands/show_save_to_drive_command.mm
@@ -0,0 +1,9 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h" + +@implementation ShowSaveToDriveCommand + +@end
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/BUILD.gn b/ios/chrome/browser/shared/ui/bottom_sheet/BUILD.gn index 6d696df..7995696 100644 --- a/ios/chrome/browser/shared/ui/bottom_sheet/BUILD.gn +++ b/ios/chrome/browser/shared/ui/bottom_sheet/BUILD.gn
@@ -2,10 +2,21 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("bottom_sheet") { +source_set("bottom_sheet_view_controller") { + sources = [ + "bottom_sheet_view_controller.h", + "bottom_sheet_view_controller.mm", + ] + deps = [ "//ios/chrome/common/ui/confirmation_alert" ] +} + +source_set("table_view_bottom_sheet_view_controller") { sources = [ "table_view_bottom_sheet_view_controller.h", "table_view_bottom_sheet_view_controller.mm", ] - deps = [ "//ios/chrome/common/ui/confirmation_alert" ] + deps = [ + ":bottom_sheet_view_controller", + "//ios/chrome/common/ui/confirmation_alert", + ] }
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.h b/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.h new file mode 100644 index 0000000..61be1e6 --- /dev/null +++ b/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.h
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_BOTTOM_SHEET_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_BOTTOM_SHEET_VIEW_CONTROLLER_H_ + +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" + +// A ConfirmationAlertViewController with the bottom sheet presentation style. +// +// The presentationController will be automatically set up on viewDidLoad, and +// changes handled in traitCollectionDidChange:. +// +// Subclasses must call expandBottomSheet when the bottom sheet needs to be +// resized. +@interface BottomSheetViewController : ConfirmationAlertViewController + +// Sets detents based on the result of self.preferredHeightForContent. +- (void)expandBottomSheet; + +// Configures the bottom sheet's presentation controller appearance. +- (void)setUpBottomSheetPresentationController; + +// Configures the bottom sheet's detents. Subclasses that affect +// layout (by adding constraints) after calling [super viewDidLoad] are expected +// to call this in viewDidLoad. +- (void)setUpBottomSheetDetents; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_BOTTOM_SHEET_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.mm b/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.mm new file mode 100644 index 0000000..9875cbe --- /dev/null +++ b/ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.mm
@@ -0,0 +1,131 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.h" + +#import <Foundation/Foundation.h> + +namespace { + +// Custom radius for the half sheet presentation. +CGFloat const kHalfSheetCornerRadius = 20; + +// Custom height for the gradient view of the bottom sheet. +CGFloat const kCustomGradientViewHeight = 30; + +// Custom detent identifier for when the bottom sheet is minimized. +NSString* const kCustomMinimizedDetentIdentifier = @"customMinimizedDetent"; + +// Custom detent identifier for when the bottom sheet is expanded. +NSString* const kCustomExpandedDetentIdentifier = @"customExpandedDetent"; + +} // namespace + +@implementation BottomSheetViewController { +} + +- (void)viewDidLoad { + self.alwaysShowImage = YES; + self.customGradientViewHeight = kCustomGradientViewHeight; + [super viewDidLoad]; + [self displayGradientView:NO]; + [self setUpBottomSheetPresentationController]; + [self setUpBottomSheetDetents]; +} + +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + // Update the custom detent with the correct initial height when trait + // collection changed (for example when the user uses large font). + if (self.traitCollection.preferredContentSizeCategory != + previousTraitCollection.preferredContentSizeCategory) { + UISheetPresentationController* presentationController = + self.sheetPresentationController; + if (@available(iOS 16, *)) { + CGFloat bottomSheetHeight = [self preferredHeightForContent]; + auto resolver = ^CGFloat( + id<UISheetPresentationControllerDetentResolutionContext> context) { + return bottomSheetHeight; + }; + + UISheetPresentationControllerDetent* customDetent = + [UISheetPresentationControllerDetent + customDetentWithIdentifier:kCustomMinimizedDetentIdentifier + resolver:resolver]; + presentationController.detents = @[ customDetent ]; + presentationController.selectedDetentIdentifier = + kCustomMinimizedDetentIdentifier; + } + } +} + +- (void)expandBottomSheet { + UISheetPresentationController* presentationController = + self.sheetPresentationController; + if (@available(iOS 16, *)) { + // Expand to custom size (only available for iOS 16+). + CGFloat fullHeight = [self preferredHeightForContent]; + auto resolver = ^CGFloat( + id<UISheetPresentationControllerDetentResolutionContext> context) { + BOOL tooLarge = (fullHeight > context.maximumDetentValue); + [self displayGradientView:tooLarge]; + return tooLarge ? context.maximumDetentValue : fullHeight; + }; + UISheetPresentationControllerDetent* customDetentExpand = + [UISheetPresentationControllerDetent + customDetentWithIdentifier:kCustomExpandedDetentIdentifier + resolver:resolver]; + NSMutableArray* currentDetents = + [presentationController.detents mutableCopy]; + [currentDetents addObject:customDetentExpand]; + presentationController.detents = currentDetents; + [presentationController animateChanges:^{ + presentationController.selectedDetentIdentifier = + kCustomExpandedDetentIdentifier; + }]; + } else { + // Expand to large detent. + [presentationController animateChanges:^{ + presentationController.selectedDetentIdentifier = + UISheetPresentationControllerDetentIdentifierLarge; + }]; + } +} + +- (void)setUpBottomSheetPresentationController { + self.modalPresentationStyle = UIModalPresentationPageSheet; + UISheetPresentationController* presentationController = + self.sheetPresentationController; + presentationController.prefersEdgeAttachedInCompactHeight = YES; + presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached = YES; + presentationController.preferredCornerRadius = kHalfSheetCornerRadius; +} + +- (void)setUpBottomSheetDetents { + UISheetPresentationController* presentationController = + self.sheetPresentationController; + if (@available(iOS 16, *)) { + CGFloat bottomSheetHeight = [self preferredHeightForContent]; + auto resolver = ^CGFloat( + id<UISheetPresentationControllerDetentResolutionContext> context) { + return bottomSheetHeight; + }; + UISheetPresentationControllerDetent* customDetent = + [UISheetPresentationControllerDetent + customDetentWithIdentifier:kCustomMinimizedDetentIdentifier + resolver:resolver]; + presentationController.detents = @[ customDetent ]; + presentationController.selectedDetentIdentifier = + kCustomMinimizedDetentIdentifier; + } else { + presentationController.detents = @[ + [UISheetPresentationControllerDetent mediumDetent], + [UISheetPresentationControllerDetent largeDetent] + ]; + presentationController.selectedDetentIdentifier = + UISheetPresentationControllerDetentIdentifierMedium; + } +} + +@end
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h index 6d4a940..27a2f9b14 100644 --- a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h +++ b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h
@@ -5,12 +5,12 @@ #ifndef IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_TABLE_VIEW_BOTTOM_SHEET_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_SHARED_UI_BOTTOM_SHEET_TABLE_VIEW_BOTTOM_SHEET_VIEW_CONTROLLER_H_ -#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" +#import "ios/chrome/browser/shared/ui/bottom_sheet/bottom_sheet_view_controller.h" // UI Base class for Bottom Sheets with a table view, such as Password or // Payments bottom sheets. @interface TableViewBottomSheetViewController - : ConfirmationAlertViewController <UITableViewDelegate> + : BottomSheetViewController <UITableViewDelegate> // Creates the table view which will display suggestions on the bottom sheet. - (UITableView*)createTableView;
diff --git a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm index 3ab70a2..e3828e2 100644 --- a/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm +++ b/ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.mm
@@ -8,24 +8,12 @@ namespace { -// Sets a custom radius for the half sheet presentation. -CGFloat const kHalfSheetCornerRadius = 20; - // Estimated row height for each cell in the table view. CGFloat const kTableViewEstimatedRowHeight = 75; // Radius size of the table view. CGFloat const kTableViewCornerRadius = 10; -// Custom height for the gradient view of the bottom sheet. -CGFloat const kCustomGradientViewHeight = 30; - -// Custom detent identifier for when the bottom sheet is minimized. -NSString* const kCustomMinimizedDetentIdentifier = @"customMinimizedDetent"; - -// Custom detent identifier for when the bottom sheet is expanded. -NSString* const kCustomExpandedDetentIdentifier = @"customExpandedDetent"; - } // namespace @interface TableViewBottomSheetViewController () { @@ -56,37 +44,7 @@ } - (void)expand:(NSInteger)numberOfRows { - UISheetPresentationController* presentationController = - self.sheetPresentationController; - if (@available(iOS 16, *)) { - // Expand to custom size (only available for iOS 16+). - CGFloat fullHeight = [self preferredHeightForContent]; - auto resolver = ^CGFloat( - id<UISheetPresentationControllerDetentResolutionContext> context) { - BOOL tooLarge = (fullHeight > context.maximumDetentValue); - [self displayGradientView:tooLarge]; - return tooLarge ? context.maximumDetentValue : fullHeight; - }; - UISheetPresentationControllerDetent* customDetentExpand = - [UISheetPresentationControllerDetent - customDetentWithIdentifier:kCustomExpandedDetentIdentifier - resolver:resolver]; - NSMutableArray* currentDetents = - [presentationController.detents mutableCopy]; - [currentDetents addObject:customDetentExpand]; - presentationController.detents = currentDetents; - [presentationController animateChanges:^{ - presentationController.selectedDetentIdentifier = - kCustomExpandedDetentIdentifier; - }]; - } else { - // Expand to large detent. - [presentationController animateChanges:^{ - presentationController.selectedDetentIdentifier = - UISheetPresentationControllerDetentIdentifierLarge; - }]; - } - + [self expandBottomSheet]; [self selectFirstRow]; } @@ -118,12 +76,10 @@ // Set the properties read by the super when constructing the // views in `-[ConfirmationAlertViewController viewDidLoad]`. self.imageHasFixedSize = YES; - self.alwaysShowImage = YES; self.showsVerticalScrollIndicator = NO; self.showDismissBarButton = NO; self.topAlignedLayout = YES; self.customScrollViewBottomInsets = 0; - self.customGradientViewHeight = kCustomGradientViewHeight; [super viewDidLoad]; @@ -135,33 +91,7 @@ constraintEqualToAnchor:self.primaryActionButton.widthAnchor] .active = YES; - [self setUpBottomSheet]; -} - -- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - // Update the custom detent with the correct initial height when trait - // collection changed (for example when the user uses large font). - if (self.traitCollection.preferredContentSizeCategory != - previousTraitCollection.preferredContentSizeCategory) { - UISheetPresentationController* presentationController = - self.sheetPresentationController; - if (@available(iOS 16, *)) { - CGFloat bottomSheetHeight = [self preferredHeightForContent]; - auto resolver = ^CGFloat( - id<UISheetPresentationControllerDetentResolutionContext> context) { - return bottomSheetHeight; - }; - - UISheetPresentationControllerDetent* customDetent = - [UISheetPresentationControllerDetent - customDetentWithIdentifier:kCustomMinimizedDetentIdentifier - resolver:resolver]; - presentationController.detents = @[ customDetent ]; - presentationController.selectedDetentIdentifier = - kCustomMinimizedDetentIdentifier; - } - } + [self setUpBottomSheetDetents]; } #pragma mark - UITableViewDelegate @@ -196,37 +126,4 @@ return 1; } -#pragma mark - Private - -// Configures the bottom sheet's appearance and detents. -- (void)setUpBottomSheet { - self.modalPresentationStyle = UIModalPresentationPageSheet; - UISheetPresentationController* presentationController = - self.sheetPresentationController; - presentationController.prefersEdgeAttachedInCompactHeight = YES; - presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached = YES; - if (@available(iOS 16, *)) { - CGFloat bottomSheetHeight = [self preferredHeightForContent]; - auto resolver = ^CGFloat( - id<UISheetPresentationControllerDetentResolutionContext> context) { - return bottomSheetHeight; - }; - UISheetPresentationControllerDetent* customDetent = - [UISheetPresentationControllerDetent - customDetentWithIdentifier:kCustomMinimizedDetentIdentifier - resolver:resolver]; - presentationController.detents = @[ customDetent ]; - presentationController.selectedDetentIdentifier = - kCustomMinimizedDetentIdentifier; - } else { - presentationController.detents = @[ - [UISheetPresentationControllerDetent mediumDetent], - [UISheetPresentationControllerDetent largeDetent] - ]; - presentationController.selectedDetentIdentifier = - UISheetPresentationControllerDetentIdentifierMedium; - } - presentationController.preferredCornerRadius = kHalfSheetCornerRadius; -} - @end
diff --git a/ios/chrome/browser/signin/model/authentication_service.mm b/ios/chrome/browser/signin/model/authentication_service.mm index 75c4e4f..60dbfb6 100644 --- a/ios/chrome/browser/signin/model/authentication_service.mm +++ b/ios/chrome/browser/signin/model/authentication_service.mm
@@ -335,6 +335,7 @@ identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin); CHECK(!primary_account.empty()); CHECK_EQ(account_id, primary_account); + pref_service_->SetTime(prefs::kLastSigninTimestamp, base::Time::Now()); crash_keys::SetCurrentlySignedIn(true); }
diff --git a/ios/chrome/browser/signin/model/authentication_service_unittest.mm b/ios/chrome/browser/signin/model/authentication_service_unittest.mm index a1f1241..123d396 100644 --- a/ios/chrome/browser/signin/model/authentication_service_unittest.mm +++ b/ios/chrome/browser/signin/model/authentication_service_unittest.mm
@@ -140,6 +140,12 @@ EXPECT_CALL(*sync_setup_service_mock(), PrepareForFirstSyncSetup).Times(1); } + void VerifyLastSigninTimestamp() { + EXPECT_EQ( + browser_state_.get()->GetPrefs()->GetTime(prefs::kLastSigninTimestamp), + base::Time::Now()); + } + void FireApplicationWillEnterForeground() { authentication_service()->OnApplicationWillEnterForeground(); } @@ -237,7 +243,9 @@ IOSChromeScopedTestingLocalState local_state_; ChromeAccountManagerService* account_manager_; - web::WebTaskEnvironment task_environment_; + web::WebTaskEnvironment task_environment_{ + web::WebTaskEnvironment::Options::DEFAULT, + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; signin::IdentityTestEnvironment identity_test_env_; std::unique_ptr<TestChromeBrowserState> browser_state_; // Used to verify histogram logging. @@ -256,6 +264,7 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_SIGNIN_PROMO); + VerifyLastSigninTimestamp(); EXPECT_NSEQ(identity(0), authentication_service()->GetPrimaryIdentity( signin::ConsentLevel::kSignin)); @@ -293,6 +302,7 @@ identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); authentication_service()->GrantSyncConsent( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); // Set the authentication service as "In Foreground", remove identity and run // the loop. @@ -317,6 +327,7 @@ identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); authentication_service()->GrantSyncConsent( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); // Set the authentication service as "In Background", remove identity and run // the loop. @@ -343,6 +354,7 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); // Set the authentication service as "In Background", remove identity and run // the loop. @@ -371,6 +383,7 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); // Set the authentication service as "In Background", remove identity and run // the loop. @@ -390,6 +403,7 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); fake_system_identity_manager()->AddIdentities(@[ @"foo3" ]); @@ -426,6 +440,7 @@ identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); EXPECT_TRUE(authentication_service()->HasPrimaryIdentity( signin::ConsentLevel::kSignin)); + VerifyLastSigninTimestamp(); // Remove the signed in identity while in background, and check that // HasPrimaryIdentity is up-to-date. @@ -444,6 +459,7 @@ authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 2UL); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(0), CreateRefreshAccessTokenError(identity(0))); @@ -485,6 +501,7 @@ authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 2UL); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(0), CreateRefreshAccessTokenError(identity(0))); authentication_service()->SignOut( @@ -503,6 +520,7 @@ authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 2UL); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(0), CreateRefreshAccessTokenError(identity(0))); authentication_service()->SignOut( @@ -524,6 +542,7 @@ EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 3UL); EXPECT_TRUE(authentication_service()->HasPrimaryIdentityManaged( signin::ConsentLevel::kSignin)); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(2), CreateRefreshAccessTokenError(identity(0))); authentication_service()->SignOut( @@ -542,6 +561,7 @@ authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 2UL); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(0), CreateRefreshAccessTokenError(identity(0))); @@ -576,6 +596,7 @@ ON_CALL(*mock_sync_service()->GetMockUserSettings(), IsInitialSyncFeatureSetupComplete()) .WillByDefault(Return(true)); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(2), CreateRefreshAccessTokenError(identity(0))); authentication_service()->SignOut( @@ -594,9 +615,12 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(2), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); + EXPECT_EQ(identity_manager()->GetAccountsWithRefreshTokens().size(), 3UL); EXPECT_TRUE(authentication_service()->HasPrimaryIdentityManaged( signin::ConsentLevel::kSignin)); + VerifyLastSigninTimestamp(); SetCachedMDMInfo(identity(2), CreateRefreshAccessTokenError(identity(0))); authentication_service()->SignOut( @@ -613,6 +637,8 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); + GoogleServiceAuthError error( GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); signin::UpdatePersistentErrorOfRefreshTokenForAccount( @@ -655,6 +681,7 @@ GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); signin::UpdatePersistentErrorOfRefreshTokenForAccount( identity_manager(), GetAccountId(identity(0)), error); + VerifyLastSigninTimestamp(); uint32_t invocation_counter = 0; id<RefreshAccessTokenError> mdm_error = CreateRefreshAccessTokenError( @@ -703,6 +730,7 @@ GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); signin::UpdatePersistentErrorOfRefreshTokenForAccount( identity_manager(), GetAccountId(identity(0)), error); + VerifyLastSigninTimestamp(); uint32_t invocation_counter = 0; SetCachedMDMInfo(identity(0), CreateRefreshAccessTokenError( @@ -721,6 +749,7 @@ SetExpectationsForSignIn(); authentication_service()->SignIn( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); EXPECT_NSEQ(identity(0), authentication_service()->GetPrimaryIdentity( signin::ConsentLevel::kSignin)); @@ -767,6 +796,7 @@ identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); authentication_service()->GrantSyncConsent( identity(0), signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN); + VerifyLastSigninTimestamp(); // Set the account restriction. SetPattern("foo");
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm index 35c888a..5c585ac7 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_view_controller.mm
@@ -84,7 +84,9 @@ // Disable buttons. self.identityButtonControl.enabled = NO; self.primaryButton.enabled = NO; - SetConfigurationTitle(self.primaryButton, @""); + // Text should not be empty, otherwise the top and bottom can’t apply to the + // text buttom and top line anymore. + SetConfigurationTitle(self.primaryButton, @" "); } - (void)stopSpinner {
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn b/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn index 4bb35be..e12ff004 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/BUILD.gn
@@ -48,7 +48,7 @@ "//components/resources:components_scaled_resources_grit", "//components/url_formatter", "//ios/chrome/app/strings", - "//ios/chrome/browser/shared/ui/bottom_sheet", + "//ios/chrome/browser/shared/ui/bottom_sheet:table_view_bottom_sheet_view_controller", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/shared/ui/util",
diff --git a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm index 81d28b03..62c21dbf 100644 --- a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm +++ b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
@@ -15,6 +15,7 @@ #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h" #import "ios/chrome/browser/ui/infobars/infobar_earl_grey_ui_test_util.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_address_profile_modal_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/blocking_overlay/blocking_overlay_view_controller.mm b/ios/chrome/browser/ui/blocking_overlay/blocking_overlay_view_controller.mm index b0c9dc53..d16c67ee 100644 --- a/ios/chrome/browser/ui/blocking_overlay/blocking_overlay_view_controller.mm +++ b/ios/chrome/browser/ui/blocking_overlay/blocking_overlay_view_controller.mm
@@ -7,6 +7,7 @@ #import "ios/chrome/app/blocking_scene_commands.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" namespace {
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 195dcd3..d428672 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -96,8 +96,10 @@ #import "ios/chrome/browser/shared/public/commands/promos_manager_commands.h" #import "ios/chrome/browser/shared/public/commands/qr_generation_commands.h" #import "ios/chrome/browser/shared/public/commands/save_image_to_photos_command.h" +#import "ios/chrome/browser/shared/public/commands/save_to_drive_commands.h" #import "ios/chrome/browser/shared/public/commands/save_to_photos_commands.h" #import "ios/chrome/browser/shared/public/commands/share_highlight_command.h" +#import "ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h" #import "ios/chrome/browser/shared/public/commands/show_signin_command.h" #import "ios/chrome/browser/shared/public/commands/text_zoom_commands.h" #import "ios/chrome/browser/shared/public/commands/toolbar_commands.h" @@ -227,6 +229,7 @@ #import "ios/chrome/browser/web/model/web_state_delegate_browser_agent.h" #import "ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h" #import "ios/chrome/browser/webui/model/net_export_tab_helper_delegate.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/public/provider/chrome/browser/fullscreen/fullscreen_api.h" #import "ios/public/provider/chrome/browser/signin/choice_api.h" @@ -287,6 +290,7 @@ RecentTabsCoordinatorDelegate, RepostFormCoordinatorDelegate, RepostFormTabHelperDelegate, + SaveToDriveCommands, SaveToPhotosCommands, SigninPresenter, SnapshotGeneratorDelegate, @@ -843,6 +847,7 @@ @protocol(PasswordsAccountStorageNoticeCommands), @protocol(PolicyChangeCommands), @protocol(PriceNotificationsCommands), + @protocol(SaveToDriveCommands), @protocol(SaveToPhotosCommands), @protocol(TextZoomCommands), @protocol(WebContentCommands), @@ -2616,6 +2621,16 @@ } } +#pragma mark - SaveToDriveCommands + +- (void)showSaveToDrive:(ShowSaveToDriveCommand*)command { + // TODO(crbug.com/1495352): Start SaveToDriveCoordinator. +} + +- (void)hideSaveToDrive { + // TODO(crbug.com/1495352): Stop SaveToDriveCoordinator. +} + #pragma mark - SaveToPhotosCommands - (void)saveImageToPhotos:(SaveImageToPhotosCommand*)command {
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn index f9379f8..eb2aed0 100644 --- a/ios/chrome/browser/ui/download/BUILD.gn +++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -43,6 +43,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/download/model", "//ios/chrome/browser/drive/model:drive_availability", + "//ios/chrome/browser/drive/model:drive_service_factory", "//ios/chrome/browser/infobars/model", "//ios/chrome/browser/main/model", "//ios/chrome/browser/overlays/model",
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm index a8b1734..5f5bd813 100644 --- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm +++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -11,6 +11,7 @@ #import <set> #import <utility> +#import "base/apple/foundation_util.h" #import "base/apple/scoped_cftyperef.h" #import "base/check_op.h" #import "base/feature_list.h" @@ -28,6 +29,7 @@ #import "ios/chrome/browser/download/model/download_manager_tab_helper.h" #import "ios/chrome/browser/download/model/external_app_util.h" #import "ios/chrome/browser/download/model/installation_notifier.h" +#import "ios/chrome/browser/drive/model/drive_service_factory.h" #import "ios/chrome/browser/overlays/model/public/common/confirmation/confirmation_overlay_response.h" #import "ios/chrome/browser/overlays/model/public/overlay_callback_manager.h" #import "ios/chrome/browser/overlays/model/public/overlay_request_queue.h" @@ -38,6 +40,8 @@ #import "ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h" #import "ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/save_to_drive_commands.h" +#import "ios/chrome/browser/shared/public/commands/show_save_to_drive_command.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/signin/model/identity_manager_factory.h" #import "ios/chrome/browser/store_kit/model/store_kit_coordinator.h" @@ -100,8 +104,11 @@ if (base::FeatureList::IsEnabled(kIOSSaveToDrive)) { _mediator.SetIsIncognito(isIncognito); - _mediator.SetIdentityManager(IdentityManagerFactory::GetForBrowserState( - self.browser->GetBrowserState())); + ChromeBrowserState* browserState = self.browser->GetBrowserState(); + _mediator.SetIdentityManager( + IdentityManagerFactory::GetForBrowserState(browserState)); + _mediator.SetDriveService( + drive::DriveServiceFactory::GetForBrowserState(browserState)); } _mediator.SetDownloadTask(_downloadTask); @@ -119,6 +126,7 @@ } - (void)stop { + _mediator.SetDriveService(nullptr); _mediator.SetIdentityManager(nullptr); if (_viewController) { @@ -282,6 +290,18 @@ _mediator.StartDowloading(); } +- (void)downloadManagerViewControllerDidStartDownloadToDrive: + (UIViewController*)controller { + CHECK(base::FeatureList::IsEnabled(kIOSSaveToDrive)); + id<SaveToDriveCommands> saveToDriveHandler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), SaveToDriveCommands); + ShowSaveToDriveCommand* command = [[ShowSaveToDriveCommand alloc] init]; + command.fileName = + base::apple::FilePathToNSString(_downloadTask->GenerateFileName()); + command.fileSize = _downloadTask->GetTotalBytes(); + [saveToDriveHandler showSaveToDrive:command]; +} + - (void)presentOpenInForDownloadManagerViewController: (UIViewController*)controller { base::RecordAction(base::UserMetricsAction("IOSDownloadOpenIn"));
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.h b/ios/chrome/browser/ui/download/download_manager_mediator.h index c710f9c9..aa059b6d 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.h +++ b/ios/chrome/browser/ui/download/download_manager_mediator.h
@@ -12,6 +12,10 @@ @protocol DownloadManagerConsumer; +namespace drive { +class DriveService; +} + namespace signin { class IdentityManager; } @@ -37,6 +41,9 @@ // Sets the identity manager. void SetIdentityManager(signin::IdentityManager* identity_manager); + // Sets the Drive service. + void SetDriveService(drive::DriveService* drive_service); + // Sets download manager consumer. Not retained by mediator. void SetConsumer(id<DownloadManagerConsumer> consumer); @@ -76,6 +83,7 @@ void OnDownloadDestroyed(web::DownloadTask* task) override; raw_ptr<signin::IdentityManager> identity_manager_ = nullptr; + raw_ptr<drive::DriveService> drive_service_ = nullptr; bool is_incognito_; base::FilePath download_path_; raw_ptr<web::DownloadTask> task_ = nullptr;
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.mm b/ios/chrome/browser/ui/download/download_manager_mediator.mm index 2f8deb04..a08f3444 100644 --- a/ios/chrome/browser/ui/download/download_manager_mediator.mm +++ b/ios/chrome/browser/ui/download/download_manager_mediator.mm
@@ -35,6 +35,11 @@ identity_manager_ = identity_manager; } +void DownloadManagerMediator::SetDriveService( + drive::DriveService* drive_service) { + drive_service_ = drive_service; +} + void DownloadManagerMediator::SetConsumer( id<DownloadManagerConsumer> consumer) { consumer_ = consumer; @@ -85,9 +90,9 @@ if (base::FeatureList::IsEnabled(kIOSSaveToDrive) && [consumer_ respondsToSelector:@selector(setDownloadToDriveButtonVisible:)]) { - [consumer_ - setDownloadToDriveButtonVisible:drive::IsSaveToDriveAvailable( - is_incognito_, identity_manager_)]; + bool is_save_to_drive_available = drive::IsSaveToDriveAvailable( + is_incognito_, identity_manager_, drive_service_); + [consumer_ setDownloadToDriveButtonVisible:is_save_to_drive_available]; } if (state == kDownloadManagerStateSucceeded) {
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller.mm b/ios/chrome/browser/ui/download/download_manager_view_controller.mm index 5e5dd4d..9652e61ae 100644 --- a/ios/chrome/browser/ui/download/download_manager_view_controller.mm +++ b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
@@ -453,9 +453,15 @@ UIButtonConfiguration* downloadToDriveButtonConf = CreateDownloadButtonConfiguration( nil, DownloadDestinationIcon::kDriveIcon, true); + __weak __typeof(self) weakSelf = self; + UIAction* downloadToDriveAction = + [UIAction actionWithHandler:^(UIAction* action) { + [weakSelf.delegate + downloadManagerViewControllerDidStartDownloadToDrive:weakSelf]; + }]; _downloadToDriveButton = [UIButton buttonWithConfiguration:downloadToDriveButtonConf - primaryAction:nil]; + primaryAction:downloadToDriveAction]; [_downloadToDriveButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller_delegate.h b/ios/chrome/browser/ui/download/download_manager_view_controller_delegate.h index 2ca3f79..9d9b742 100644 --- a/ios/chrome/browser/ui/download/download_manager_view_controller_delegate.h +++ b/ios/chrome/browser/ui/download/download_manager_view_controller_delegate.h
@@ -14,11 +14,16 @@ // Called when close button was tapped. Delegate may dismiss presentation. - (void)downloadManagerViewControllerDidClose:(UIViewController*)controller; -// Called when Download or Restart button was tapped. Delegate should start the -// download. +// Called when Download (to Files) or Restart button was tapped. Delegate should +// start the download and eventually store the result in the Downloads folder. - (void)downloadManagerViewControllerDidStartDownload: (UIViewController*)controller; +// Called when Download (to Drive) button was tapped. Delegate should show the +// Save to Drive UI. +- (void)downloadManagerViewControllerDidStartDownloadToDrive: + (UIViewController*)controller; + // Called when "Open In.." button was tapped. Delegate should present system's // OpenIn dialog. - (void)presentOpenInForDownloadManagerViewController:
diff --git a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm index c7c3ee5d..8379088 100644 --- a/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm +++ b/ios/chrome/browser/ui/incognito_interstitial/incognito_interstitial_view_controller.mm
@@ -19,6 +19,7 @@ #import "ios/chrome/common/button_configuration_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/device_form_factor.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn index 8dfb145..4414e31 100644 --- a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/BUILD.gn
@@ -47,6 +47,7 @@ "//components/autofill/core/browser:test_support", "//components/autofill/core/common:features", "//components/strings:components_strings_grit", + "//ios/chrome/app/strings:ios_branded_strings_grit", "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/table_view:test_support",
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm index 11ebfe9e..3304d8d 100644 --- a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm
@@ -26,6 +26,7 @@ #import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_item.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h" #import "url/gurl.h"
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller_unittest.mm b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller_unittest.mm index b19a327..df11e7bb 100644 --- a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller_unittest.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/shared/ui/table_view/legacy_chrome_table_view_controller_test.h" #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" #import "ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_modal_delegate.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "testing/gtest_mac.h" #import "third_party/ocmock/OCMock/OCMock.h" @@ -193,10 +194,10 @@ CheckTitleWithId(IDS_IOS_AUTOFILL_ADDRESS_MIGRATION_TO_ACCOUNT_PROMPT_TITLE); EXPECT_EQ(1, NumberOfSections()); EXPECT_EQ(4, NumberOfItemsInSection(0)); - CheckTextCellText( - @"This address is currently saved to Chrome. To use it across Google " - @"products, save it in your Google Account, test@gmail.com.", - 0, 0); + CheckTextCellText(l10n_util::GetNSStringF( + IDS_IOS_AUTOFILL_ADDRESS_MIGRATE_IN_ACCOUNT_FOOTER, + u"test@gmail.com"), + 0, 0); CheckTextCellText(@"Test", 0, 1); CheckTextButtonCellButtonTextWithId( IDS_AUTOFILL_ADDRESS_MIGRATION_TO_ACCOUNT_PROMPT_OK_BUTTON_LABEL, 0, 2);
diff --git a/ios/chrome/browser/ui/mini_map/mini_map_interstitial_view_controller.mm b/ios/chrome/browser/ui/mini_map/mini_map_interstitial_view_controller.mm index f807ff8..14e1efd 100644 --- a/ios/chrome/browser/ui/mini_map/mini_map_interstitial_view_controller.mm +++ b/ios/chrome/browser/ui/mini_map/mini_map_interstitial_view_controller.mm
@@ -11,6 +11,7 @@ #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller_delegate.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "net/base/mac/url_conversions.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm index 863ae7c3..1694672 100644 --- a/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm
@@ -20,6 +20,7 @@ #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" #import "ios/chrome/common/ui/favicon/favicon_attributes.h" #import "ios/chrome/common/ui/favicon/favicon_view.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.mm index 23d07c6..3de870f 100644 --- a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/passwords/account_storage_notice/passwords_account_storage_notice_view_controller.mm b/ios/chrome/browser/ui/passwords/account_storage_notice/passwords_account_storage_notice_view_controller.mm index e970da2..bbad286 100644 --- a/ios/chrome/browser/ui/passwords/account_storage_notice/passwords_account_storage_notice_view_controller.mm +++ b/ios/chrome/browser/ui/passwords/account_storage_notice/passwords_account_storage_notice_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/check_op.h" #import "base/strings/sys_string_conversions.h" #import "ios/chrome/common/string_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/passwords/bottom_sheet/BUILD.gn b/ios/chrome/browser/ui/passwords/bottom_sheet/BUILD.gn index 9732932..1000ca8f 100644 --- a/ios/chrome/browser/ui/passwords/bottom_sheet/BUILD.gn +++ b/ios/chrome/browser/ui/passwords/bottom_sheet/BUILD.gn
@@ -65,7 +65,7 @@ "//components/url_formatter", "//ios/chrome/app/strings", "//ios/chrome/browser/favicon", - "//ios/chrome/browser/shared/ui/bottom_sheet", + "//ios/chrome/browser/shared/ui/bottom_sheet:table_view_bottom_sheet_view_controller", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/table_view/cells", "//ios/chrome/browser/ui/settings/password:title_view",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index 6251b58..1231c5e 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -84,6 +84,7 @@ #import "ios/chrome/browser/web/model/font_size/font_size_tab_helper.h" #import "ios/chrome/browser/web/model/web_navigation_browser_agent.h" #import "ios/chrome/browser/window_activities/model/window_activity_helpers.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/public/provider/chrome/browser/user_feedback/user_feedback_api.h" #import "ios/web/common/user_agent.h"
diff --git a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn index 1bbd6b1..6299d06 100644 --- a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn +++ b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn
@@ -44,6 +44,7 @@ "//base", "//base/test:test_support", "//components/sync:test_support", + "//ios/chrome/app/strings:ios_branded_strings_grit", "//ios/chrome/browser/signin/model:signin_util", "//ios/chrome/test:test_support", "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm index 17b34fa..962037f 100644 --- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm +++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm
@@ -21,6 +21,7 @@ #import "ios/chrome/browser/ui/post_restore_signin/metrics.h" #import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_view_controller.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/device_form_factor.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm index 0d5d1eb..5327e63 100644 --- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm +++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm
@@ -12,12 +12,14 @@ #import "ios/chrome/browser/shared/public/commands/promos_manager_commands.h" #import "ios/chrome/browser/signin/model/signin_util.h" #import "ios/chrome/browser/ui/post_restore_signin/metrics.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "testing/gmock/include/gmock/gmock.h" #import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/gtest_support.h" #import "ui/base/device_form_factor.h" +#import "ui/base/l10n/l10n_util_mac.h" namespace { const char kFakePreRestoreAccountEmail[] = "person@example.org"; @@ -83,7 +85,9 @@ // Test the title text. TEST_F(PostRestoreSignInProviderTest, title) { - EXPECT_TRUE([[provider_ title] isEqualToString:@"Chrome is Signed Out"]); + EXPECT_TRUE([[provider_ title] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_POST_RESTORE_SIGN_IN_ALERT_PROMO_TITLE)]); } // Tests the alert message.
diff --git a/ios/chrome/browser/ui/save_to_drive/OWNERS b/ios/chrome/browser/ui/save_to_drive/OWNERS new file mode 100644 index 0000000..2d7bd051 --- /dev/null +++ b/ios/chrome/browser/ui/save_to_drive/OWNERS
@@ -0,0 +1,4 @@ +qpubert@google.com + +# If none of the above are available. +olivierrobin@chromium.org \ No newline at end of file
diff --git a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm index bcd720d..39acf03 100644 --- a/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm +++ b/ios/chrome/browser/ui/save_to_photos/save_to_photos_mediator.mm
@@ -310,8 +310,10 @@ - (void)photosServiceFinishedUploadWithResult: (const PhotosService::UploadResult&)result { if (!result.successful) { - base::UmaHistogramTimes("IOS.SaveToPhotos.UploadFailureLatency", + base::UmaHistogramTimes(kSaveToPhotosUploadFailureLatencyHistogram, base::TimeTicks::Now() - _uploadStart); + base::UmaHistogramEnumeration(kSaveToPhotosUploadFailureTypeHistogram, + result.failure_type); __weak __typeof(self) weakSelf = self; [self.delegate stopValidationSpinnerForAccountPicker]; [self showTryAgainOrCancelAlertWithTryAgainBlock:^{ @@ -321,7 +323,7 @@ return; } - base::UmaHistogramTimes("IOS.SaveToPhotos.UploadSuccessLatency", + base::UmaHistogramTimes(kSaveToPhotosUploadSuccessLatencyHistogram, base::TimeTicks::Now() - _uploadStart); _uploadCompletedSuccessfully = YES;
diff --git a/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.h b/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.h index 52d0928..104c6fd 100644 --- a/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.h +++ b/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.h
@@ -20,8 +20,8 @@ NS_DESIGNATED_INITIALIZER; - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; +- (instancetype)init NS_UNAVAILABLE; @property(nonatomic, strong) UIImage* faviconImage;
diff --git a/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.mm b/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.mm index c118f0c..a4657e0 100644 --- a/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.mm +++ b/ios/chrome/browser/ui/search_engine_choice/fake_omnibox/fake_omnibox_view.mm
@@ -34,7 +34,7 @@ constexpr CGFloat kFontSize = 13.; // Creates the fake omnibox border or shadow. -CAShapeLayer* CreateOmniboxEdgeLayer(BOOL isBorder) { +CALayer* CreateOmniboxEdgeLayer(BOOL isBorder) { CAShapeLayer* edgeLayer = [CAShapeLayer layer]; if (isBorder) { // Create the dashed border line. @@ -66,7 +66,7 @@ } // Creates the fake omnibox field. -CAShapeLayer* CreateOmniboxFieldLayer(BOOL isEmpty) { +CALayer* CreateOmniboxFieldLayer(BOOL isEmpty) { CAShapeLayer* field = [CAShapeLayer layer]; if (isEmpty) { // Add the empty grey field inside. @@ -105,6 +105,10 @@ } // namespace @implementation FakeOmniboxView { + // Omnibox edge layer with shadow and/or border line. + CALayer* _omniboxEdgeLayer; + // Inner layer. + CALayer* _fieldLayer; // The image view for the favicon or the magnifying glass. UIImageView* _imageView; // Whether the fake omnibox should be empty. @@ -123,12 +127,12 @@ self.bounds = CGRectMake(0, 0, kFakeOmniboxWidth, kFakeOmniboxHeight); // Add the shadow around the omnibox. - CAShapeLayer* omniboxEdge = CreateOmniboxEdgeLayer(_isEmptyFakeOmnibox); - [self.layer addSublayer:omniboxEdge]; + _omniboxEdgeLayer = CreateOmniboxEdgeLayer(_isEmptyFakeOmnibox); + [self.layer addSublayer:_omniboxEdgeLayer]; // Create the pill-shaped field. - CAShapeLayer* field = CreateOmniboxFieldLayer(_isEmptyFakeOmnibox); - [self.layer addSublayer:field]; + _fieldLayer = CreateOmniboxFieldLayer(_isEmptyFakeOmnibox); + [self.layer addSublayer:_fieldLayer]; if (!_isEmptyFakeOmnibox) { // Add the search engine Label. @@ -179,6 +183,23 @@ return self; } +#pragma mark - UITraitEnvironment + +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + if (previousTraitCollection.userInterfaceStyle != + self.traitCollection.userInterfaceStyle) { + // Creates new layers, to have the correct colors (according to dark mode or + // light mode). + CALayer* newOmniboxEdgeLayer = CreateOmniboxEdgeLayer(_isEmptyFakeOmnibox); + [self.layer replaceSublayer:_omniboxEdgeLayer with:newOmniboxEdgeLayer]; + _omniboxEdgeLayer = newOmniboxEdgeLayer; + CALayer* newFieldLayer = CreateOmniboxFieldLayer(_isEmptyFakeOmnibox); + [self.layer replaceSublayer:_fieldLayer with:newFieldLayer]; + _fieldLayer = newFieldLayer; + } +} + #pragma mark - Properties - (void)setFaviconImage:(UIImage*)faviconImage {
diff --git a/ios/chrome/browser/ui/search_engine_choice/search_engine_choice_view_controller.mm b/ios/chrome/browser/ui/search_engine_choice/search_engine_choice_view_controller.mm index 6b08d7e..0374cb4 100644 --- a/ios/chrome/browser/ui/search_engine_choice/search_engine_choice_view_controller.mm +++ b/ios/chrome/browser/ui/search_engine_choice/search_engine_choice_view_controller.mm
@@ -293,17 +293,9 @@ - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { [super traitCollectionDidChange:previousTraitCollection]; - // Reset the title font to make sure that it is // properly scaled. _titleLabel.font = GetTitleFontWithTraitCollection(self.traitCollection); - if (previousTraitCollection.userInterfaceStyle != - self.traitCollection.userInterfaceStyle) { - // Re-draw the fake empty omnibox in order to take color updates into - // account. - _fakeEmptyOmniboxView = [[FakeOmniboxView alloc] init]; - [_fakeEmptyOmniboxView layoutIfNeeded]; - } } #pragma mark - SearchEngineChoiceConsumer
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator_egtest.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator_egtest.mm index e1500b0..918a53e70 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_coordinator_egtest.mm
@@ -8,6 +8,7 @@ #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h"
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm index 19ad910..301b594a 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm
@@ -28,6 +28,7 @@ #import "ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_delegate.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm index 0ce8ce50..ee1c2fa 100644 --- a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm index c8757b0b..9937583 100644 --- a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/ui/table_view/legacy_chrome_table_view_controller_test.h" #import "ios/chrome/browser/ui/settings/settings_table_view_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm index 33e221a..c723f16 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm
@@ -26,6 +26,7 @@ #import "ios/chrome/browser/ui/settings/password/password_manager_egtest_utils.h" #import "ios/chrome/browser/ui/settings/password/password_settings_app_interface.h" #import "ios/chrome/common/ui/promo_style/constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/parcel_tracking_settings_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/parcel_tracking_settings_view_controller.mm index 19e0bfc3..8f69252 100644 --- a/ios/chrome/browser/ui/settings/google_services/parcel_tracking_settings_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/parcel_tracking_settings_view_controller.mm
@@ -10,6 +10,7 @@ #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h" #import "ios/chrome/browser/ui/settings/google_services/parcel_tracking_settings_model_delegate.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm index 85170ee..ece2c91 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -41,6 +41,7 @@ #import "ios/chrome/common/ui/reauthentication/reauthentication_event.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_protocol.h" #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn index 04d7c46..6a5164c3 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_sharing/BUILD.gn
@@ -104,7 +104,7 @@ "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/browser/net:crurl", - "//ios/chrome/browser/shared/ui/bottom_sheet", + "//ios/chrome/browser/shared/ui/bottom_sheet:table_view_bottom_sheet_view_controller", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/table_view", "//ios/chrome/browser/shared/ui/util",
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/family_picker_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_sharing/family_picker_view_controller.mm index aec478a..3d795a0 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/family_picker_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_sharing/family_picker_view_controller.mm
@@ -16,6 +16,7 @@ #import "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/elements/popover_label_view_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_coordinator.mm index 3a4b10ad..6e8864b 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_coordinator.mm
@@ -31,6 +31,7 @@ #import "ios/chrome/browser/ui/settings/password/password_sharing/recipient_info.h" #import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator.h" #import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_coordinator_delegate.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "services/network/public/cpp/shared_url_loader_factory.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_egtest.mm b/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_egtest.mm index c80800d..43da10f 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_egtest.mm
@@ -15,6 +15,7 @@ #import "ios/chrome/browser/ui/settings/password/password_settings_app_interface.h" #import "ios/chrome/browser/ui/settings/password/password_sharing/password_sharing_constants.h" #import "ios/chrome/common/ui/confirmation_alert/constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/ui/settings/password/widget_promo_instructions/widget_promo_instructions_view_controller.mm b/ios/chrome/browser/ui/settings/password/widget_promo_instructions/widget_promo_instructions_view_controller.mm index ef46001..3211270 100644 --- a/ios/chrome/browser/ui/settings/password/widget_promo_instructions/widget_promo_instructions_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/widget_promo_instructions/widget_promo_instructions_view_controller.mm
@@ -10,6 +10,7 @@ #import "ios/chrome/browser/ui/settings/password/widget_promo_instructions/widget_promo_instructions_constants.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_egtest.mm b/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_egtest.mm index 404b69d..d5fb05d 100644 --- a/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_egtest.mm +++ b/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_egtest.mm
@@ -7,6 +7,7 @@ #import "ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_constants.h" #import "ios/chrome/browser/web/model/features.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_view_controller.mm index 148f222..ad29e8c 100644 --- a/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/lockdown_mode/lockdown_mode_view_controller.mm
@@ -15,6 +15,7 @@ #import "ios/chrome/browser/ui/settings/elements/info_popover_view_controller.h" #import "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/device_form_factor.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm index fb387903..9acf6dc 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.mm
@@ -39,6 +39,7 @@ #import "ios/chrome/browser/ui/settings/cells/passphrase_error_item.h" #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h" #import "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm index b8c8262..8cbbc0f4 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm
@@ -22,6 +22,7 @@ #import "ios/chrome/browser/ui/settings/cells/byo_textfield_item.h" #import "ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift index 9861a054..622b3cf 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift
@@ -7,6 +7,15 @@ /// Struct that contains constants used in the Tab Strip UI. struct TabStripConstants { + /// Tab item constants. + struct TabItem { + static let height: CGFloat = 39 + static let minWidth: CGFloat = 80 + static let maxWidth: CGFloat = 150 + static let horizontalSpacing: CGFloat = 0 + static let selectedZindex: Int = 10 + } + /// New tab button constants. struct NewTabButton { static let contentInset: CGFloat = 6
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift index ddda8978..c542a46 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift
@@ -5,55 +5,217 @@ import UIKit /// Layout used for the TabStrip. -class TabStripLayout: UICollectionViewCompositionalLayout { +class TabStripLayout: UICollectionViewFlowLayout { + /// Wether the flow layout needs to be updated. + public var needsUpdate: Bool = true - // The data source used for the collection view. + /// Dynamic size of a tab. + private var tabCellSize: CGSize = .zero + + /// Index paths of animated items. + private var indexPathsOfDeletingItems: [IndexPath] = [] + private var indexPathsOfInsertingItems: [IndexPath] = [] + + /// The DataSource for this collection view. weak var dataSource: UICollectionViewDiffableDataSource<TabStripViewController.Section, TabSwitcherItem>? - required init() { - let configuration = UICollectionViewCompositionalLayoutConfiguration() - configuration.scrollDirection = .horizontal - // Use a `futureSelf` variable as the super init requires a closure and as - // init is not instantiated yet, we can't use it. - weak var futureSelf: TabStripLayout? - super.init( - sectionProvider: { - ( - sectionIndex: Int, - layoutEnvironment: NSCollectionLayoutEnvironment - ) -> NSCollectionLayoutSection? in - return futureSelf?.getSection( - sectionIndex: sectionIndex, layoutEnvironment: layoutEnvironment) - }, configuration: configuration) - futureSelf = self + override init() { + super.init() + scrollDirection = .horizontal + minimumInteritemSpacing = TabStripConstants.TabItem.horizontalSpacing + minimumLineSpacing = 0 } required init?(coder: NSCoder) { - fatalError("init(coder:) is not supported") + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UICollectionViewLayout + + override func prepare() { + /// Only recalculate the `tabCellSize` when needed to avoid extra computation. + if needsUpdate { + calculateTabCellSize() + } + super.prepare() + } + + override func prepare(forCollectionViewUpdates updateItems: [UICollectionViewUpdateItem]) { + super.prepare(forCollectionViewUpdates: updateItems) + + /// Keeps track of updated items to animate their transition. + indexPathsOfDeletingItems = [] + indexPathsOfInsertingItems = [] + for item in updateItems { + switch item.updateAction { + case .insert: + indexPathsOfInsertingItems.append(item.indexPathAfterUpdate!) + break + case .delete: + indexPathsOfDeletingItems.append(item.indexPathBeforeUpdate!) + break + default: + break + } + } + } + + override func finalizeCollectionViewUpdates() { + indexPathsOfDeletingItems = [] + indexPathsOfInsertingItems = [] + super.finalizeCollectionViewUpdates() + } + + override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) + -> UICollectionViewLayoutAttributes? + { + guard + let attributes: UICollectionViewLayoutAttributes = super + .initialLayoutAttributesForAppearingItem(at: itemIndexPath) + else { return nil } + + if indexPathsOfInsertingItems.contains(itemIndexPath) { + // Animate the appearing item by starting it with zero opacity and translated down by its height. + attributes.alpha = 0 + attributes.transform = CGAffineTransform( + translationX: 0, + y: attributes.frame.size.height + ) + } + return attributes + } + + override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) + -> UICollectionViewLayoutAttributes? + { + guard + let attributes: UICollectionViewLayoutAttributes = super + .finalLayoutAttributesForDisappearingItem(at: itemIndexPath) + else { return nil } + + if indexPathsOfDeletingItems.contains(itemIndexPath) { + // Animate the disappearing item by fading it out and translating it down by its height. + attributes.alpha = 0 + attributes.transform = CGAffineTransform( + translationX: 0, + y: attributes.frame.size.height + ) + } + return attributes + } + + override func layoutAttributesForItem(at indexPath: IndexPath) + -> UICollectionViewLayoutAttributes? + { + guard + let layoutAttributes = super.layoutAttributesForItem(at: indexPath), + let collectionView = collectionView + else { return nil } + guard + let cell: TabStripCell = (collectionView.cellForItem(at: indexPath) as? TabStripCell) + else { return layoutAttributes } + + let contentOffset = collectionView.contentOffset + var frame = layoutAttributes.frame + let collectionViewSizeWidth = collectionView.bounds.size.width + + // The selected cell should remain on top of other cells within collection view's bounds. + if cell.isSelected { + var origin = layoutAttributes.frame.origin + layoutAttributes.zIndex = TabStripConstants.TabItem.selectedZindex + + // Update the cell's origin horizontally to prevent it from being partially hidden off-screen. + let maxOriginX = collectionViewSizeWidth - frame.size.width + origin.x = max(origin.x, contentOffset.x) // Check the left side. + origin.x = min(origin.x, contentOffset.x + maxOriginX) // Check the right side. + + layoutAttributes.frame = CGRect(origin: origin, size: frame.size) + return layoutAttributes + } + + // Recalculate the cell width and origin when it intersects with the left collection view's bounds. + // The cell should collapse within the collection view's bounds until its width reaches 0. + if frame.minX < contentOffset.x && contentOffset.x < frame.maxX { + frame.origin.x = max(contentOffset.x, frame.origin.x) + let offsetLeft: CGFloat = abs(frame.origin.x - layoutAttributes.frame.origin.x) + frame.size.width = min(frame.width - offsetLeft, frame.width) + } + + let offsetRight: CGFloat = collectionViewSizeWidth + contentOffset.x + + // Recalculate the cell width when it intersects with the left collection view's bounds. + // The cell should collapse within the collection view's bounds until its width reaches 0. + if frame.minX < offsetRight && offsetRight < frame.maxX { + frame.size.width = min(offsetRight - frame.origin.x, frame.size.width) + } + + layoutAttributes.frame = frame + return layoutAttributes + } + + override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? + { + guard + var computedAttributes = super.layoutAttributesForElements(in: rect), + let collectionView = collectionView + else { return nil } + + computedAttributes = computedAttributes.compactMap { layoutAttribute in + layoutAttributesForItem(at: layoutAttribute.indexPath) + } + + // Explicitly update the layout of the selected item. + for indexPath in collectionView.indexPathsForSelectedItems ?? [] { + if let attr = layoutAttributesForItem(at: indexPath) { + computedAttributes.append(attr) + } + } + return computedAttributes + } + + override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { + return true } // MARK: - Private - func getSection( - sectionIndex: Int, - layoutEnvironment: NSCollectionLayoutEnvironment - ) -> NSCollectionLayoutSection? { - // TODO(crbug.com/1490555): For now this layout doesn't really make sense. Update it to make it look like the mocks. - let itemSize = NSCollectionLayoutSize( - widthDimension: .fractionalWidth(1.0), - heightDimension: .fractionalHeight(1.0)) - let item = NSCollectionLayoutItem(layoutSize: itemSize) + // Calculates the dynamic size of a tab according to the number of tabs and + // groups. + private func calculateTabCellSize() { + guard let collectionView = self.collectionView, let snapshot = dataSource?.snapshot() else { + return + } - let groupSize = NSCollectionLayoutSize( - widthDimension: .absolute(150), - heightDimension: .absolute(39)) - let group = NSCollectionLayoutGroup.vertical( - layoutSize: groupSize, - subitem: item, - count: 1) + let groupCellWidthSum: CGFloat = 0 + var tabCellCount: CGFloat = 0 + let cellCount: CGFloat = CGFloat(snapshot.itemIdentifiers.count) - let section = NSCollectionLayoutSection(group: group) - return section + if cellCount == 0 { + return + } + + for _ in snapshot.itemIdentifiers { + // TODO(crbug.com/1509342): Handle tab group item. + tabCellCount += 1 + } + + let collectionViewWidth: CGFloat = CGRectGetWidth(collectionView.bounds) + let itemSpacingSum: CGFloat = minimumInteritemSpacing * (cellCount - 1) + + var itemWidth: CGFloat = + (collectionViewWidth - itemSpacingSum - groupCellWidthSum) / tabCellCount + itemWidth = max(itemWidth, TabStripConstants.TabItem.minWidth) + itemWidth = min(itemWidth, TabStripConstants.TabItem.maxWidth) + + tabCellSize = CGSize(width: itemWidth, height: TabStripConstants.TabItem.height) } + + // MARK: - Public + + public func calculcateCellSize(indexPath: IndexPath) -> CGSize { + // TODO(crbug.com/1509342): Handle tab group item. + return tabCellSize + } + }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift index 2dbdac2c..f0e43db 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_view_controller.swift
@@ -7,7 +7,7 @@ /// View Controller displaying the TabStrip. @objcMembers class TabStripViewController: UIViewController, TabStripCellDelegate, - TabStripConsumer, UICollectionViewDelegate + TabStripConsumer { // The enum used by the data source to manage the sections. @@ -79,13 +79,9 @@ var snapshot = NSDiffableDataSourceSnapshot<Section, TabSwitcherItem>() snapshot.appendSections([.tabs]) snapshot.appendItems(items, toSection: .tabs) - diffableDataSource?.apply(snapshot) - - guard let selectedItem = selectedItem, let diffableDataSource = diffableDataSource else { - return - } - let indexPath = diffableDataSource.indexPath(for: selectedItem) - collectionView.selectItem(at: indexPath, animated: true, scrollPosition: []) + applySnapshot( + diffableDataSource: diffableDataSource, snapshot: snapshot, animatingDifferences: true) + selectItem(selectedItem) } func selectItem(_ item: TabSwitcherItem?) { @@ -94,11 +90,17 @@ collectionView.deselectItem(at: indexPath, animated: true) } } - guard let item = item, let diffableDataSource = diffableDataSource else { - return - } - let indexPath = diffableDataSource.indexPath(for: item) - collectionView.selectItem(at: indexPath, animated: true, scrollPosition: []) + guard + let item = item, let diffableDataSource = diffableDataSource, + let indexPath = diffableDataSource.indexPath(for: item) + else { return } + + /// `.centeredHorizontally` is needed when the selected cell is not dequeued. + /// If the item is dequeued `.centeredVertically` will not update the layout. + let scrollPosition: UICollectionView.ScrollPosition = + collectionView.cellForItem(at: indexPath) != nil + ? .centeredVertically : .centeredHorizontally + collectionView.selectItem(at: indexPath, animated: true, scrollPosition: scrollPosition) } func reloadItem(_ item: TabSwitcherItem?) { @@ -108,7 +110,8 @@ var snapshot = diffableDataSource.snapshot() snapshot.reconfigureItems([item]) - diffableDataSource.apply(snapshot, animatingDifferences: false) + applySnapshot( + diffableDataSource: diffableDataSource, snapshot: snapshot, animatingDifferences: false) } func replaceItem(_ oldItem: TabSwitcherItem?, withItem newItem: TabSwitcherItem?) { @@ -120,48 +123,8 @@ var snapshot = diffableDataSource.snapshot() snapshot.insertItems([newItem], beforeItem: oldItem) snapshot.deleteItems([oldItem]) - diffableDataSource.apply(snapshot, animatingDifferences: false) - } - - // MARK: - UICollectionViewDelegate - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - if #available(iOS 16, *) { - } else { - self.collectionView(collectionView, performPrimaryActionForItemAt: indexPath) - } - } - - func collectionView( - _ collectionView: UICollectionView, performPrimaryActionForItemAt indexPath: IndexPath - ) { - guard let item = diffableDataSource?.itemIdentifier(for: indexPath) else { - return - } - mutator?.activate(item) - } - - func collectionView( - _ collectionView: UICollectionView, - contextMenuConfigurationForItemAt indexPath: IndexPath, - point: CGPoint - ) -> UIContextMenuConfiguration? { - return self.collectionView( - collectionView, contextMenuConfigurationForItemsAt: [indexPath], point: point) - } - - func collectionView( - _ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], - point: CGPoint - ) -> UIContextMenuConfiguration? { - if indexPaths.count != 1 { - return nil - } - - weak var weakSelf = self - return UIContextMenuConfiguration(actionProvider: { suggestedActions in - return weakSelf?.contextMenuForIndexPath(indexPaths[0]) - }) + applySnapshot( + diffableDataSource: diffableDataSource, snapshot: snapshot, animatingDifferences: false) } // MARK: - TabStripCellDelegate @@ -180,6 +143,17 @@ // MARK: - Private + /// Applies `snapshot` to `diffableDataSource` and updates the collection view layout. + private func applySnapshot( + diffableDataSource: UICollectionViewDiffableDataSource<Section, TabSwitcherItem>?, + snapshot: NSDiffableDataSourceSnapshot<Section, TabSwitcherItem>, + animatingDifferences: Bool = false + ) { + layout.needsUpdate = true + diffableDataSource?.apply(snapshot, animatingDifferences: animatingDifferences) + layout.needsUpdate = false + } + /// Creates the registrations of the different cells used in the collection view. private func createRegistrations() { tabCellRegistration = UICollectionView.CellRegistration<TabStripCell, TabSwitcherItem> { @@ -256,3 +230,56 @@ } } + +// MARK: - UICollectionViewDelegateFlowLayout + +extension TabStripViewController: UICollectionViewDelegateFlowLayout { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if #available(iOS 16, *) { + } else { + self.collectionView(collectionView, performPrimaryActionForItemAt: indexPath) + } + } + + func collectionView( + _ collectionView: UICollectionView, performPrimaryActionForItemAt indexPath: IndexPath + ) { + guard let item = diffableDataSource?.itemIdentifier(for: indexPath) else { + return + } + mutator?.activate(item) + } + + func collectionView( + _ collectionView: UICollectionView, + contextMenuConfigurationForItemAt indexPath: IndexPath, + point: CGPoint + ) -> UIContextMenuConfiguration? { + return self.collectionView( + collectionView, contextMenuConfigurationForItemsAt: [indexPath], point: point) + } + + func collectionView( + _ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], + point: CGPoint + ) -> UIContextMenuConfiguration? { + if indexPaths.count != 1 { + return nil + } + + weak var weakSelf = self + return UIContextMenuConfiguration(actionProvider: { suggestedActions in + return weakSelf?.contextMenuForIndexPath(indexPaths[0]) + }) + } + + func collectionView( + _ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath + ) -> CGSize { + return layout.calculcateCellSize(indexPath: indexPath) + } + +}
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_table_view_controller.mm b/ios/chrome/browser/ui/whats_new/whats_new_table_view_controller.mm index 0d407de3..f71a54c14 100644 --- a/ios/chrome/browser/ui/whats_new/whats_new_table_view_controller.mm +++ b/ios/chrome/browser/ui/whats_new/whats_new_table_view_controller.mm
@@ -15,6 +15,7 @@ #import "ios/chrome/browser/ui/whats_new/whats_new_table_view_delegate.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm b/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm index 6ba950d..f3815e6ae 100644 --- a/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm +++ b/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm
@@ -602,6 +602,7 @@ buttonConfiguration.attributedTitle = nil; buttonConfiguration.title = _primaryActionString; _primaryActionButton.configuration = buttonConfiguration; + [self setPrimaryActionButtonFont:_primaryActionButton]; } } @@ -695,7 +696,7 @@ // Use `primaryActionString` even if scrolling to the end is mandatory // because at the viewDidLoad stage, the scroll view hasn't computed its - // content height, so there is no way to knOow if scrolling is needed. + // content height, so there is no way to know if scrolling is needed. // This label will be updated at the viewDidAppear stage if necessary. buttonConfiguration.title = self.primaryActionString; buttonConfiguration.titleLineBreakMode = NSLineBreakByTruncatingTail;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm index 0194a752..e0e95d00 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -66,6 +66,7 @@ #import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h" #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h" #import "ios/chrome/common/ui/promo_style/constants.h" +#import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/app/tab_test_util.h" #import "ios/chrome/test/app/window_test_util.h"
diff --git a/ios_internal b/ios_internal index b8fd6d1..88f7c14 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit b8fd6d1953501218760e0f7e2f0485c44d4925c1 +Subproject commit 88f7c14d049dcca81d3515f989101f080d8557e1
diff --git a/media/capture/video/chromeos/display_rotation_observer.cc b/media/capture/video/chromeos/display_rotation_observer.cc index 038d801..356f56d 100644 --- a/media/capture/video/chromeos/display_rotation_observer.cc +++ b/media/capture/video/chromeos/display_rotation_observer.cc
@@ -51,15 +51,23 @@ DCHECK(display_task_runner_->BelongsToCurrentThread()); if (!(metrics & DISPLAY_METRIC_ROTATION)) return; - SendDisplayRotation(display); + if (display.IsInternal()) { + SendInternalDisplayRotation(display.rotation() * 90); + } } void ScreenObserverDelegate::AddObserverOnDisplayThread() { DCHECK(display_task_runner_->BelongsToCurrentThread()); display::Screen* screen = display::Screen::GetScreen(); - if (screen) { - display_observer_.emplace(this); - SendDisplayRotation(screen->GetPrimaryDisplay()); + if (!screen) { + return; + } + display_observer_.emplace(this); + for (const auto& display : screen->GetAllDisplays()) { + if (display.IsInternal()) { + SendInternalDisplayRotation(display.rotation() * 90); + break; + } } } @@ -69,21 +77,20 @@ } // Post the screen rotation change from the UI thread to capture thread -void ScreenObserverDelegate::SendDisplayRotation( - const display::Display& display) { +void ScreenObserverDelegate::SendInternalDisplayRotation(int rotation) { DCHECK(display_task_runner_->BelongsToCurrentThread()); delegate_task_runner_->PostTask( FROM_HERE, base::BindOnce( - &ScreenObserverDelegate::SendDisplayRotationOnCaptureThread, this, - display)); + &ScreenObserverDelegate::SendInternalDisplayRotationOnCaptureThread, + this, rotation)); } -void ScreenObserverDelegate::SendDisplayRotationOnCaptureThread( - const display::Display& display) { +void ScreenObserverDelegate::SendInternalDisplayRotationOnCaptureThread( + int rotation) { DCHECK(delegate_task_runner_->BelongsToCurrentThread()); if (observer_) - observer_->SetDisplayRotation(display); + observer_->SetInternalDisplayRotation(rotation); } } // namespace media
diff --git a/media/capture/video/chromeos/display_rotation_observer.h b/media/capture/video/chromeos/display_rotation_observer.h index 1a960be1..ee1dfac 100644 --- a/media/capture/video/chromeos/display_rotation_observer.h +++ b/media/capture/video/chromeos/display_rotation_observer.h
@@ -16,7 +16,7 @@ class DisplayRotationObserver { public: - virtual void SetDisplayRotation(const display::Display& display) = 0; + virtual void SetInternalDisplayRotation(int rotation) = 0; }; // Registers itself as an observer at |display::Screen::GetScreen()| and @@ -53,9 +53,10 @@ void AddObserverOnDisplayThread(); void RemoveObserverOnDisplayThread(); - // Post the screen rotation change from the display thread to capture thread - void SendDisplayRotation(const display::Display& display); - void SendDisplayRotationOnCaptureThread(const display::Display& display); + // Post the screen rotation change of the internal display from the display + // thread to capture thread. + void SendInternalDisplayRotation(int rotation); + void SendInternalDisplayRotationOnCaptureThread(int rotation); base::WeakPtr<DisplayRotationObserver> observer_;
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc index 436684d..33d6082 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc +++ b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc
@@ -344,11 +344,10 @@ power_manager_client_proxy_->UnblockSuspend(unblock_suspend_token); } -void VideoCaptureDeviceChromeOSDelegate::SetDisplayRotation( - const display::Display& display) { +void VideoCaptureDeviceChromeOSDelegate::SetInternalDisplayRotation( + int rotation) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); - if (display.IsInternal()) - SetRotation(display.rotation() * 90); + SetRotation(rotation); } void VideoCaptureDeviceChromeOSDelegate::SetRotation(int rotation) {
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h index df780f8..290f849 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h +++ b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h
@@ -18,12 +18,6 @@ #include "media/capture/video/video_capture_device_descriptor.h" #include "media/capture/video_capture_types.h" -namespace display { - -class Display; - -} // namespace display - namespace media { class CameraHalDelegate; @@ -69,7 +63,7 @@ void CloseDevice(base::UnguessableToken unblock_suspend_token); // DisplayRotationDelegate implementation. - void SetDisplayRotation(const display::Display& display) final; + void SetInternalDisplayRotation(int rotation) final; void SetRotation(int rotation); const VideoCaptureDeviceDescriptor device_descriptor_;
diff --git a/media/gpu/android/codec_allocator_unittest.cc b/media/gpu/android/codec_allocator_unittest.cc index 9737f4d..a32f2ea 100644 --- a/media/gpu/android/codec_allocator_unittest.cc +++ b/media/gpu/android/codec_allocator_unittest.cc
@@ -21,6 +21,7 @@ #include "base/time/tick_clock.h" #include "base/time/time.h" #include "media/base/android/mock_media_codec_bridge.h" +#include "media/base/subsample_entry.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/media/gpu/android/fake_codec_allocator.cc b/media/gpu/android/fake_codec_allocator.cc index 2260f30..3dd789a 100644 --- a/media/gpu/android/fake_codec_allocator.cc +++ b/media/gpu/android/fake_codec_allocator.cc
@@ -10,6 +10,7 @@ #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "media/base/android/mock_media_codec_bridge.h" +#include "media/base/subsample_entry.h" #include "media/gpu/android/codec_allocator.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/mojo/public/cpp/bindings/type_converter.h b/mojo/public/cpp/bindings/type_converter.h index 2eddbb0..c2edc87 100644 --- a/mojo/public/cpp/bindings/type_converter.h +++ b/mojo/public/cpp/bindings/type_converter.h
@@ -96,18 +96,21 @@ } template <typename T, typename U> - requires(!std::is_pointer_v<U>) -inline T ConvertTo(const U& obj) { - if constexpr (requires { - { - mojo::ConvertTo<T>(std::to_address(obj)) - - } -> std::same_as<T>; - }) { - return mojo::ConvertTo<T>(std::to_address(obj)); - } else { - return TypeConverter<T, U>::Convert(obj); + requires requires(const U& obj) { + not std::is_pointer_v<U>; + { mojo::ConvertTo<T>(std::to_address(obj)) } -> std::same_as<T>; } +inline T ConvertTo(const U& obj) { + return mojo::ConvertTo<T>(std::to_address(obj)); +} + +template <typename T, typename U> + requires requires(const U& obj) { + not std::is_pointer_v<U>; + TypeConverter<T, U>::Convert(obj); + } +inline T ConvertTo(const U& obj) { + return TypeConverter<T, U>::Convert(obj); } template <typename T> @@ -115,19 +118,52 @@ static T Convert(const T& obj) { return obj; } }; +namespace internal { + +template <typename Vec> +using VecValueType = typename Vec::value_type; + +template <typename Vec> +using VecPtrLikeUnderlyingValueType = + std::pointer_traits<VecValueType<Vec>>::element_type; + +} // namespace internal + // Generic specialization for converting between different vector-like // containers. template <typename OutVec, typename InVec> requires requires(const InVec& in, OutVec& out) { out.reserve(in.size()); - out.push_back(mojo::ConvertTo<typename OutVec::value_type>(*in.begin())); + out.push_back(mojo::ConvertTo<internal::VecValueType<OutVec>>(*in.begin())); } struct TypeConverter<OutVec, InVec> { static OutVec Convert(const InVec& in) { OutVec out; out.reserve(in.size()); for (const auto& obj : in) { - out.push_back(mojo::ConvertTo<typename OutVec::value_type>(obj)); + out.push_back(mojo::ConvertTo<internal::VecValueType<OutVec>>(obj)); + } + return out; + } +}; + +// Specialization for converting from Vector<U> to Vector<PtrLike<T>> with only +// TypeConverter<T*, U> defined. +template <typename OutVec, typename InVec> + requires requires(const InVec& in, OutVec& out) { + out.reserve(in.size()); + out.emplace_back( + mojo::ConvertTo<internal::VecPtrLikeUnderlyingValueType<OutVec>*>( + *in.begin())); + } +struct TypeConverter<OutVec, InVec> { + static OutVec Convert(const InVec& in) { + OutVec out; + out.reserve(in.size()); + for (const auto& obj : in) { + out.emplace_back( + mojo::ConvertTo<internal::VecPtrLikeUnderlyingValueType<OutVec>*>( + obj)); } return out; }
diff --git a/net/dns/address_info.cc b/net/dns/address_info.cc index c0e2a07..c71fa3ae 100644 --- a/net/dns/address_info.cc +++ b/net/dns/address_info.cc
@@ -138,7 +138,6 @@ break; } default: - NOTREACHED(); return false; } }
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index ee51003..bc811f4 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -19870,6 +19870,7 @@ NetLogWithSource::Make(NetLogSourceType::NONE)); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); + spdy_data.RunUntilPaused(); base::RunLoop().RunUntilIdle(); spdy_data.Resume(); @@ -20148,6 +20149,7 @@ NetLogWithSource::Make(NetLogSourceType::NONE)); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); + spdy_data.RunUntilPaused(); base::RunLoop().RunUntilIdle(); spdy_data.Resume(); @@ -20226,6 +20228,7 @@ NetLogWithSource::Make(NetLogSourceType::NONE)); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); + spdy_data2.RunUntilPaused(); base::RunLoop().RunUntilIdle(); spdy_data2.Resume();
diff --git a/net/http/http_proxy_connect_job_unittest.cc b/net/http/http_proxy_connect_job_unittest.cc index 2a851ce..c9e425a 100644 --- a/net/http/http_proxy_connect_job_unittest.cc +++ b/net/http/http_proxy_connect_job_unittest.cc
@@ -758,14 +758,14 @@ // previously, from a socket-perspective these need to be wrapped as data // frames. spdy::SpdySerializedFrame wrapped_second_hop_req( - new_spdy_util.ConstructWrappedSpdyFrame(second_hop_req, 1)); + spdy_util_.ConstructWrappedSpdyFrame(second_hop_req, 1)); spdy::SpdySerializedFrame second_hop_resp(new_spdy_util.ConstructSpdyGetReply( kSecondHopExtraResponseHeaders, std::size(kSecondHopExtraResponseHeaders) / 2, 1)); spdy::SpdySerializedFrame wrapped_second_hop_resp( - new_spdy_util.ConstructWrappedSpdyFrame(second_hop_resp, 1)); + spdy_util_.ConstructWrappedSpdyFrame(second_hop_resp, 1)); MockWrite spdy_writes[] = { CreateMockWrite(first_hop_req, 0),
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc index da1ecdacc..72cef5a8 100644 --- a/net/http/http_stream_factory_job_controller_unittest.cc +++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -710,7 +710,7 @@ // Tunnels aren't established for HTTP destinations. if (dest_url.SchemeIs(url::kHttpScheme)) continue; - reads.emplace_back(MockRead(ASYNC, mock_error.error)); + reads.emplace_back(ASYNC, mock_error.error); socket_data_proxy_main_job = std::make_unique<StaticSocketDataProvider>(reads, kTunnelWrites); socket_data_proxy_main_job2 = @@ -915,7 +915,7 @@ // Tunnels aren't established for HTTP destinations. if (dest_url.SchemeIs(url::kHttpScheme)) continue; - reads.emplace_back(MockRead(ASYNC, mock_error.error)); + reads.emplace_back(ASYNC, mock_error.error); socket_data_proxy_main_job = std::make_unique<StaticSocketDataProvider>(reads, kTunnelWrites); ssl_data_proxy_main_job = @@ -1023,6 +1023,478 @@ } } +// Same as above but using a multi-proxy chain, with errors encountered by the +// first proxy server in the chain. +TEST_F(JobControllerReconsiderProxyAfterErrorTest, + ReconsiderProxyAfterFirstNestedProxyErrorHttps) { + enum class ErrorPhase { + kHostResolution, + kTcpConnect, + kProxySslHandshake, + kTunnelRead, + }; + + const struct { + ErrorPhase phase; + net::Error error; + // For a description of this field, see the corresponding struct member + // comment in `ReconsiderProxyAfterErrorHttpsProxy`. + bool triggers_ssl_connect_job_retry_logic = false; + } kRetriableErrors[] = { + // These largely correspond to the list of errors in + // CanFalloverToNextProxy() which can occur with an HTTPS proxy. + // + // We omit `ERR_CONNECTION_CLOSED` because it is largely unreachable. The + // HTTP/1.1 parser maps it to `ERR_EMPTY_RESPONSE` or + // `ERR_RESPONSE_HEADERS_TRUNCATED` in most cases. + // + // TODO(davidben): Is omitting `ERR_EMPTY_RESPONSE` a bug in proxy error + // handling? + {ErrorPhase::kHostResolution, ERR_NAME_NOT_RESOLVED}, + {ErrorPhase::kTcpConnect, ERR_ADDRESS_UNREACHABLE}, + {ErrorPhase::kTcpConnect, ERR_CONNECTION_TIMED_OUT}, + {ErrorPhase::kTcpConnect, ERR_CONNECTION_RESET}, + {ErrorPhase::kTcpConnect, ERR_CONNECTION_ABORTED}, + {ErrorPhase::kTcpConnect, ERR_CONNECTION_REFUSED}, + {ErrorPhase::kProxySslHandshake, ERR_CERT_COMMON_NAME_INVALID}, + {ErrorPhase::kProxySslHandshake, ERR_SSL_PROTOCOL_ERROR, + /*triggers_ssl_connect_job_retry_logic=*/true}, + {ErrorPhase::kTunnelRead, ERR_TIMED_OUT}, + {ErrorPhase::kTunnelRead, ERR_SSL_PROTOCOL_ERROR}, + }; + + const ProxyServer kGoodProxyServer{ProxyServer::SCHEME_HTTPS, + HostPortPair("goodproxyserver", 100)}; + const ProxyServer kBadProxyServer1{ProxyServer::SCHEME_HTTPS, + HostPortPair("badproxyserver", 99)}; + const ProxyServer kBadProxyServer2{ + ProxyServer::SCHEME_HTTPS, HostPortPair("badfallbackproxyserver", 98)}; + const ProxyChain kNestedProxyChain1{{kBadProxyServer1, kGoodProxyServer}}; + const ProxyChain kNestedProxyChain2{{kBadProxyServer2, kGoodProxyServer}}; + + for (GURL dest_url : + {GURL("http://www.example.com"), GURL("https://www.example.com")}) { + SCOPED_TRACE(dest_url); + + for (const auto& mock_error : kRetriableErrors) { + SCOPED_TRACE(ErrorToString(mock_error.error)); + + CreateSessionDeps(); + + ProxyList proxy_list; + proxy_list.AddProxyChain(kNestedProxyChain1); + proxy_list.AddProxyChain(kNestedProxyChain2); + proxy_list.AddProxyChain(ProxyChain::Direct()); + ProxyConfig proxy_config = ProxyConfig::CreateForTesting(proxy_list); + + std::unique_ptr<ConfiguredProxyResolutionService> + proxy_resolution_service = + ConfiguredProxyResolutionService::CreateFixedForTest( + ProxyConfigWithAnnotation(proxy_config, + TRAFFIC_ANNOTATION_FOR_TESTS)); + + if (mock_error.triggers_ssl_connect_job_retry_logic) { + proxy_list.Clear(); + proxy_list.AddProxyChain(kNestedProxyChain1); + proxy_list.AddProxyChain(ProxyChain::Direct()); + ProxyConfig proxy_config2 = ProxyConfig::CreateForTesting(proxy_list); + + proxy_resolution_service = + ConfiguredProxyResolutionService::CreateFixedForTest( + ProxyConfigWithAnnotation(proxy_config2, + TRAFFIC_ANNOTATION_FOR_TESTS)); + } + auto test_proxy_delegate = std::make_unique<TestProxyDelegate>(); + + // Before starting the test, verify that there are no proxies marked as + // bad. + ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty()); + + constexpr char kTunnelRequest[] = + "CONNECT goodproxyserver:100 HTTP/1.1\r\n" + "Host: goodproxyserver:100\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const MockWrite kTunnelWrites[] = {{ASYNC, kTunnelRequest}}; + std::vector<MockRead> reads; + + // Generate identical errors for the first proxy server in both the main + // proxy chain and the fallback proxy chain. No alternative job is created + // for either, so only need one data provider for each, when the request + // makes it to the socket layer. + std::unique_ptr<StaticSocketDataProvider> socket_data_proxy_main_job; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job; + std::unique_ptr<StaticSocketDataProvider> socket_data_proxy_main_job2; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job2; + switch (mock_error.phase) { + case ErrorPhase::kHostResolution: + // Only ERR_NAME_NOT_RESOLVED can be returned by the mock host + // resolver. + DCHECK_EQ(ERR_NAME_NOT_RESOLVED, mock_error.error); + session_deps_.host_resolver->rules()->AddSimulatedFailure( + "badproxyserver"); + session_deps_.host_resolver->rules()->AddSimulatedFailure( + "badfallbackproxyserver"); + break; + case ErrorPhase::kTcpConnect: + socket_data_proxy_main_job = + std::make_unique<StaticSocketDataProvider>(); + socket_data_proxy_main_job->set_connect_data( + MockConnect(ASYNC, mock_error.error)); + socket_data_proxy_main_job2 = + std::make_unique<StaticSocketDataProvider>(); + socket_data_proxy_main_job2->set_connect_data( + MockConnect(ASYNC, mock_error.error)); + break; + case ErrorPhase::kProxySslHandshake: + socket_data_proxy_main_job = + std::make_unique<StaticSocketDataProvider>(); + ssl_data_proxy_main_job = + std::make_unique<SSLSocketDataProvider>(ASYNC, mock_error.error); + socket_data_proxy_main_job2 = + std::make_unique<StaticSocketDataProvider>(); + ssl_data_proxy_main_job2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, mock_error.error); + break; + case ErrorPhase::kTunnelRead: + // Note: Unlike for single-proxy chains, tunnels are established for + // HTTP destinations when multi-proxy chains are in use, so simulate + // tunnel read failures in all cases. + reads.emplace_back(ASYNC, mock_error.error); + socket_data_proxy_main_job = + std::make_unique<StaticSocketDataProvider>(reads, kTunnelWrites); + ssl_data_proxy_main_job = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + socket_data_proxy_main_job2 = + std::make_unique<StaticSocketDataProvider>(reads, kTunnelWrites); + ssl_data_proxy_main_job2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + break; + } + + if (socket_data_proxy_main_job) { + session_deps_.socket_factory->AddSocketDataProvider( + socket_data_proxy_main_job.get()); + session_deps_.socket_factory->AddSocketDataProvider( + socket_data_proxy_main_job2.get()); + } + if (ssl_data_proxy_main_job) { + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job.get()); + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job2.get()); + } + + // After both proxy chains fail, the request should fall back to using + // DIRECT, and succeed. + SSLSocketDataProvider ssl_data_first_request(ASYNC, OK); + StaticSocketDataProvider socket_data_direct_first_request; + socket_data_direct_first_request.set_connect_data(MockConnect(ASYNC, OK)); + session_deps_.socket_factory->AddSocketDataProvider( + &socket_data_direct_first_request); + // Only used in the HTTPS destination case, but harmless in the HTTP case. + session_deps_.socket_factory->AddSSLSocketDataProvider( + &ssl_data_first_request); + + // Second request should use DIRECT, skipping the bad proxies, and + // succeed. + SSLSocketDataProvider ssl_data_second_request(ASYNC, OK); + StaticSocketDataProvider socket_data_direct_second_request; + socket_data_direct_second_request.set_connect_data( + MockConnect(ASYNC, OK)); + session_deps_.socket_factory->AddSocketDataProvider( + &socket_data_direct_second_request); + session_deps_.socket_factory->AddSSLSocketDataProvider( + &ssl_data_second_request); + + // Now request a stream. It should succeed using the DIRECT fallback proxy + // option. + HttpRequestInfo request_info; + request_info.method = "GET"; + request_info.url = dest_url; + + proxy_resolution_service->SetProxyDelegate(test_proxy_delegate.get()); + Initialize(std::move(proxy_resolution_service)); + + // Start two requests. The first request should consume data from + // `socket_data_proxy_main_job` and `socket_data_direct_first_request`. + // The second request should consume data from + // `socket_data_direct_second_request`. + + for (size_t i = 0; i < 2; ++i) { + ProxyInfo used_proxy_info; + EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _)) + .Times(1) + .WillOnce(::testing::SaveArg<1>(&used_proxy_info)); + + std::unique_ptr<HttpStreamRequest> request = + CreateJobController(request_info); + RunUntilIdle(); + + // Verify that request was fetched without proxy. + EXPECT_TRUE(used_proxy_info.is_direct()); + + // The proxies that failed should now be known to the proxy service as + // bad. + const ProxyRetryInfoMap& retry_info = + session_->proxy_resolution_service()->proxy_retry_info(); + if (!mock_error.triggers_ssl_connect_job_retry_logic) { + ASSERT_THAT(retry_info, SizeIs(2)); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain1))); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain2))); + } else { + ASSERT_THAT(retry_info, SizeIs(1)); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain1))); + } + + // The idle socket should have been added back to the socket pool. Close + // it, so the next loop iteration creates a new socket instead of + // reusing the idle one. + auto* socket_pool = session_->GetSocketPool( + HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyChain::Direct()); + EXPECT_EQ(1, socket_pool->IdleSocketCount()); + socket_pool->CloseIdleSockets("Close socket reason"); + } + EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_)); + } + } +} + +// Same as above but using a multi-proxy chain, with errors encountered by the +// second proxy server in the chain. +TEST_F(JobControllerReconsiderProxyAfterErrorTest, + ReconsiderProxyAfterSecondNestedProxyErrorHttps) { + enum class ErrorPhase { + // Note: Skip the kHostResolution and kTcpConnect cases for this test since + // those only make sense for connections to the first proxy server. + kProxySslHandshake, + kTunnelRead, + }; + + const struct { + ErrorPhase phase; + net::Error error; + // For a description of this field, see the corresponding struct member + // comment in `ReconsiderProxyAfterErrorHttpsProxy`. + bool triggers_ssl_connect_job_retry_logic = false; + } kRetriableErrors[] = { + // These largely correspond to the list of errors in + // CanFalloverToNextProxy() which can occur with an HTTPS proxy. + // + // We omit `ERR_CONNECTION_CLOSED` because it is largely unreachable. The + // HTTP/1.1 parser maps it to `ERR_EMPTY_RESPONSE` or + // `ERR_RESPONSE_HEADERS_TRUNCATED` in most cases. + // + // TODO(davidben): Is omitting `ERR_EMPTY_RESPONSE` a bug in proxy error + // handling? + {ErrorPhase::kProxySslHandshake, ERR_CERT_COMMON_NAME_INVALID}, + {ErrorPhase::kProxySslHandshake, ERR_SSL_PROTOCOL_ERROR, + /*triggers_ssl_connect_job_retry_logic=*/true}, + {ErrorPhase::kTunnelRead, ERR_TIMED_OUT}, + {ErrorPhase::kTunnelRead, ERR_SSL_PROTOCOL_ERROR}, + }; + + const ProxyServer kGoodProxyServer{ProxyServer::SCHEME_HTTPS, + HostPortPair("goodproxyserver", 100)}; + const ProxyServer kBadProxyServer1{ProxyServer::SCHEME_HTTPS, + HostPortPair("badproxyserver", 99)}; + const ProxyServer kBadProxyServer2{ + ProxyServer::SCHEME_HTTPS, HostPortPair("badfallbackproxyserver", 98)}; + const ProxyChain kNestedProxyChain1{{kGoodProxyServer, kBadProxyServer1}}; + const ProxyChain kNestedProxyChain2{{kGoodProxyServer, kBadProxyServer2}}; + + for (GURL dest_url : + {GURL("http://www.example.com"), GURL("https://www.example.com")}) { + SCOPED_TRACE(dest_url); + + for (const auto& mock_error : kRetriableErrors) { + SCOPED_TRACE(ErrorToString(mock_error.error)); + + CreateSessionDeps(); + + ProxyList proxy_list; + proxy_list.AddProxyChain(kNestedProxyChain1); + proxy_list.AddProxyChain(kNestedProxyChain2); + proxy_list.AddProxyChain(ProxyChain::Direct()); + ProxyConfig proxy_config = ProxyConfig::CreateForTesting(proxy_list); + + std::unique_ptr<ConfiguredProxyResolutionService> + proxy_resolution_service = + ConfiguredProxyResolutionService::CreateFixedForTest( + ProxyConfigWithAnnotation(proxy_config, + TRAFFIC_ANNOTATION_FOR_TESTS)); + + if (mock_error.triggers_ssl_connect_job_retry_logic) { + proxy_list.Clear(); + proxy_list.AddProxyChain(kNestedProxyChain1); + proxy_list.AddProxyChain(ProxyChain::Direct()); + ProxyConfig proxy_config2 = ProxyConfig::CreateForTesting(proxy_list); + + proxy_resolution_service = + ConfiguredProxyResolutionService::CreateFixedForTest( + ProxyConfigWithAnnotation(proxy_config2, + TRAFFIC_ANNOTATION_FOR_TESTS)); + } + auto test_proxy_delegate = std::make_unique<TestProxyDelegate>(); + + // Before starting the test, verify that there are no proxies marked as + // bad. + ASSERT_TRUE(proxy_resolution_service->proxy_retry_info().empty()); + + constexpr char kBadProxyServer1TunnelRequest[] = + "CONNECT badproxyserver:99 HTTP/1.1\r\n" + "Host: badproxyserver:99\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + constexpr char kBadProxyServer2TunnelRequest[] = + "CONNECT badfallbackproxyserver:98 HTTP/1.1\r\n" + "Host: badfallbackproxyserver:98\r\n" + "Proxy-Connection: keep-alive\r\n\r\n"; + const std::string kEndpointTunnelRequest = base::StringPrintf( + "CONNECT %s HTTP/1.1\r\n" + "Host: %s\r\n" + "Proxy-Connection: keep-alive\r\n\r\n", + HostPortPair::FromURL(dest_url).ToString().c_str(), + HostPortPair::FromURL(dest_url).ToString().c_str()); + const MockWrite kNestedProxyChain1TunnelWrites[] = { + {ASYNC, kBadProxyServer1TunnelRequest}, + {ASYNC, kEndpointTunnelRequest.c_str()}}; + const MockWrite kNestedProxyChain2TunnelWrites[] = { + {ASYNC, kBadProxyServer2TunnelRequest}, + {ASYNC, kEndpointTunnelRequest.c_str()}}; + + std::vector<MockRead> reads = { + MockRead(ASYNC, 1, "HTTP/1.1 200 Connection Established\r\n\r\n"), + }; + + // Generate identical errors for the second proxy server in both the main + // proxy chain and the fallback proxy chain. No alternative job is created + // for either, so only need one data provider for each, when the request + // makes it to the socket layer. + std::unique_ptr<StaticSocketDataProvider> socket_data_proxy_main_job; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job_server1; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job_server2; + std::unique_ptr<StaticSocketDataProvider> socket_data_proxy_main_job2; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job2_server1; + std::unique_ptr<SSLSocketDataProvider> ssl_data_proxy_main_job2_server2; + + ssl_data_proxy_main_job_server1 = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + ssl_data_proxy_main_job2_server1 = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + + switch (mock_error.phase) { + case ErrorPhase::kProxySslHandshake: + ssl_data_proxy_main_job_server2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, mock_error.error); + ssl_data_proxy_main_job2_server2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, mock_error.error); + break; + case ErrorPhase::kTunnelRead: + // Note: Unlike for single-proxy chains, tunnels are established for + // HTTP destinations when multi-proxy chains are in use, so simulate + // tunnel read failures in all cases. + reads.emplace_back(ASYNC, mock_error.error); + ssl_data_proxy_main_job_server2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + ssl_data_proxy_main_job2_server2 = + std::make_unique<SSLSocketDataProvider>(ASYNC, OK); + break; + } + socket_data_proxy_main_job = std::make_unique<StaticSocketDataProvider>( + reads, kNestedProxyChain1TunnelWrites); + socket_data_proxy_main_job2 = std::make_unique<StaticSocketDataProvider>( + reads, mock_error.triggers_ssl_connect_job_retry_logic + ? kNestedProxyChain1TunnelWrites + : kNestedProxyChain2TunnelWrites); + + session_deps_.socket_factory->AddSocketDataProvider( + socket_data_proxy_main_job.get()); + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job_server1.get()); + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job_server2.get()); + + session_deps_.socket_factory->AddSocketDataProvider( + socket_data_proxy_main_job2.get()); + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job2_server1.get()); + session_deps_.socket_factory->AddSSLSocketDataProvider( + ssl_data_proxy_main_job2_server2.get()); + + // After both proxy chains fail, the request should fall back to using + // DIRECT, and succeed. + SSLSocketDataProvider ssl_data_first_request(ASYNC, OK); + StaticSocketDataProvider socket_data_direct_first_request; + socket_data_direct_first_request.set_connect_data(MockConnect(ASYNC, OK)); + session_deps_.socket_factory->AddSocketDataProvider( + &socket_data_direct_first_request); + session_deps_.socket_factory->AddSSLSocketDataProvider( + &ssl_data_first_request); + + // Second request should use DIRECT, skipping the bad proxies, and + // succeed. + SSLSocketDataProvider ssl_data_second_request(ASYNC, OK); + StaticSocketDataProvider socket_data_direct_second_request; + socket_data_direct_second_request.set_connect_data( + MockConnect(ASYNC, OK)); + session_deps_.socket_factory->AddSocketDataProvider( + &socket_data_direct_second_request); + // Only used in the HTTPS destination case, but harmless in the HTTP case. + session_deps_.socket_factory->AddSSLSocketDataProvider( + &ssl_data_second_request); + + // Now request a stream. It should succeed using the DIRECT fallback proxy + // option. + HttpRequestInfo request_info; + request_info.method = "GET"; + request_info.url = dest_url; + + proxy_resolution_service->SetProxyDelegate(test_proxy_delegate.get()); + Initialize(std::move(proxy_resolution_service)); + + // Start two requests. The first request should consume data from + // `socket_data_proxy_main_job` and `socket_data_direct_first_request`. + // The second request should consume data from + // `socket_data_direct_second_request`. + + for (size_t i = 0; i < 2; ++i) { + ProxyInfo used_proxy_info; + EXPECT_CALL(request_delegate_, OnStreamReadyImpl(_, _, _)) + .Times(1) + .WillOnce(::testing::SaveArg<1>(&used_proxy_info)); + + std::unique_ptr<HttpStreamRequest> request = + CreateJobController(request_info); + RunUntilIdle(); + + // Verify that request was fetched without proxy. + EXPECT_TRUE(used_proxy_info.is_direct()); + + // The proxies that failed should now be known to the proxy service as + // bad. + const ProxyRetryInfoMap& retry_info = + session_->proxy_resolution_service()->proxy_retry_info(); + if (!mock_error.triggers_ssl_connect_job_retry_logic) { + ASSERT_THAT(retry_info, SizeIs(2)); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain1))); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain2))); + } else { + ASSERT_THAT(retry_info, SizeIs(1)); + EXPECT_THAT(retry_info, Contains(Key(kNestedProxyChain1))); + } + + // The idle socket should have been added back to the socket pool. Close + // it, so the next loop iteration creates a new socket instead of + // reusing the idle one. + auto* socket_pool = session_->GetSocketPool( + HttpNetworkSession::NORMAL_SOCKET_POOL, ProxyChain::Direct()); + EXPECT_EQ(1, socket_pool->IdleSocketCount()); + socket_pool->CloseIdleSockets("Close socket reason"); + } + EXPECT_TRUE(HttpStreamFactoryPeer::IsJobControllerDeleted(factory_)); + } + } +} + // Test proxy fallback logic for an IP Protection request. TEST_F(JobControllerReconsiderProxyAfterErrorTest, ReconsiderProxyForIpProtection) { @@ -1162,7 +1634,7 @@ MockConnect(ASYNC, mock_error.error)); break; case ErrorPhase::kTunnelRead: - reads.emplace_back(MockRead(ASYNC, mock_error.error)); + reads.emplace_back(ASYNC, mock_error.error); socket_data_proxy_main_job = std::make_unique<StaticSocketDataProvider>(reads, kTunnelWrites); socket_data_proxy_main_job2 =
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 0850af1..dac64ce 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-12-12 12:54 UTC +# Last updated: 2023-12-13 12:53 UTC PinsListTimestamp -1702385651 +1702472038 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 6fdb980..509bd22 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2023-12-12 12:54 UTC +// Last updated: 2023-12-13 12:53 UTC // { "pinsets": [
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index 3c7eeb5f..2bd2c82 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -859,10 +859,17 @@ proto_in_dir = "src" deps = [ - "//base", + "//base" + ] + + proto_deps = [ "//third_party/anonymous_tokens:anonymous_tokens_cc_proto", ] + proto_data_sources = [ + "//third_party/anonymous_tokens/src/anonymous_tokens/proto/anonymous_tokens.proto", + ] + import_dirs = [ "//third_party/anonymous_tokens/src/" ] defines = [ "IS_QUICHE_IMPL" ]
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index be93ded..e083d0a 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -7408,8 +7408,6 @@ ResourceRequest my_request; my_request.trust_token_params = OptionalTrustTokenParams(mojom::TrustTokenParams::New()); - my_request.trust_token_params->version = - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; my_request.trust_token_params->operation = mojom::TrustTokenOperationType::kRedemption; @@ -7470,8 +7468,6 @@ ResourceRequest my_request; my_request.trust_token_params = OptionalTrustTokenParams(mojom::TrustTokenParams::New()); - my_request.trust_token_params->version = - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; my_request.trust_token_params->operation = mojom::TrustTokenOperationType::kIssuance;
diff --git a/services/network/network_service_proxy_delegate_unittest.cc b/services/network/network_service_proxy_delegate_unittest.cc index 0246adce..ccec576d 100644 --- a/services/network/network_service_proxy_delegate_unittest.cc +++ b/services/network/network_service_proxy_delegate_unittest.cc
@@ -701,7 +701,8 @@ auto ipp_config_cache = std::make_unique<MockIpProtectionConfigCache>(); ipp_config_cache->SetNextAuthToken(MakeAuthToken("Bearer: a-token")); - ipp_config_cache->SetProxyList({{"ippro-1"}, {"ippro-2"}}); + ipp_config_cache->SetProxyList( + {{"ippro-1", "ippro-2"}, {"ippro-2", "ippro-2"}}); delegate->SetIpProtectionConfigCache(std::move(ipp_config_cache)); net::ProxyInfo result; @@ -717,16 +718,17 @@ expected_proxy_list.AddProxyServer( net::PacResultElementToProxyServer("PROXY bar")); - auto ip_protection_proxy_chain_1 = - net::ProxyChain(net::PacResultElementToProxyServer("HTTPS ippro-1")) - .ForIpProtection(); - expected_proxy_list.AddProxyChain(std::move(ip_protection_proxy_chain_1)); + const net::ProxyServer kProxyServer1{net::ProxyServer::SCHEME_HTTPS, + net::HostPortPair("ippro-1", 443)}; + const net::ProxyServer kProxyServer2{net::ProxyServer::SCHEME_HTTPS, + net::HostPortPair("ippro-2", 443)}; + const net::ProxyChain kIpProtectionChain1 = + net::ProxyChain({kProxyServer1, kProxyServer2}).ForIpProtection(); + const net::ProxyChain kIpProtectionChain2 = + net::ProxyChain({kProxyServer2, kProxyServer2}).ForIpProtection(); - auto ip_protection_proxy_chain_2 = - net::ProxyChain(net::PacResultElementToProxyServer("HTTPS ippro-2")) - .ForIpProtection(); - expected_proxy_list.AddProxyChain(std::move(ip_protection_proxy_chain_2)); - + expected_proxy_list.AddProxyChain(std::move(kIpProtectionChain1)); + expected_proxy_list.AddProxyChain(std::move(kIpProtectionChain2)); expected_proxy_list.AddProxyServer(net::ProxyServer::Direct()); expected_proxy_list.AddProxyServer( net::PacResultElementToProxyServer("PROXY weird"));
diff --git a/services/network/public/cpp/optional_trust_token_params_unittest.cc b/services/network/public/cpp/optional_trust_token_params_unittest.cc index 637f0dd..6165b55 100644 --- a/services/network/public/cpp/optional_trust_token_params_unittest.cc +++ b/services/network/public/cpp/optional_trust_token_params_unittest.cc
@@ -25,7 +25,6 @@ // changes. OptionalTrustTokenParams NonemptyTrustTokenParams() { return mojom::TrustTokenParams( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, mojom::TrustTokenOperationType::kRedemption, mojom::TrustTokenRefreshPolicy::kRefresh, "custom_key_commitment", url::Origin::Create(GURL("https://custom-issuer.com")), @@ -81,11 +80,6 @@ TEST(OptionalTrustTokenParams, Dereference) { OptionalTrustTokenParams in = NonemptyTrustTokenParams(); - EXPECT_EQ(in->version, mojom::TrustTokenMajorVersion::kPrivateStateTokenV1); - EXPECT_EQ(in.as_ptr()->version, - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1); - EXPECT_EQ(in.value().version, - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1); EXPECT_EQ(in->operation, mojom::TrustTokenOperationType::kRedemption); EXPECT_EQ(in.as_ptr()->operation, mojom::TrustTokenOperationType::kRedemption);
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc index 2f53aa8..90740ec 100644 --- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc +++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -124,8 +124,6 @@ original.trust_token_params = network::mojom::TrustTokenParams(); original.trust_token_params->issuers.push_back( url::Origin::Create(GURL("https://issuer.com"))); - original.trust_token_params->version = - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; original.trust_token_params->operation = mojom::TrustTokenOperationType::kRedemption; original.trust_token_params->include_timestamp_header = true;
diff --git a/services/network/public/mojom/trust_tokens.mojom b/services/network/public/mojom/trust_tokens.mojom index c7995c8..987c3199 100644 --- a/services/network/public/mojom/trust_tokens.mojom +++ b/services/network/public/mojom/trust_tokens.mojom
@@ -7,13 +7,6 @@ import "url/mojom/origin.mojom"; import "mojo/public/mojom/base/time.mojom"; -// Supported Trust Token versions. A new item is added to this enum when a new -// version is available. Version resolution will be carried based on the -// version specified in TrustTokenParams. -enum TrustTokenMajorVersion { - kPrivateStateTokenV1, -}; - // TrustTokenProtocolVersion enumerates the versions of Trust Token that the // client knows about. Different versions represent different configuration // flows, data structure meanings, etc and may require clearing the database @@ -132,9 +125,6 @@ // operation. struct TrustTokenParams { // Required. - TrustTokenMajorVersion version; - - // Required. TrustTokenOperationType operation; // Required exactly when "operation" is "kRedemption"; specifies whether the @@ -224,8 +214,6 @@ }; struct TrustTokenKeyCommitmentResult { - TrustTokenMajorVersion version; - // |protocol_version| is the Trust Token version that this key commitment is // for. TrustTokenProtocolVersion protocol_version;
diff --git a/services/network/test/trust_token_test_util.cc b/services/network/test/trust_token_test_util.cc index ba47f4d..d836790 100644 --- a/services/network/test/trust_token_test_util.cc +++ b/services/network/test/trust_token_test_util.cc
@@ -65,13 +65,6 @@ return future.Get(); } -int TrustTokenEnumToInt(mojom::TrustTokenMajorVersion version) { - if (version == mojom::TrustTokenMajorVersion::kPrivateStateTokenV1) { - return 1; - } - return 0; -} - std::string TrustTokenEnumToString(mojom::TrustTokenOperationType operation) { switch (operation) { case mojom::TrustTokenOperationType::kIssuance: @@ -125,7 +118,7 @@ const TrustTokenTestParameters&) = default; TrustTokenTestParameters::TrustTokenTestParameters( - network::mojom::TrustTokenMajorVersion version, + int version, network::mojom::TrustTokenOperationType operation, absl::optional<network::mojom::TrustTokenRefreshPolicy> refresh_policy, absl::optional<std::vector<std::string>> issuer_specs) @@ -141,9 +134,8 @@ auto parameters = base::Value::Dict() - .Set("version", TrustTokenEnumToInt(input.version)) + .Set("version", input.version) .Set("operation", TrustTokenEnumToString(input.operation)); - trust_token_params->version = input.version; trust_token_params->operation = input.operation; if (input.refresh_policy.has_value()) {
diff --git a/services/network/test/trust_token_test_util.h b/services/network/test/trust_token_test_util.h index 5b06510..90388b9 100644 --- a/services/network/test/trust_token_test_util.h +++ b/services/network/test/trust_token_test_util.h
@@ -106,7 +106,7 @@ // TrustTokenTestParameters (when serialized, nullopt in an optional field // will be omitted from the parameter's value): TrustTokenTestParameters( - mojom::TrustTokenMajorVersion version, + int version, mojom::TrustTokenOperationType operation, absl::optional<mojom::TrustTokenRefreshPolicy> refresh_policy, absl::optional<std::vector<std::string>> issuer_specs); @@ -116,7 +116,7 @@ TrustTokenTestParameters(const TrustTokenTestParameters&); TrustTokenTestParameters& operator=(const TrustTokenTestParameters&); - mojom::TrustTokenMajorVersion version; + int version; mojom::TrustTokenOperationType operation; absl::optional<mojom::TrustTokenRefreshPolicy> refresh_policy; // Because static initialization of GURLs/Origins isn't allowed in tests, use @@ -128,7 +128,6 @@ // Serializes the value of a Trust Tokens enum parameter to its JS string // representation. Must be kept in sync with the corresponding IDL enum // definition. -std::string TrustTokenEnumToString(mojom::TrustTokenMajorVersion version); std::string TrustTokenEnumToString(mojom::TrustTokenOperationType operation); std::string TrustTokenEnumToString(mojom::TrustTokenRefreshPolicy policy); std::string TrustTokenEnumToString( @@ -166,41 +165,37 @@ // parameters; see above for a more detailed description of the intended use. const TrustTokenTestParameters kIssuanceTrustTokenTestParameters[]{ // For issuance, there are no additional parameters to specify. - TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - mojom::TrustTokenOperationType::kIssuance, - absl::nullopt, - absl::nullopt)}; + TrustTokenTestParameters(1, + mojom::TrustTokenOperationType::kIssuance, + absl::nullopt, + absl::nullopt)}; const TrustTokenTestParameters kRedemptionTrustTokenTestParameters[]{ // For redemption, there is one free parameter, refreshPolicy, with two // values (and a default). - TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - mojom::TrustTokenOperationType::kRedemption, - mojom::TrustTokenRefreshPolicy::kRefresh, - absl::nullopt), - TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - mojom::TrustTokenOperationType::kRedemption, - mojom::TrustTokenRefreshPolicy::kUseCached, - absl::nullopt), - TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, - mojom::TrustTokenOperationType::kRedemption, - absl::nullopt, - absl::nullopt)}; + TrustTokenTestParameters(1, + mojom::TrustTokenOperationType::kRedemption, + mojom::TrustTokenRefreshPolicy::kRefresh, + absl::nullopt), + TrustTokenTestParameters(1, + mojom::TrustTokenOperationType::kRedemption, + mojom::TrustTokenRefreshPolicy::kUseCached, + absl::nullopt), + TrustTokenTestParameters(1, + mojom::TrustTokenOperationType::kRedemption, + absl::nullopt, + absl::nullopt)}; const TrustTokenTestParameters kSigningTrustTokenTestParameters[]{ // Signing's inputs are issuers; "issuers" must be nonempty and must only // contain secure origins. TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, + 1, mojom::TrustTokenOperationType::kSigning, absl::nullopt, std::vector<std::string>{"https://issuer.example"}), TrustTokenTestParameters( - mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, + 1, mojom::TrustTokenOperationType::kSigning, absl::nullopt, std::vector<std::string>{"https://issuer.example",
diff --git a/testing/buildbot/filters/cr23.linux.cr23_browser_tests.filter b/testing/buildbot/filters/cr23.linux.cr23_browser_tests.filter index 825f57e..0009af06 100644 --- a/testing/buildbot/filters/cr23.linux.cr23_browser_tests.filter +++ b/testing/buildbot/filters/cr23.linux.cr23_browser_tests.filter
@@ -1,3 +1 @@ # cr23_browser_tests that are expected to fail on linux bots: --FullscreenTabSearchBubbleDialogTest.InvokeUi_default --IntentChipButtonBrowserTest.ShowsAppIconInChip
diff --git a/testing/buildbot/filters/cr23.linux.cr23_interactive_ui_tests.filter b/testing/buildbot/filters/cr23.linux.cr23_interactive_ui_tests.filter index 3dd8a4c..89b6c43 100644 --- a/testing/buildbot/filters/cr23.linux.cr23_interactive_ui_tests.filter +++ b/testing/buildbot/filters/cr23.linux.cr23_interactive_ui_tests.filter
@@ -1,12 +1,5 @@ # cr23_interactive_ui_tests that are expected to fail on linux bots: --AppMenuFullscreenInteractiveTest.ClosingTab --PermissionIndicatorsInteractiveUITest.CameraAccessAndStopTest --PermissionIndicatorsInteractiveUITest.CameraAndMicAccessAndStopTest -PermissionsFlowInteractiveUITest.CameraActivityIndicatorTest -PermissionsFlowInteractiveUITest.CameraAndMicrophoneActivityIndicatorTest -PermissionsFlowInteractiveUITest.MicrophoneActivityIndicatorTest --PriceTrackingBubbleInteractiveTest.TrackPriceOnFUEBubble --PriceTrackingBubbleInteractiveTest.UnrackPriceOnNormalBubble --PriceTrackingIconViewErrorHandelingTest.IconRevertedOnFailure -PriceTrackingIconViewInteractiveTest.EnablePriceTrackOnPress --PriceTrackingIconViewInteractiveTest.TrackedProductIsDifferentBookmark
diff --git a/testing/buildbot/filters/cr23.mac.cr23_browser_tests.filter b/testing/buildbot/filters/cr23.mac.cr23_browser_tests.filter index 85c7721..9951351 100644 --- a/testing/buildbot/filters/cr23.mac.cr23_browser_tests.filter +++ b/testing/buildbot/filters/cr23.mac.cr23_browser_tests.filter
@@ -1,11 +1 @@ # cr23_browser_tests that are expected to fail on mac bots: --AccessibilityFocusHighlightBrowserTest.FocusAppearance --CompanionPageBrowserTest.ReloadWillRefreshCompanion --IntentChipButtonBrowserTest.ShowsAppIconInChip --LiveCaptionControllerTest.DispatchTranscription_MultipleProfiles --LiveCaptionControllerTest.LiveCaptionEnabledChanged_MultipleProfiles --LiveCaptionControllerTest.OnAudioStreamEnd_MultipleProfiles --LiveCaptionControllerTest.OnError_MultipleProfiles --LoadImageBrowserTest.LoadImage --LoadImageBrowserTest.LoadImageWithMap --PrivacySandboxDialogSmallWindowTest.All
diff --git a/testing/buildbot/filters/cr23.mac.cr23_interactive_ui_tests.filter b/testing/buildbot/filters/cr23.mac.cr23_interactive_ui_tests.filter index f6993e9..765cb5f 100644 --- a/testing/buildbot/filters/cr23.mac.cr23_interactive_ui_tests.filter +++ b/testing/buildbot/filters/cr23.mac.cr23_interactive_ui_tests.filter
@@ -1,15 +1,8 @@ # cr23_interactive_ui_tests that are expected to fail on mac bots: --AppMenuFullscreenInteractiveTest.ClosingTab --PermissionIndicatorsInteractiveUITest.CameraAccessAndStopTest --PermissionIndicatorsInteractiveUITest.CameraAndMicAccessAndStopTest -PermissionsFlowInteractiveUITest.CameraActivityIndicatorTest -PermissionsFlowInteractiveUITest.CameraAndMicrophoneActivityIndicatorTest -PermissionsFlowInteractiveUITest.MicrophoneActivityIndicatorTest --PriceTrackingBubbleInteractiveTest.TrackPriceOnFUEBubble --PriceTrackingBubbleInteractiveTest.UnrackPriceOnNormalBubble --PriceTrackingIconViewErrorHandelingTest.IconRevertedOnFailure -PriceTrackingIconViewInteractiveTest.EnablePriceTrackOnPress --PriceTrackingIconViewInteractiveTest.TrackedProductIsDifferentBookmark # This may be a flaky failure unrelated to the cr23 code paths. -SitePerProcessInteractivePDFTest.ContextMenuPositionForEmbeddedPDFInCrossOriginFrame
diff --git a/testing/buildbot/filters/cr23.win.cr23_browser_tests.filter b/testing/buildbot/filters/cr23.win.cr23_browser_tests.filter index f0351ba..4607693 100644 --- a/testing/buildbot/filters/cr23.win.cr23_browser_tests.filter +++ b/testing/buildbot/filters/cr23.win.cr23_browser_tests.filter
@@ -1,3 +1 @@ # cr23_browser_tests that are expected to fail on win bots: --IntentChipButtonBrowserTest.ShowsAppIconInChip --OutOfMemoryReporterPrerenderBrowserTest.NotReportedOnPrerenderPage
diff --git a/testing/buildbot/filters/cr23.win.cr23_interactive_ui_tests.filter b/testing/buildbot/filters/cr23.win.cr23_interactive_ui_tests.filter index 19908038..4a9ea9d 100644 --- a/testing/buildbot/filters/cr23.win.cr23_interactive_ui_tests.filter +++ b/testing/buildbot/filters/cr23.win.cr23_interactive_ui_tests.filter
@@ -1,13 +1,5 @@ # cr2023_interactive_ui_tests that are expected to fail on win bots: --AppMenuFullscreenInteractiveTest.ClosingTab --PermissionIndicatorsInteractiveUITest.CameraAccessAndStopTest --PermissionIndicatorsInteractiveUITest.CameraAndMicAccessAndStopTest -PermissionsFlowInteractiveUITest.CameraActivityIndicatorTest -PermissionsFlowInteractiveUITest.CameraAndMicrophoneActivityIndicatorTest -PermissionsFlowInteractiveUITest.MicrophoneActivityIndicatorTest --PriceTrackingBubbleInteractiveTest.TrackPriceOnFUEBubble --PriceTrackingBubbleInteractiveTest.UnrackPriceOnNormalBubble --PriceTrackingIconViewErrorHandelingTest.IconRevertedOnFailure -PriceTrackingIconViewInteractiveTest.EnablePriceTrackOnPress --PriceTrackingIconViewInteractiveTest.TrackedProductIsDifferentBookmark --TooltipBrowserTest.ShowTooltipFromWebContentWithCursor
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 355c4ac..2a9fd5498 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2818,29 +2818,6 @@ ] } ], - "BrowsingTopicsParameters": [ - { - "platforms": [ - "android", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "PrioritizeHighUtilityTopics", - "params": { - "prioritized_topics_list": "57,86,126,149,172,180,196,207,239,254,263,272,289,299,332" - }, - "enable_features": [ - "BrowsingTopicsParameters" - ] - } - ] - } - ], "BubbleMetricsApi": [ { "platforms": [ @@ -4034,9 +4011,6 @@ "params": { "allow_bookmark_type_swapping": "true", "autodismiss_enabled": "true", - "bookmark_compact_visuals_enabled": "true", - "bookmark_in_app_menu": "true", - "bookmark_visuals_enabled": "true", "enable_persisted_tab_data_maintenance": "true", "enable_price_notification": "true", "enable_price_tracking": "true", @@ -4045,7 +4019,6 @@ }, "enable_features": [ "BookmarksImprovedSaveFlow", - "BookmarksRefresh", "CommercePriceTracking", "OptimizationGuidePushNotifications", "ReadLater", @@ -4131,8 +4104,6 @@ "params": { "autodismiss_enabled": "true", "bookmark_compact_visuals_enabled": "true", - "bookmark_in_app_menu": "true", - "bookmark_visuals_enabled": "true", "enable_persisted_tab_data_maintenance": "true", "enable_price_notification": "true", "enable_price_tracking": "true", @@ -4141,7 +4112,6 @@ }, "enable_features": [ "BookmarksImprovedSaveFlow", - "BookmarksRefresh", "CommercePriceTracking", "OptimizationGuidePushNotifications", "ReadLater", @@ -4167,8 +4137,6 @@ "allow_bookmark_type_swapping": "true", "autodismiss_enabled": "true", "bookmark_compact_visuals_enabled": "true", - "bookmark_in_app_menu": "true", - "bookmark_visuals_enabled": "true", "enable_persisted_tab_data_maintenance": "true", "enable_price_notification": "true", "enable_price_tracking": "true", @@ -4177,7 +4145,6 @@ }, "enable_features": [ "BookmarksImprovedSaveFlow", - "BookmarksRefresh", "CommercePriceTracking", "OptimizationGuidePushNotifications", "ReadLater", @@ -4190,8 +4157,6 @@ "allow_bookmark_type_swapping": "true", "autodismiss_enabled": "true", "bookmark_compact_visuals_enabled": "true", - "bookmark_in_app_menu": "true", - "bookmark_visuals_enabled": "true", "enable_persisted_tab_data_maintenance": "true", "enable_price_notification": "true", "enable_price_tracking": "true", @@ -4201,7 +4166,6 @@ }, "enable_features": [ "BookmarksImprovedSaveFlow", - "BookmarksRefresh", "CommercePriceTracking", "OptimizationGuidePushNotifications", "ReadLater", @@ -5583,6 +5547,37 @@ ] } ], + "DesktopLinkCapturingPWAExperiment": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_DefaultOn", + "params": { + "link_capturing_guardrail_storage_duration": "60", + "on_by_default": "true" + }, + "enable_features": [ + "DesktopPWAsLinkCapturing" + ] + }, + { + "name": "Enabled_DefaultOff", + "params": { + "link_capturing_guardrail_storage_duration": "60", + "on_by_default": "false" + }, + "enable_features": [ + "DesktopPWAsLinkCapturing" + ] + } + ] + } + ], "DesktopNtpDriveCache": [ { "platforms": [ @@ -10858,6 +10853,28 @@ ] } ], + "ModalMemorySaver": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "modal_memory_saver_mode": "2" + }, + "enable_features": [ + "ModalMemorySaver" + ] + } + ] + } + ], "MojoInlineMessagePayloads": [ { "platforms": [ @@ -14018,6 +14035,21 @@ ] } ], + "PrivacySandboxAdsNoticeCCT": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PrivacySandboxAdsNoticeCCT" + ] + } + ] + } + ], "PrivacySandboxEnrollment": [ { "platforms": [ @@ -15203,6 +15235,22 @@ ] } ], + "RestartToGainAccessToKeychain": [ + { + "platforms": [ + "linux", + "mac" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "RestartToGainAccessToKeychain" + ] + } + ] + } + ], "RestoreSyncedPlaceholderTabs": [ { "platforms": [
diff --git a/third_party/anonymous_tokens/BUILD.gn b/third_party/anonymous_tokens/BUILD.gn index c6099c9f..c4339f3 100644 --- a/third_party/anonymous_tokens/BUILD.gn +++ b/third_party/anonymous_tokens/BUILD.gn
@@ -95,12 +95,6 @@ } proto_library("anonymous_tokens_cc_proto") { - visibility = [ - ":*", - "//net/third_party/quiche:blind_sign_auth_proto", - "//net/third_party/quiche:blind_sign_auth_proto_gen", - ] - sources = [ "src/anonymous_tokens/proto/anonymous_tokens.proto" ] component_build_force_source_set = true
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 5b6ebe2..8e716772 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -401,7 +401,8 @@ // Comma separated list of Topic IDs. Prioritize these topics and their // descendants during top topic selection. const base::FeatureParam<std::string> kBrowsingTopicsPrioritizedTopicsList{ - &kBrowsingTopicsParameters, "prioritized_topics_list", ""}; + &kBrowsingTopicsParameters, "prioritized_topics_list", + "57,86,126,149,172,180,196,207,239,254,263,272,289,299,332"}; // Suppresses console errors for CORS problems which report an associated // inspector issue anyway.
diff --git a/third_party/blink/public/mojom/printing/web_printing.mojom b/third_party/blink/public/mojom/printing/web_printing.mojom index 5b501d5..5eaa730 100644 --- a/third_party/blink/public/mojom/printing/web_printing.mojom +++ b/third_party/blink/public/mojom/printing/web_printing.mojom
@@ -5,6 +5,7 @@ module blink.mojom; import "third_party/blink/public/mojom/blob/blob.mojom"; +import "ui/gfx/geometry/mojom/geometry.mojom"; enum WebPrintingMultipleDocumentHandling { kSeparateDocumentsCollatedCopies, @@ -41,6 +42,9 @@ WebPrintingMultipleDocumentHandling multiple_document_handling_default; array<WebPrintingMultipleDocumentHandling> multiple_document_handling_supported; + gfx.mojom.Size printer_resolution_default; + array<gfx.mojom.Size> printer_resolution_supported; + WebPrintColorMode print_color_mode_default; array<WebPrintColorMode> print_color_mode_supported; @@ -53,6 +57,7 @@ uint32 copies; WebPrintingMultipleDocumentHandling? multiple_document_handling; + gfx.mojom.Size? printer_resolution; WebPrintColorMode? print_color_mode; WebPrintingSides? sides; };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index 3ccb0d8..4f8d0f1d 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3954,11 +3954,11 @@ kV8WasmMemory64 = 4615, kV8WasmMultiMemory = 4616, kV8WasmGC = 4617, - kORBBlockWithoutAnyEventHandler = 4618, - kORBBlockWithOnErrorButWithoutOnLoadEventHandler = 4619, - kORBBlockWithOnLoadButWithoutOnErrorEventHandler = 4620, - kORBBlockWithOnLoadAndOnErrorEventHandler = 4621, - kORBBlockWithAnyEventHandler = 4622, + kOBSOLETE_ORBBlockWithoutAnyEventHandler = 4618, + kOBSOLETE_ORBBlockWithOnErrorButWithoutOnLoadEventHandler = 4619, + kOBSOLETE_ORBBlockWithOnLoadButWithoutOnErrorEventHandler = 4620, + kOBSOLETE_ORBBlockWithOnLoadAndOnErrorEventHandler = 4621, + kOBSOLETE_ORBBlockWithAnyEventHandler = 4622, kV8RTCEncodedVideoFrame_SetMetadata_Method = 4623, kV8RTCEncodedVideoFrame_SetTimestamp_Method = 4624, kV8RTCEncodedAudioFrame_SetTimestamp_Method = 4625,
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc index 098e0cf2..3c40b67 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
@@ -215,7 +215,7 @@ } void Finish() { - resource_->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + resource_->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0); producer_handle_.reset(); resource_->SetStatus(ResourceStatus::kCached); }
diff --git a/third_party/blink/renderer/core/fetch/build.gni b/third_party/blink/renderer/core/fetch/build.gni index ce886f1..7fbe765 100644 --- a/third_party/blink/renderer/core/fetch/build.gni +++ b/third_party/blink/renderer/core/fetch/build.gni
@@ -72,4 +72,5 @@ "readable_stream_bytes_consumer_test.cc", "request_test.cc", "response_test.cc", + "trust_token_to_mojom_test.cc", ]
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data_test.cc b/third_party/blink/renderer/core/fetch/fetch_request_data_test.cc index f7b2789e..2be1a75 100644 --- a/third_party/blink/renderer/core/fetch/fetch_request_data_test.cc +++ b/third_party/blink/renderer/core/fetch/fetch_request_data_test.cc
@@ -58,7 +58,6 @@ ::blink::SecurityOrigin::CreateFromString("https://bbb.example")); WTF::Vector<WTF::String> additional_signed_headers = {"aaa", "bbb"}; auto trust_token_params = network::mojom::blink::TrustTokenParams::New( - network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1, network::mojom::TrustTokenOperationType::kRedemption, network::mojom::TrustTokenRefreshPolicy::kUseCached, /* custom_key_commitment=*/"custom_key_commitment",
diff --git a/third_party/blink/renderer/core/fetch/trust_token_to_mojom.cc b/third_party/blink/renderer/core/fetch/trust_token_to_mojom.cc index 9dc9eae..d464b872 100644 --- a/third_party/blink/renderer/core/fetch/trust_token_to_mojom.cc +++ b/third_party/blink/renderer/core/fetch/trust_token_to_mojom.cc
@@ -20,21 +20,15 @@ const ExecutionContext* execution_context, ExceptionState* exception_state, network::mojom::blink::TrustTokenParams* out) { - DCHECK(in.hasOperation()); // field is required in IDL + // The current implementation always has these fields; the implementation + // always initializes them, and the hasFoo functions always return true. These + // DCHECKs serve as canaries for implementation changes. + DCHECK(in.hasOperation()); + DCHECK(in.hasVersion()); - // get token version - if (in.hasVersion()) { - // only version 1 is supported - if (in.version().AsEnum() == VersionType::k1) { - out->version = - network::mojom::blink::TrustTokenMajorVersion::kPrivateStateTokenV1; - } else { - exception_state->ThrowTypeError("privateToken: unknown token version."); - return false; - } - } else { - exception_state->ThrowTypeError( - "trustToken: token version is not specified."); + // only version 1 is supported + if (in.version().AsEnum() != VersionType::k1) { + exception_state->ThrowRangeError("privateToken: unknown token version."); return false; }
diff --git a/third_party/blink/renderer/core/fetch/trust_token_to_mojom.h b/third_party/blink/renderer/core/fetch/trust_token_to_mojom.h index 237b208..3d56f0a 100644 --- a/third_party/blink/renderer/core/fetch/trust_token_to_mojom.h +++ b/third_party/blink/renderer/core/fetch/trust_token_to_mojom.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_TRUST_TOKEN_TO_MOJOM_H_ #include "services/network/public/mojom/trust_tokens.mojom-blink.h" +#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink { @@ -22,7 +23,7 @@ // - remaining elements partitioned into groups of parameters used for specific // operations. // -// The method sets |type|, |version|, |operation| and the fields corresponding +// The method sets |type|, |operation| and the fields corresponding // to the operation specified by |operation|, namely // - for issuance, no additional fields; // - for redemption, |refresh_policy|; @@ -33,7 +34,9 @@ // - for signing, |issuer| must be provided and must be a valid HTTP(S) URL. // If this validation fails, throws a TypeError against |exception_state| and // returns false. -bool ConvertTrustTokenToMojomAndCheckPermissions( +// +// Exported for unit testing. +CORE_EXPORT bool ConvertTrustTokenToMojomAndCheckPermissions( const PrivateToken& in, const ExecutionContext* execution_context, ExceptionState* exception_state,
diff --git a/third_party/blink/renderer/core/fetch/trust_token_to_mojom_test.cc b/third_party/blink/renderer/core/fetch/trust_token_to_mojom_test.cc new file mode 100644 index 0000000..517e166ad --- /dev/null +++ b/third_party/blink/renderer/core/fetch/trust_token_to_mojom_test.cc
@@ -0,0 +1,51 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/fetch/trust_token_to_mojom.h" + +#include <memory> + +#include "services/network/public/mojom/trust_tokens.mojom-blink.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_private_token.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_private_token_version.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/platform/bindings/exception_code.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/googletest/src/googletest/include/gtest/gtest.h" +#include "v8-initialization.h" +#include "v8-isolate.h" + +namespace blink { +namespace { + +TEST(TrustTokenToMojomTest, GoldenPath) { + V8TestingScope scope; + + PrivateToken* pt = PrivateToken::Create(); + pt->setOperation(V8OperationType::Enum::kTokenRequest); + pt->setVersion(V8PrivateTokenVersion::Enum::k1); + auto params = network::mojom::blink::TrustTokenParams::New(); + ExceptionState& exception_state = scope.GetExceptionState(); + EXPECT_TRUE(ConvertTrustTokenToMojomAndCheckPermissions( + *pt, scope.GetExecutionContext(), &exception_state, params.get())); +} + +TEST(TrustTokenToMojomTest, BadVersion) { + V8TestingScope scope; + + PrivateToken* pt = PrivateToken::Create(); + pt->setOperation(V8OperationType::Enum::kTokenRequest); + pt->setVersion(static_cast<V8PrivateTokenVersion::Enum>(2)); + auto params = network::mojom::blink::TrustTokenParams::New(); + ExceptionState& exception_state = scope.GetExceptionState(); + EXPECT_FALSE(ConvertTrustTokenToMojomAndCheckPermissions( + *pt, scope.GetExecutionContext(), &exception_state, params.get())); + EXPECT_TRUE(exception_state.HadException()); + EXPECT_EQ(exception_state.Code(), static_cast<int>(ESErrorType::kRangeError)); +} + +} // namespace +} // namespace blink
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index 517db8dc..108df55 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -745,6 +745,10 @@ // Consequently, all external image resources must be mocked. web_view_->GetSettings()->SetLoadsImagesAutomatically(true); + // Color providers are required for painting, so we ensure they are not null + // even in unittests. + web_view_->GetPage()->UpdateColorProvidersForTest(); + // If a test turned off this settings, opened WebViews should propagate that. if (opener) { web_view_->GetSettings()->SetAllowUniversalAccessFromFileURLs(
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.cc b/third_party/blink/renderer/core/frame/root_frame_viewport.cc index 21415e69..cc9b117 100644 --- a/third_party/blink/renderer/core/frame/root_frame_viewport.cc +++ b/third_party/blink/renderer/core/frame/root_frame_viewport.cc
@@ -747,6 +747,11 @@ LayoutViewport().UpdateSnappedTargetsAndEnqueueSnapChanged(); } +const cc::SnappedTargetData* RootFrameViewport::GetSnapChangingTargetData() + const { + return LayoutViewport().GetSnapChangingTargetData(); +} + void RootFrameViewport::SetSnapChangingTargetData( absl::optional<cc::SnappedTargetData> data) { LayoutViewport().SetSnapChangingTargetData(data);
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.h b/third_party/blink/renderer/core/frame/root_frame_viewport.h index e0bd0fb..c7086bb 100644 --- a/third_party/blink/renderer/core/frame/root_frame_viewport.h +++ b/third_party/blink/renderer/core/frame/root_frame_viewport.h
@@ -134,6 +134,7 @@ absl::optional<gfx::PointF> GetSnapPositionAndSetTarget( const cc::SnapSelectionStrategy& strategy) override; void UpdateSnappedTargetsAndEnqueueSnapChanged() override; + const cc::SnappedTargetData* GetSnapChangingTargetData() const override; void SetSnapChangingTargetData( absl::optional<cc::SnappedTargetData> data) override; const cc::SnapSelectionStrategy* GetImplSnapStrategy() const override;
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc index ebf4bd2..89ccb0f 100644 --- a/third_party/blink/renderer/core/html/html_script_element.cc +++ b/third_party/blink/renderer/core/html/html_script_element.cc
@@ -330,14 +330,6 @@ DispatchEvent(*Event::Create(event_type_names::kError)); } -bool HTMLScriptElement::HasLoadEventHandler() { - return EventPath(*this).HasEventListenersInPath(event_type_names::kLoad); -} - -bool HTMLScriptElement::HasErrorEventHandler() { - return EventPath(*this).HasEventListenersInPath(event_type_names::kError); -} - ScriptElementBase::Type HTMLScriptElement::GetScriptElementType() { return ScriptElementBase::Type::kHTMLScriptElement; }
diff --git a/third_party/blink/renderer/core/html/html_script_element.h b/third_party/blink/renderer/core/html/html_script_element.h index 497e42f..8f6fedc6 100644 --- a/third_party/blink/renderer/core/html/html_script_element.h +++ b/third_party/blink/renderer/core/html/html_script_element.h
@@ -120,8 +120,6 @@ const String& script_content) override; void DispatchLoadEvent() override; void DispatchErrorEvent() override; - bool HasLoadEventHandler() override; - bool HasErrorEventHandler() override; Type GetScriptElementType() override;
diff --git a/third_party/blink/renderer/core/html/trust_token_attribute_parsing.cc b/third_party/blink/renderer/core/html/trust_token_attribute_parsing.cc index 5c684984..b90b1f08 100644 --- a/third_party/blink/renderer/core/html/trust_token_attribute_parsing.cc +++ b/third_party/blink/renderer/core/html/trust_token_attribute_parsing.cc
@@ -3,25 +3,16 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/html/trust_token_attribute_parsing.h" +#include "base/logging.h" #include "services/network/public/mojom/trust_tokens.mojom-blink.h" #include "services/network/public/mojom/trust_tokens.mojom-shared.h" #include "third_party/blink/renderer/core/fetch/trust_token_to_mojom.h" #include "third_party/blink/renderer/platform/json/json_values.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" -namespace blink { - -namespace internal { +namespace blink::internal { namespace { -bool ParseMajorVersion(int in, network::mojom::TrustTokenMajorVersion* out) { - if (in == 1) { - *out = network::mojom::TrustTokenMajorVersion::kPrivateStateTokenV1; - return true; - } else { - return false; - } -} bool ParseOperation(const String& in, network::mojom::TrustTokenOperationType* out) { if (in == "token-request") { @@ -62,12 +53,16 @@ auto ret = network::mojom::blink::TrustTokenParams::New(); - // |version| is required. + // |version| is required, though unused. int version; if (!object->GetInteger("version", &version)) { + LOG(WARNING) << "expected integer trust token version, got none"; return nullptr; } - if (!ParseMajorVersion(version, &ret->version)) { + // Although we don't use the version number internally, it's still the case + // that we only understand version 1. + if (version != 1) { + LOG(WARNING) << "expected trust token version 1, got " << version; return nullptr; } @@ -117,5 +112,4 @@ return ret; } -} // namespace internal -} // namespace blink +} // namespace blink::internal
diff --git a/third_party/blink/renderer/core/html/trust_token_attribute_parsing_test.cc b/third_party/blink/renderer/core/html/trust_token_attribute_parsing_test.cc index 4da666f..7d2a8a3 100644 --- a/third_party/blink/renderer/core/html/trust_token_attribute_parsing_test.cc +++ b/third_party/blink/renderer/core/html/trust_token_attribute_parsing_test.cc
@@ -12,14 +12,12 @@ #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" -namespace blink { -namespace internal { +namespace blink::internal { namespace { network::mojom::blink::TrustTokenParamsPtr NetworkParamsToBlinkParams( network::mojom::TrustTokenParamsPtr params) { auto ret = network::mojom::blink::TrustTokenParams::New(); - ret->version = params->version; ret->operation = params->operation; ret->refresh_policy = params->refresh_policy; for (const url::Origin& issuer : params->issuers) { @@ -73,7 +71,6 @@ // well with the "issuers" field's members' type of // scoped_refptr<blink::SecurityOrigin>: in particular, the method does an // address-to-address comparison of the pointers. - EXPECT_EQ(result->version, expectation->version); EXPECT_EQ(result->operation, expectation->operation); EXPECT_EQ(result->refresh_policy, expectation->refresh_policy); @@ -246,5 +243,4 @@ ASSERT_FALSE(TrustTokenParamsFromJson(std::move(json))); } -} // namespace internal -} // namespace blink +} // namespace blink::internal
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc index d83e7d87..44406d68 100644 --- a/third_party/blink/renderer/core/loader/image_loader.cc +++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -360,20 +360,6 @@ html_image_element) { params.SetResourceWidth(html_image_element->GetResourceWidth()); } - - if (html_image_element) { - constexpr WebFeature kCountOrbBlockAs[2][2] = { - {WebFeature::kORBBlockWithoutAnyEventHandler, - WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler}, - {WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, - WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler}}; - - auto event_path = EventPath(element); - params.SetCountORBBlockAs( - kCountOrbBlockAs - [event_path.HasEventListenersInPath(event_type_names::kLoad)] - [event_path.HasEventListenersInPath(event_type_names::kError)]); - } } inline void ImageLoader::DispatchErrorEvent() {
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.cc b/third_party/blink/renderer/core/loader/resource/image_resource.cc index 06ad296..7ccc9ec7 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource.cc
@@ -405,7 +405,7 @@ // Observers are notified via ImageResource::finish(). // TODO(hiroshige): Do not call didFinishLoading() directly. Loader()->AbortResponseBodyLoading(); - Loader()->DidFinishLoading(base::TimeTicks::Now(), size, size, size, false); + Loader()->DidFinishLoading(base::TimeTicks::Now(), size, size, size); } else { auto result = GetContent()->UpdateImage( nullptr, GetStatus(),
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc index 576c802e..a68736a 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -301,7 +301,7 @@ // This part finishes. The image is created, callbacks are sent, and the data // buffer is cleared. - image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0); EXPECT_TRUE(image_resource->ResourceBuffer()); EXPECT_FALSE(image_resource->ErrorOccurred()); ASSERT_TRUE(image_resource->GetContent()->HasImage()); @@ -354,7 +354,7 @@ image_resource->AppendData(reinterpret_cast<const char*>(kJpegImage), sizeof(kJpegImage)); image_resource->AppendData(kBoundary, strlen(kBoundary)); - image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0); EXPECT_TRUE(image_resource->GetContent()->HasImage()); EXPECT_TRUE(IsA<BitmapImage>(image_resource->GetContent()->GetImage())); EXPECT_TRUE(image_resource->GetContent() @@ -865,7 +865,7 @@ EXPECT_FALSE(observer->ImageNotifyFinishedCalled()); EXPECT_EQ(0, observer->ImageChangedCount()); - image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + image_resource->Loader()->DidFinishLoading(base::TimeTicks(), 0, 0, 0); EXPECT_EQ(ResourceStatus::kDecodeError, image_resource->GetStatus()); EXPECT_TRUE(observer->ImageNotifyFinishedCalled()); @@ -916,7 +916,7 @@ image_resource->Loader()->DidFinishLoading( base::TimeTicks(), kJpegImageSubrangeWithoutDimensionsLength, kJpegImageSubrangeWithoutDimensionsLength, - kJpegImageSubrangeWithoutDimensionsLength, false); + kJpegImageSubrangeWithoutDimensionsLength); EXPECT_EQ(ResourceStatus::kDecodeError, image_resource->GetStatus()); EXPECT_TRUE(observer->ImageNotifyFinishedCalled());
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index 2450731e..6fe502ff 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc
@@ -91,6 +91,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/scheduler/public/agent_group_scheduler.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" +#include "third_party/blink/renderer/platform/web_test_support.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/color/color_provider.h" #include "ui/color/color_provider_utils.h" @@ -480,9 +481,22 @@ dark_color_provider_ = std::make_unique<ui::ColorProvider>( ui::CreateColorProviderFromRendererColorMap( color_provider_colors.dark_colors_map)); + forced_colors_color_provider_ = + WebTestSupport::IsRunningWebTest() + ? std::make_unique<ui::ColorProvider>( + ui::CreateEmulatedForcedColorsColorProviderForTest()) + : std::make_unique<ui::ColorProvider>( + ui::CreateColorProviderFromRendererColorMap( + color_provider_colors.forced_colors_map)); +} + +void Page::UpdateColorProvidersForTest() { + light_color_provider_ = std::make_unique<ui::ColorProvider>( + ui::CreateColorProviderForBlinkTests(/*dark_mode=*/false)); + dark_color_provider_ = std::make_unique<ui::ColorProvider>( + ui::CreateColorProviderForBlinkTests(/*dark_mode=*/true)); forced_colors_color_provider_ = std::make_unique<ui::ColorProvider>( - ui::CreateColorProviderFromRendererColorMap( - color_provider_colors.forced_colors_map)); + ui::CreateEmulatedForcedColorsColorProviderForTest()); } const ui::ColorProvider* Page::GetColorProviderForPainting(
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h index 35a7d432..3da8d0f 100644 --- a/third_party/blink/renderer/core/page/page.h +++ b/third_party/blink/renderer/core/page/page.h
@@ -164,6 +164,7 @@ void UpdateColorProviders( const ColorProviderColorMaps& color_provider_colors); + void UpdateColorProvidersForTest(); const ui::ColorProvider* GetColorProviderForPainting( mojom::blink::ColorScheme color_scheme, bool in_forced_colors) const;
diff --git a/third_party/blink/renderer/core/paint/mathml_painter.cc b/third_party/blink/renderer/core/paint/mathml_painter.cc index 197b31b..d141009 100644 --- a/third_party/blink/renderer/core/paint/mathml_painter.cc +++ b/third_party/blink/renderer/core/paint/mathml_painter.cc
@@ -16,20 +16,19 @@ namespace blink { -void MathMLPainter::PaintBar(const PaintInfo& info, const gfx::Rect& bar) { - if (bar.IsEmpty()) +void MathMLPainter::PaintBar(const PaintInfo& info, + const PhysicalRect& bar_rect) { + gfx::Rect snapped_bar_rect = ToPixelSnappedRect(bar_rect); + if (snapped_bar_rect.IsEmpty()) { return; - - GraphicsContextStateSaver state_saver(info.context); - info.context.SetStrokeThickness(bar.height()); - info.context.SetStrokeStyle(kSolidStroke); - info.context.SetStrokeColor( - box_fragment_.Style().VisitedDependentColor(GetCSSPropertyColor())); - gfx::Point line_end_point = {bar.width(), 0}; - AutoDarkMode auto_dark_mode(PaintAutoDarkMode( - box_fragment_.Style(), DarkModeFilter::ElementRole::kForeground)); - info.context.DrawLine(bar.origin(), line_end_point + bar.OffsetFromOrigin(), - auto_dark_mode); + } + // The (vertical) origin of `snapped_bar_rect` is now at the mid-point of the + // bar. Shift up by half the height to produce the corresponding rectangle. + snapped_bar_rect -= gfx::Vector2d(0, snapped_bar_rect.height() / 2); + const ComputedStyle& style = box_fragment_.Style(); + info.context.FillRect( + snapped_bar_rect, style.VisitedDependentColor(GetCSSPropertyColor()), + PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kForeground)); } void MathMLPainter::PaintStretchyOrLargeOperator(const PaintInfo& info, @@ -66,7 +65,7 @@ padding.HorizontalSum(), line_thickness}; bar_rect.Move(paint_offset); - PaintBar(info, ToPixelSnappedRect(bar_rect)); + PaintBar(info, bar_rect); } } @@ -155,7 +154,7 @@ PhysicalRect bar_rect = {bar_physical_offset.left, bar_physical_offset.top, base_width, rule_thickness}; bar_rect.Move(paint_offset); - PaintBar(info, ToPixelSnappedRect(bar_rect)); + PaintBar(info, bar_rect); } void MathMLPainter::Paint(const PaintInfo& info, PhysicalOffset paint_offset) {
diff --git a/third_party/blink/renderer/core/paint/mathml_painter.h b/third_party/blink/renderer/core/paint/mathml_painter.h index d61579c..1fa57e4e 100644 --- a/third_party/blink/renderer/core/paint/mathml_painter.h +++ b/third_party/blink/renderer/core/paint/mathml_painter.h
@@ -7,15 +7,12 @@ #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -namespace gfx { -class Rect; -} - namespace blink { class PhysicalBoxFragment; struct PaintInfo; struct PhysicalOffset; +struct PhysicalRect; class MathMLPainter { STACK_ALLOCATED(); @@ -26,7 +23,7 @@ void Paint(const PaintInfo&, PhysicalOffset); private: - void PaintBar(const PaintInfo&, const gfx::Rect&); + void PaintBar(const PaintInfo&, const PhysicalRect&); void PaintFractionBar(const PaintInfo&, PhysicalOffset); void PaintOperator(const PaintInfo&, PhysicalOffset); void PaintRadicalSymbol(const PaintInfo&, PhysicalOffset);
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc index de253fda..f8ed8bc 100644 --- a/third_party/blink/renderer/core/script/classic_pending_script.cc +++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -71,14 +71,6 @@ url, context->GetSecurityOrigin(), context->GetCurrentWorld(), cross_origin, encoding, defer)); - constexpr WebFeature kCountOrbBlockAs[2][2] = { - {WebFeature::kORBBlockWithoutAnyEventHandler, - WebFeature::kORBBlockWithOnErrorButWithoutOnLoadEventHandler}, - {WebFeature::kORBBlockWithOnLoadButWithoutOnErrorEventHandler, - WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler}}; - params.SetCountORBBlockAs(kCountOrbBlockAs[element->HasLoadEventHandler()] - [element->HasErrorEventHandler()]); - ClassicPendingScript* pending_script = MakeGarbageCollected<ClassicPendingScript>( element, TextPosition::MinimumPosition(), KURL(), KURL(), String(),
diff --git a/third_party/blink/renderer/core/script/mock_script_element_base.h b/third_party/blink/renderer/core/script/mock_script_element_base.h index 398a8410..5cd4a83 100644 --- a/third_party/blink/renderer/core/script/mock_script_element_base.h +++ b/third_party/blink/renderer/core/script/mock_script_element_base.h
@@ -21,8 +21,6 @@ MOCK_METHOD0(DispatchLoadEvent, void()); MOCK_METHOD0(DispatchErrorEvent, void()); - MOCK_METHOD0(HasLoadEventHandler, bool()); - MOCK_METHOD0(HasErrorEventHandler, bool()); MOCK_CONST_METHOD0(AsyncAttributeValue, bool()); MOCK_CONST_METHOD0(CharsetAttributeValue, String()); MOCK_CONST_METHOD0(CrossOriginAttributeValue, String());
diff --git a/third_party/blink/renderer/core/script/script_element_base.h b/third_party/blink/renderer/core/script/script_element_base.h index 2cbae66..77487631 100644 --- a/third_party/blink/renderer/core/script/script_element_base.h +++ b/third_party/blink/renderer/core/script/script_element_base.h
@@ -102,8 +102,6 @@ virtual void DispatchLoadEvent() = 0; virtual void DispatchErrorEvent() = 0; - virtual bool HasLoadEventHandler() = 0; - virtual bool HasErrorEventHandler() = 0; virtual Type GetScriptElementType() = 0;
diff --git a/third_party/blink/renderer/core/scroll/scroll_alignment.cc b/third_party/blink/renderer/core/scroll/scroll_alignment.cc index f9b19229..f2ed6cfc 100644 --- a/third_party/blink/renderer/core/scroll/scroll_alignment.cc +++ b/third_party/blink/renderer/core/scroll/scroll_alignment.cc
@@ -89,11 +89,8 @@ // then treat it as fully visible to avoid unnecessary horizontal scrolling scroll_x = align_x.rect_visible; } else if (intersect_width == non_zero_visible_rect.Width()) { - // If the rect is bigger than the visible area, don't bother trying to - // center. Other alignments will work. + // The rect is bigger than the visible area. scroll_x = align_x.rect_visible; - if (scroll_x == mojom::blink::ScrollAlignment::Behavior::kCenter) - scroll_x = mojom::blink::ScrollAlignment::Behavior::kNoScroll; } else if (intersect_width > 0) { // If the rectangle is partially visible, but not above the minimum // threshold, use the specified partial behavior @@ -125,11 +122,8 @@ // If the rectangle is fully visible, use the specified visible behavior. scroll_y = align_y.rect_visible; } else if (intersect_height == non_zero_visible_rect.Height()) { - // If the rect is bigger than the visible area, don't bother trying to - // center. Other alignments will work. + // The rect is bigger than the visible area. scroll_y = align_y.rect_visible; - if (scroll_y == mojom::blink::ScrollAlignment::Behavior::kCenter) - scroll_y = mojom::blink::ScrollAlignment::Behavior::kNoScroll; } else if (intersect_height > 0) { // If the rectangle is partially visible, use the specified partial behavior scroll_y = align_y.rect_partial;
diff --git a/third_party/blink/renderer/core/svg/svg_script_element.cc b/third_party/blink/renderer/core/svg/svg_script_element.cc index 68318d6..36d6d85 100644 --- a/third_party/blink/renderer/core/svg/svg_script_element.cc +++ b/third_party/blink/renderer/core/svg/svg_script_element.cc
@@ -166,14 +166,6 @@ DispatchEvent(*Event::Create(event_type_names::kError)); } -bool SVGScriptElement::HasLoadEventHandler() { - return EventPath(*this).HasEventListenersInPath(event_type_names::kLoad); -} - -bool SVGScriptElement::HasErrorEventHandler() { - return EventPath(*this).HasEventListenersInPath(event_type_names::kError); -} - ScriptElementBase::Type SVGScriptElement::GetScriptElementType() { return ScriptElementBase::Type::kSVGScriptElement; }
diff --git a/third_party/blink/renderer/core/svg/svg_script_element.h b/third_party/blink/renderer/core/svg/svg_script_element.h index 87d6da7..ab0159d 100644 --- a/third_party/blink/renderer/core/svg/svg_script_element.h +++ b/third_party/blink/renderer/core/svg/svg_script_element.h
@@ -102,8 +102,6 @@ ExecutionContext* GetExecutionContext() const override; void DispatchLoadEvent() override; void DispatchErrorEvent() override; - bool HasLoadEventHandler() override; - bool HasErrorEventHandler() override; Type GetScriptElementType() override;
diff --git a/third_party/blink/renderer/core/testing/dummy_page_holder.cc b/third_party/blink/renderer/core/testing/dummy_page_holder.cc index d0d24f9f..87b1d1e 100644 --- a/third_party/blink/renderer/core/testing/dummy_page_holder.cc +++ b/third_party/blink/renderer/core/testing/dummy_page_holder.cc
@@ -107,6 +107,10 @@ if (setting_overrider) std::move(setting_overrider).Run(settings); + // Color providers are required for painting, so we ensure they are not null + // even in unittests. + page_->UpdateColorProvidersForTest(); + // DummyPageHolder doesn't provide a browser interface, so code caches cannot // be fetched. If testing for code caches provide a mock code cache host. DocumentLoader::DisableCodeCacheForTesting();
diff --git a/third_party/blink/renderer/core/testing/sim/sim_network.cc b/third_party/blink/renderer/core/testing/sim/sim_network.cc index aea2dd2..7671d22e 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_network.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_network.cc
@@ -88,7 +88,7 @@ if (!current_request_) { client->DidFinishLoading(finish_time, total_encoded_data_length, total_encoded_body_length, - total_decoded_body_length, false); + total_decoded_body_length); return; } current_request_ = nullptr;
diff --git a/third_party/blink/renderer/core/testing/sim/sim_request.cc b/third_party/blink/renderer/core/testing/sim/sim_request.cc index ee9235f..615d9e9 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_request.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_request.cc
@@ -101,7 +101,7 @@ } else { client_->DidFinishLoading( base::TimeTicks::Now(), total_encoded_data_length_, - total_encoded_data_length_, total_encoded_data_length_, false); + total_encoded_data_length_, total_encoded_data_length_); } } Reset();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 4bedfdef..1ee4cdcc 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -908,7 +908,7 @@ // object, because hidden ones are purposely kept around without being in // the tree, and without a parent, for potential later reuse. bool is_missing = !IsRoot(); - CHECK(!is_missing || !AXObjectCache().IsFrozen()) + DUMP_WILL_BE_CHECK(!is_missing || !AXObjectCache().IsFrozen()) << "Should not have missing parent in frozen tree: " << ToString(true, true); return is_missing; @@ -5594,7 +5594,8 @@ return nullptr; } - CHECK(!IsMissingParent()) << "Missing parent: " << ToString(true, true); + DUMP_WILL_BE_CHECK(!IsMissingParent()) + << "Missing parent: " << ToString(true, true); return parent_.Get(); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 303f06d..542be01 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1375,7 +1375,8 @@ if (!obj->IsMissingParent()) { return obj; } - CHECK(parent_if_known) << "Missing parent: " << obj->ToString(true, true); + DUMP_WILL_BE_CHECK(parent_if_known) + << "Missing parent: " << obj->ToString(true, true); // The parent is provided when the object is being added to the parent. // This is expected when re-adding a child to a parent via @@ -3372,7 +3373,7 @@ if (!ax_object || ax_object->IsDetached()) { return nullptr; } - CHECK(!ax_object->IsMissingParent()) + DUMP_WILL_BE_CHECK(!ax_object->IsMissingParent()) << "Missing parent: " << ax_object->ToString(true, true); // Update cached attributes for all changed nodes before serialization, // because updating ignored/included can cause tree structure changes, and @@ -3408,9 +3409,9 @@ // TODO(accessibility) Try to get rid of repair situations by addressing // partial subtrees and mid-tree object removal directly when they occur. if (ax_object->IsMissingParent()) { - // TODO(accessibility) This should become a CHECK once we resolve remaining - // cases. Breaks on https://github.com/openui/open-ui/discussions/960. - DCHECK(false) << "Missing parent on: " << ax_object->ToString(true, true); + // TODO(accessibility) Convert to CHECK once we resolve remaining cases. + DUMP_WILL_BE_NOTREACHED_NORETURN() + << "Missing parent on: " << ax_object->ToString(true, true); if (!ax_object->GetNode()) { RemoveIncludedSubtree(ax_object, /* remove_root */ true); return nullptr;
diff --git a/third_party/blink/renderer/modules/printing/web_printer.cc b/third_party/blink/renderer/modules/printing/web_printer.cc index 22fa0268..d8f4ea7 100644 --- a/third_party/blink/renderer/modules/printing/web_printer.cc +++ b/third_party/blink/renderer/modules/printing/web_printer.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_web_print_document_description.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_print_job_template_attributes.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printer_attributes.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_resolution.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/modules/printing/web_print_job.h" @@ -23,6 +24,24 @@ ExceptionState& exception_state) { if (pjt_attributes->hasCopies() && pjt_attributes->copies() < 1) { exception_state.ThrowTypeError("|copies| cannot be less than 1."); + return false; + } + if (pjt_attributes->hasPrinterResolution()) { + auto* printer_resolution = pjt_attributes->printerResolution(); + if (!printer_resolution->hasCrossFeedDirectionResolution() || + !printer_resolution->hasFeedDirectionResolution()) { + exception_state.ThrowTypeError( + "crossFeedDirectionResolution and feedDirectionResolution must be " + "specified if printerResolution is present."); + return false; + } + if (printer_resolution->crossFeedDirectionResolution() == 0 || + printer_resolution->feedDirectionResolution() == 0) { + exception_state.ThrowTypeError( + "crossFeedDirectionResolution and feedDirectionResolution must be " + "greater than 0 if specified."); + return false; + } } return true; }
diff --git a/third_party/blink/renderer/modules/printing/web_printer_attributes.idl b/third_party/blink/renderer/modules/printing/web_printer_attributes.idl index b800d35..9665ead0 100644 --- a/third_party/blink/renderer/modules/printing/web_printer_attributes.idl +++ b/third_party/blink/renderer/modules/printing/web_printer_attributes.idl
@@ -21,6 +21,7 @@ unsigned long copies; WebPrintingMultipleDocumentHandling multipleDocumentHandling; + WebPrintingResolution printerResolution; WebPrintColorMode printColorMode; WebPrintQuality printQuality; WebPrintingSides sides; @@ -38,6 +39,9 @@ WebPrintingMultipleDocumentHandling multipleDocumentHandlingDefault; sequence<WebPrintingMultipleDocumentHandling> multipleDocumentHandlingSupported; + WebPrintingResolution printerResolutionDefault; + sequence<WebPrintingResolution> printerResolutionSupported; + WebPrintColorMode printColorModeDefault; sequence<WebPrintColorMode> printColorModeSupported;
diff --git a/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc b/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc index e1da858..76713291 100644 --- a/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc +++ b/third_party/blink/renderer/modules/printing/web_printing_type_converters.cc
@@ -11,7 +11,11 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_mime_media_type.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_multiple_document_handling.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_range.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_resolution.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_resolution_units.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_printing_sides.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/resolution_units.h" namespace { // sides: @@ -95,6 +99,40 @@ }; template <> +struct TypeConverter<gfx::Size, blink::WebPrintingResolution*> { + static gfx::Size Convert( + const blink::WebPrintingResolution* printer_resolution) { + CHECK(printer_resolution->hasCrossFeedDirectionResolution()); + CHECK(printer_resolution->hasFeedDirectionResolution()); + if (printer_resolution->hasUnits() && + printer_resolution->units() == + blink::V8WebPrintingResolutionUnits::Enum::kDotsPerCentimeter) { + return gfx::Size(printer_resolution->crossFeedDirectionResolution() * + blink::kCentimetersPerInch, + printer_resolution->feedDirectionResolution() * + blink::kCentimetersPerInch); + } + return gfx::Size(printer_resolution->crossFeedDirectionResolution(), + printer_resolution->feedDirectionResolution()); + } +}; + +template <> +struct TypeConverter<blink::WebPrintingResolution*, gfx::Size> { + static blink::WebPrintingResolution* Convert( + const gfx::Size& printer_resolution) { + auto* output_resolution = + blink::MakeGarbageCollected<blink::WebPrintingResolution>(); + output_resolution->setCrossFeedDirectionResolution( + printer_resolution.width()); + output_resolution->setFeedDirectionResolution(printer_resolution.height()); + output_resolution->setUnits( + blink::V8WebPrintingResolutionUnits::Enum::kDotsPerInch); + return output_resolution; + } +}; + +template <> struct TypeConverter<V8ColorMode, MojomColorMode> { static V8ColorMode Convert(const MojomColorMode& color_mode) { switch (color_mode) { @@ -153,6 +191,17 @@ new_attributes.multiple_document_handling_supported)); } +void ProcessPrinterResolution( + const mojom::blink::WebPrinterAttributes& new_attributes, + WebPrinterAttributes* current_attributes) { + current_attributes->setPrinterResolutionDefault( + mojo::ConvertTo<blink::WebPrintingResolution*>( + new_attributes.printer_resolution_default)); + current_attributes->setPrinterResolutionSupported( + mojo::ConvertTo<HeapVector<Member<blink::WebPrintingResolution>>>( + new_attributes.printer_resolution_supported)); +} + void ProcessPrintColorMode( const mojom::blink::WebPrinterAttributes& new_attributes, WebPrinterAttributes* current_attributes) { @@ -191,6 +240,7 @@ blink::ProcessCopies(*printer_attributes, attributes); blink::ProcessDocumentFormat(*printer_attributes, attributes); blink::ProcessMultipleDocumentHandling(*printer_attributes, attributes); + blink::ProcessPrinterResolution(*printer_attributes, attributes); blink::ProcessPrintColorMode(*printer_attributes, attributes); blink::ProcessSides(*printer_attributes, attributes); @@ -209,6 +259,10 @@ mojo::ConvertTo<MojomMultipleDocumentHandling>( pjt_attributes->multipleDocumentHandling()); } + if (pjt_attributes->hasPrinterResolution()) { + attributes->printer_resolution = + mojo::ConvertTo<gfx::Size>(pjt_attributes->printerResolution()); + } if (pjt_attributes->hasPrintColorMode()) { attributes->print_color_mode = mojo::ConvertTo<MojomColorMode>(pjt_attributes->printColorMode());
diff --git a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc index 6a1e807e..7efe983 100644 --- a/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc +++ b/third_party/blink/renderer/modules/service_worker/web_embedded_worker_impl_test.cc
@@ -89,7 +89,7 @@ client->DidReceiveResponse(response, /*body=*/mojo::ScopedDataPipeConsumerHandle(), /*cached_metadata=*/absl::nullopt); - client->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + client->DidFinishLoading(base::TimeTicks(), 0, 0, 0); return; } // Don't handle other requests intentionally to emulate ongoing load.
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h index 6661b76..61dedd5 100644 --- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h +++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
@@ -29,7 +29,6 @@ #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" #include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/script/script_type.mojom-shared.h" -#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/platform/loader/fetch/cross_origin_attribute_value.h" #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h" @@ -221,14 +220,6 @@ return is_potentially_lcp_influencer_; } - void SetCountORBBlockAs(mojom::blink::WebFeature feature) { - count_orb_block_as_ = feature; - } - - absl::optional<mojom::blink::WebFeature> CountORBBlockAs() { - return count_orb_block_as_; - } - private: ResourceRequest resource_request_; // |decoder_options_|'s ContentType is set to |kPlainTextContent| in @@ -249,11 +240,6 @@ RenderBlockingBehavior::kUnset; bool is_potentially_lcp_element_ = false; bool is_potentially_lcp_influencer_ = false; - - // Count ORB-blocked responses (optionally), so that we can measure - // compatibility impact. - // TODO(vogelheim, 1463725): Remove this once the ORB feature launches. - absl::optional<mojom::blink::WebFeature> count_orb_block_as_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index d961671..a1a1099 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -1275,8 +1275,7 @@ } if (!StartLoad(resource, std::move(params.MutableResourceRequest().MutableBody()), - load_blocking_policy, params.GetRenderBlockingBehavior(), - params.CountORBBlockAs())) { + load_blocking_policy, params.GetRenderBlockingBehavior())) { resource->FinishAsError(ResourceError::CancelledError(params.Url()), freezable_task_runner_.get()); } @@ -2225,15 +2224,14 @@ } return StartLoad(resource, ResourceRequestBody(), ImageLoadBlockingPolicy::kDefault, - RenderBlockingBehavior::kNonBlocking, absl::nullopt); + RenderBlockingBehavior::kNonBlocking); } bool ResourceFetcher::StartLoad( Resource* resource, ResourceRequestBody request_body, ImageLoadBlockingPolicy policy, - RenderBlockingBehavior render_blocking_behavior, - absl::optional<mojom::blink::WebFeature> count_orb_block_as_) { + RenderBlockingBehavior render_blocking_behavior) { DCHECK(resource); DCHECK(resource->StillNeedsLoad()); @@ -2279,7 +2277,7 @@ loader = MakeGarbageCollected<ResourceLoader>( this, scheduler_, resource, context_lifecycle_notifier_, - std::move(request_body), size, count_orb_block_as_); + std::move(request_body), size); // Preload requests should not block the load event. IsLinkPreload() // actually continues to return true for Resources matched from the preload // cache that must block the load event, but that is OK because this method
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h index af96732..4fc2ead8 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -368,8 +368,7 @@ bool StartLoad(Resource*, ResourceRequestBody, ImageLoadBlockingPolicy, - RenderBlockingBehavior, - absl::optional<mojom::blink::WebFeature> count_orb_block_as); + RenderBlockingBehavior); void InitializeRevalidation(ResourceRequest&, Resource*); void AddToMemoryCacheIfNeeded(const FetchParameters&, Resource*);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index 17a551f9..92975cb 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -219,14 +219,12 @@ } // namespace -ResourceLoader::ResourceLoader( - ResourceFetcher* fetcher, - ResourceLoadScheduler* scheduler, - Resource* resource, - ContextLifecycleNotifier* context, - ResourceRequestBody request_body, - uint32_t inflight_keepalive_bytes, - absl::optional<mojom::blink::WebFeature> count_orb_block_as) +ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, + ResourceLoadScheduler* scheduler, + Resource* resource, + ContextLifecycleNotifier* context, + ResourceRequestBody request_body, + uint32_t inflight_keepalive_bytes) : scheduler_client_id_(ResourceLoadScheduler::kInvalidClientId), fetcher_(fetcher), scheduler_(scheduler), @@ -237,8 +235,7 @@ progress_receiver_(this, context), cancel_timer_(fetcher_->GetTaskRunner(), this, - &ResourceLoader::CancelTimerFired), - count_orb_block_as_(count_orb_block_as) { + &ResourceLoader::CancelTimerFired) { DCHECK(resource_); DCHECK(fetcher_); @@ -363,11 +360,9 @@ const ResourceResponse& response = resource_->GetResponse(); if (deferred_finish_loading_info_) { - DidFinishLoading( - deferred_finish_loading_info_->response_end_time, - response.EncodedDataLength(), response.EncodedBodyLength(), - response.DecodedBodyLength(), - deferred_finish_loading_info_->should_report_corb_blocking); + DidFinishLoading(deferred_finish_loading_info_->response_end_time, + response.EncodedDataLength(), response.EncodedBodyLength(), + response.DecodedBodyLength()); } } @@ -1001,8 +996,7 @@ void ResourceLoader::DidFinishLoading(base::TimeTicks response_end_time, int64_t encoded_data_length, uint64_t encoded_body_length, - int64_t decoded_body_length, - bool should_report_corb_blocking) { + int64_t decoded_body_length) { if (resource_->response_.WasFetchedViaServiceWorker()) { encoded_body_length = received_body_length_from_service_worker_; decoded_body_length = received_body_length_from_service_worker_; @@ -1019,8 +1013,8 @@ (is_downloading_to_blob_ && !blob_finished_ && blob_response_started_)) { // If the body is still being loaded, we defer the completion until all the // body is received. - deferred_finish_loading_info_ = DeferredFinishLoadingInfo{ - response_end_time, should_report_corb_blocking}; + deferred_finish_loading_info_ = + DeferredFinishLoadingInfo{response_end_time}; if (data_pipe_completion_notifier_) { data_pipe_completion_notifier_->SignalComplete(); @@ -1045,10 +1039,6 @@ fetcher_->HandleLoaderFinish(resource_.Get(), response_end_time, ResourceFetcher::kDidFinishLoading, inflight_keepalive_bytes_); - - if (should_report_corb_blocking) { - CountOrbBlock(); - } } void ResourceLoader::DidFail(const WebURLError& error, @@ -1216,8 +1206,7 @@ FinishedCreatingBlob(std::move(downloaded_blob)); } DidFinishLoading(base::TimeTicks::Now(), encoded_data_length, - encoded_body_length, decoded_body_length, - /* should_report_corb_blocking */ false); + encoded_body_length, decoded_body_length); } void ResourceLoader::RequestAsynchronously(const ResourceRequestHead& request) { @@ -1366,11 +1355,9 @@ blob_finished_ = true; if (deferred_finish_loading_info_) { const ResourceResponse& response = resource_->GetResponse(); - DidFinishLoading( - deferred_finish_loading_info_->response_end_time, - response.EncodedDataLength(), response.EncodedBodyLength(), - response.DecodedBodyLength(), - deferred_finish_loading_info_->should_report_corb_blocking); + DidFinishLoading(deferred_finish_loading_info_->response_end_time, + response.EncodedDataLength(), response.EncodedBodyLength(), + response.DecodedBodyLength()); } } @@ -1441,8 +1428,7 @@ // DidFinishLoading() may deferred until the response body loader reaches to // end. - DidFinishLoading(base::TimeTicks::Now(), data_size, data_size, data_size, - false /* should_report_corb_blocking */); + DidFinishLoading(base::TimeTicks::Now(), data_size, data_size, data_size); } bool ResourceLoader::ShouldBlockRequestBasedOnSubresourceFilterDnsAliasCheck( @@ -1537,19 +1523,4 @@ } } -void ResourceLoader::CountOrbBlock() const { - if (!count_orb_block_as_) { - return; - } - - DCHECK_LE(WebFeature::kORBBlockWithoutAnyEventHandler, *count_orb_block_as_); - DCHECK_LE(*count_orb_block_as_, - WebFeature::kORBBlockWithOnLoadAndOnErrorEventHandler); - fetcher_->GetUseCounter().CountUse(*count_orb_block_as_); - if (*count_orb_block_as_ != WebFeature::kORBBlockWithoutAnyEventHandler) { - fetcher_->GetUseCounter().CountUse( - WebFeature::kORBBlockWithAnyEventHandler); - } -} - } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h index 128c4d23..b09af5b 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -38,7 +38,6 @@ #include "mojo/public/cpp/base/big_buffer.h" #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" -#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink-forward.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/prefinalizer.h" #include "third_party/blink/renderer/platform/loader/fetch/data_pipe_bytes_consumer.h" @@ -97,10 +96,7 @@ Resource*, ContextLifecycleNotifier*, ResourceRequestBody request_body = ResourceRequestBody(), - uint32_t inflight_keepalive_bytes = 0, - absl::optional<mojom::blink::WebFeature> count_orb_block_as = - absl::nullopt); - + uint32_t inflight_keepalive_bytes = 0); ~ResourceLoader() override; void Trace(Visitor*) const override; @@ -158,8 +154,7 @@ void DidFinishLoading(base::TimeTicks response_end_time, int64_t encoded_data_length, uint64_t encoded_body_length, - int64_t decoded_body_length, - bool should_report_corb_blocking) override; + int64_t decoded_body_length) override; void DidFail(const WebURLError&, base::TimeTicks response_end_time, int64_t encoded_data_length, @@ -250,8 +245,6 @@ void CountPrivateNetworkAccessPreflightResult( network::mojom::PrivateNetworkAccessPreflightResult result); - void CountOrbBlock() const; - std::unique_ptr<URLLoader> loader_; ResourceLoadScheduler::ClientId scheduler_client_id_; Member<ResourceFetcher> fetcher_; @@ -281,7 +274,6 @@ // when the blob is finished too. struct DeferredFinishLoadingInfo { base::TimeTicks response_end_time; - bool should_report_corb_blocking; }; absl::optional<DeferredFinishLoadingInfo> deferred_finish_loading_info_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_for_body_loader_; @@ -300,11 +292,6 @@ int64_t received_body_length_from_service_worker_ = 0; CnameAliasInfoForTesting cname_alias_info_for_testing_; - - // Count ORB-blocked responses (optionally), so that we can measure - // compatibility impact. - // TODO(vogelheim, 1463725): Remove this once the ORB feature launches. - const absl::optional<mojom::blink::WebFeature> count_orb_block_as_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc index e756256..125a571ef5 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader_test.cc
@@ -164,7 +164,7 @@ loader->DidReceiveResponse(WrappedResourceResponse(response), std::move(consumer), /*cached_metadata=*/absl::nullopt); - loader->DidFinishLoading(base::TimeTicks(), 0, 0, 0, false); + loader->DidFinishLoading(base::TimeTicks(), 0, 0, 0); uint32_t num_bytes = 2; result = producer->WriteData("he", &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
diff --git a/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.cc b/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.cc index 9f13ec1..0d6c7f11 100644 --- a/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.cc +++ b/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.cc
@@ -16,7 +16,6 @@ network::mojom::TrustTokenParamsPtr out = network::mojom::TrustTokenParams::New(); - out->version = in.version; out->operation = in.operation; out->refresh_policy = in.refresh_policy; out->sign_request_data = in.sign_request_data;
diff --git a/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.h b/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.h index f5846141..93a5fea 100644 --- a/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.h +++ b/third_party/blink/renderer/platform/loader/fetch/trust_token_params_conversion.h
@@ -9,14 +9,9 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/platform/web_common.h" -namespace network { -namespace mojom { -namespace blink { +namespace network::mojom::blink { class TrustTokenParams; - -} // namespace blink -} // namespace mojom -} // namespace network +} // namespace network::mojom::blink namespace blink {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc index c966ac9b..3181ff69a 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader.cc
@@ -468,8 +468,7 @@ encoded_body_size, status.decoded_body_length); } else { client_->DidFinishLoading(status.completion_time, total_transfer_size, - encoded_body_size, status.decoded_body_length, - status.should_report_corb_blocking); + encoded_body_size, status.decoded_body_length); } }
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader_unittest.cc index 4221f5c..6edd10f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader_unittest.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/background_url_loader_unittest.cc
@@ -280,8 +280,7 @@ void DidFinishLoading(base::TimeTicks finishTime, int64_t totalEncodedDataLength, uint64_t totalEncodedBodyLength, - int64_t totalDecodedBodyLength, - bool should_report_corb_blocking) override { + int64_t totalDecodedBodyLength) override { DCHECK(freezable_task_runner_->BelongsToCurrentThread()); did_finish_ = true; }
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.cc index 9047f6d..ae178ce 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader.cc
@@ -386,8 +386,7 @@ encoded_body_size, status.decoded_body_length); } else { client_->DidFinishLoading(status.completion_time, total_transfer_size, - encoded_body_size, status.decoded_body_length, - status.should_report_corb_blocking); + encoded_body_size, status.decoded_body_length); } } }
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_client.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_client.h index 4011fe8..1a01bd8c 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_client.h +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_client.h
@@ -100,19 +100,12 @@ // Called when the load completes successfully. // |total_encoded_data_length| may be equal to kUnknownEncodedDataLength. - // - // |should_report_corb_blocking| is used to measure blocked responses with - // event handlers. - // TODO(vogelheim, 1463725): Remove this once the ORB feature launches. - - // // TODO(crbug.com/798625): use different callback for subresources // with responses blocked due to document protection. virtual void DidFinishLoading(base::TimeTicks finish_time, int64_t total_encoded_data_length, uint64_t total_encoded_body_length, - int64_t total_decoded_body_length, - bool should_report_corb_blocking) {} + int64_t total_decoded_body_length) {} // Called when the load completes with an error. // |finish_time| indicating the time in which the response failed.
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc index 3b0a5a5..5c1e0a75 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/url_loader_unittest.cc
@@ -258,8 +258,7 @@ void DidFinishLoading(base::TimeTicks finishTime, int64_t totalEncodedDataLength, uint64_t totalEncodedBodyLength, - int64_t totalDecodedBodyLength, - bool should_report_corb_blocking) override { + int64_t totalDecodedBodyLength) override { EXPECT_TRUE(loader_); EXPECT_TRUE(did_receive_response_); EXPECT_FALSE(did_finish_);
diff --git a/third_party/blink/renderer/platform/testing/url_loader_test_delegate.cc b/third_party/blink/renderer/platform/testing/url_loader_test_delegate.cc index 252dfd93..daeb504 100644 --- a/third_party/blink/renderer/platform/testing/url_loader_test_delegate.cc +++ b/third_party/blink/renderer/platform/testing/url_loader_test_delegate.cc
@@ -47,7 +47,7 @@ int64_t total_decoded_body_length) { original_client->DidFinishLoading(finish_time, total_encoded_data_length, total_encoded_body_length, - total_decoded_body_length, false); + total_decoded_body_length); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc index 104748d..a7bef0c 100644 --- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc +++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
@@ -368,7 +368,7 @@ bool is_web_test) { SetEmulateForcedColors(true); emulated_forced_colors_provider_ = - is_web_test ? ui::CreateEmulatedForcedColorsColorProviderForWebTests() + is_web_test ? ui::CreateEmulatedForcedColorsColorProviderForTest() : ui::CreateEmulatedForcedColorsColorProvider(is_dark_theme); }
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 2653ac6..e573813 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -916,7 +916,6 @@ crbug.com/886566 [ Linux ] http/tests/csspaint/invalidation-content-image.html [ Slow ] crbug.com/886566 [ Mac11 Release ] http/tests/csspaint/invalidation-content-image.html [ Slow ] crbug.com/886566 [ Mac12 ] http/tests/csspaint/invalidation-content-image.html [ Slow ] -crbug.com/886566 [ Mac12-arm64 Release ] http/tests/csspaint/invalidation-content-image.html [ Slow ] crbug.com/886566 [ Release Win ] http/tests/csspaint/invalidation-content-image.html [ Slow ] crbug.com/907412 [ Linux ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ] crbug.com/907412 [ Mac11 Release ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 4c3d992..abad7d0 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -162,7 +162,6 @@ # ====== Timed HTML parser budget tests to here ======================== -crbug.com/1197502 [ Win ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass ] # ====== Site Isolation failures from here ====== # See also third_party/blink/web_tests/virtual/not-site-per-process/README.md @@ -2737,9 +2736,7 @@ crbug.com/626703 external/wpt/css/css-backgrounds/border-image-image-type-001.htm [ Failure ] crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-001.htm [ Failure ] crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ] -crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ] crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure Timeout ] -crbug.com/626703 [ Mac11 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ] crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ] crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ] crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure Timeout ] @@ -2829,7 +2826,6 @@ crbug.com/626703 external/wpt/workers/modules/dedicated-worker-options-credentials.html [ Skip Timeout ] crbug.com/626703 external/wpt/workers/modules/shared-worker-options-credentials.html [ Skip Timeout ] crbug.com/626703 [ Mac10.15 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/anchor-focus.https.html [ Timeout ] -crbug.com/626703 [ Mac10.15 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/metadata/window-open.https.sub.html [ Timeout ] crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/reading-autoincrement-indexes.any.worker.html [ Timeout ] crbug.com/626703 [ Mac10.15 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/scroll-timelines/layout-changes-on-percentage-based-timeline.html [ Timeout ] crbug.com/626703 [ Mac10.15 ] virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/new-content-captures-clip-path.html [ Timeout ] @@ -3763,7 +3759,8 @@ crbug.com/757165 [ Win ] fast/spatial-navigation/snav-imagemap-overlapped-areas.html [ Crash Failure Pass Timeout ] crbug.com/757165 [ Win ] fast/spatial-navigation/snav-imagemap-simple.html [ Crash Failure Pass Timeout ] crbug.com/757165 [ Win ] fast/spatial-navigation/snav-input.html [ Crash Failure Pass Timeout ] -crbug.com/757165 [ Win ] fast/spatial-navigation/snav-multiple-select.html [ Crash Failure Pass Timeout ] +crbug.com/757165 [ Win10.20h2 ] fast/spatial-navigation/snav-multiple-select.html [ Crash Failure Pass Timeout ] +crbug.com/757165 [ Win11 ] fast/spatial-navigation/snav-multiple-select.html [ Crash Failure Pass Timeout ] crbug.com/757165 [ Win ] fast/spatial-navigation/snav-not-below.html [ Crash Failure Pass Timeout ] crbug.com/757165 [ Win ] fast/spatial-navigation/snav-not-rightof.html [ Crash Failure Pass Timeout ] crbug.com/757165 [ Win ] fast/spatial-navigation/snav-overlapping-elements.html [ Crash Failure Pass Timeout ] @@ -4954,7 +4951,6 @@ # Sheriff 2021-07-22 crbug.com/1231596 [ Mac10.15 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] -crbug.com/1231596 [ Mac11-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] crbug.com/1231596 [ Mac12 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] crbug.com/1231596 [ Mac12-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cues-sorted-before-dispatch.html [ Failure Pass ] crbug.com/1231989 [ Linux ] external/wpt/html/cross-origin-embedder-policy/shared-workers.https.html [ Failure Pass ] @@ -6768,7 +6764,7 @@ crbug.com/1486105 animations/responsive/zoom-responsive-transform-animation-003.html [ Failure Pass ] # Gardener 2023-09-28 -crbug.com/1486131 [ Linux ] external/wpt/html/browsers/history/the-history-interface/005.html [ Failure Pass ] +crbug.com/1486131 [ Debug Linux ] external/wpt/html/browsers/history/the-history-interface/005.html [ Failure Pass ] # The following tests should fail with third-party cookie not blocked. external/wpt/cookies/third-party-cookies/third-party-cookies.tentative.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index e86e8924..0920b80 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -2116,7 +2116,8 @@ "exclusive_tests": "ALL", "args": ["--enable-features=JavaScriptExperimentalSharedMemory", "--disable-threaded-compositing", "--disable-threaded-animation"], - "expires": "Jul 1, 2023" + "owners": ["syg@chromium.org"], + "expires": "Jul 1, 2025" }, { "prefix": "fedcm-login-status", @@ -2504,7 +2505,7 @@ "exclusive_tests": "ALL", "args": ["--enable-features=CookieDeprecationFacilitatedTesting:label/label_test", "--disable-threaded-compositing", "--disable-threaded-animation"], - "expires": "Dec 31, 2023" + "expires": "June 30, 2024" }, { "prefix": "saa-beyond-cookies-disabled",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/resources/user-scroll-common.js b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/resources/user-scroll-common.js index 2ccfb102..6587aeb 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/resources/user-scroll-common.js +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/resources/user-scroll-common.js
@@ -7,11 +7,11 @@ function snap_event_touch_scroll_helper(start_pos, end_pos) { return new test_driver.Actions() .addPointer("TestPointer", "touch") - .pointerMove(start_pos.x, start_pos.y) + .pointerMove(Math.round(start_pos.x), Math.round(start_pos.y)) .pointerDown() .addTick() .pause(200) - .pointerMove(end_pos.x, end_pos.y) + .pointerMove(Math.round(end_pos.x), Math.round(end_pos.y)) .addTick() .pointerUp() .send(); @@ -54,7 +54,8 @@ let snap_event_promise = waitForSnapEvent(listening_element, event_type); // Set the scroll destination to just a little off (0, 0) top so we snap // back to the top box. - await new test_driver.Actions().scroll(0, 0, delta, delta).send(); + await new test_driver.Actions().scroll(0, 0, delta, delta, + { origin: scroller }).send(); let evt = await snap_event_promise; assert_equals(evt, null, "no snap event since scroller is back to top"); assert_equals(scroller.scrollTop, 0, "scroller snaps back to the top");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html index d7cc409..2e33c3c9 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-root-scroll.tentative.html
@@ -111,9 +111,9 @@ evt = await snapchanged_promise; assertSnapEvent(evt, [snap_point_2.id]); - assert_equals(scroller.scrollTop, snap_point_2.offsetTop, + assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1, "scroller snaps to the top of snap_point_2"); - assert_equals(scroller.scrollLeft, snap_point_2.offsetLeft, + assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1, "scroller snaps to the left of snap_point_2"); }, "snapchanged is not fired if snap target doesn't change on " + "programmatic scroll");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html index eebe057..6082e090 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-programmatic-scroll.tentative.html
@@ -116,9 +116,9 @@ evt = await snapchanged_promise; assertSnapEvent(evt, [snap_point_2.id]); - assert_equals(scroller.scrollTop, snap_point_2.offsetTop, + assert_approx_equals(scroller.scrollTop, snap_point_2.offsetTop, 1, "scroller snaps to the top of snap_point_2"); - assert_equals(scroller.scrollLeft, snap_point_2.offsetLeft, + assert_approx_equals(scroller.scrollLeft, snap_point_2.offsetLeft, 1, "scroller snaps to the left of snap_point_2"); }, "snapchanged is not fired if snap target doesn't change on " + "programmatic scroll");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html index a44d71b..29d0239 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-root-scroll.tentative.html
@@ -139,7 +139,26 @@ await test_snap_event(t, test_data, "snapchanging"); }, "scrollbar dragging fires snapchanging."); - // Touch scroll test. + // Keyboard test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + scroller.focus(); + window.test_driver.send_keys(document.documentElement, '\ue015'/*ArrowDown*/); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "keyboard scroll triggers snapchanging."); + + // Touch scroll test: peek at snap_area_2 and then drag back to + // snap_area_1. promise_test(async (t) => { await waitForScrollReset(t, scroller); await waitForCompositorCommit();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html index 569d8de1..2c1f974 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap-2/snapchanging/snapchanging-on-user-scroll.tentative.html
@@ -130,7 +130,26 @@ await test_snap_event(t, test_data, "snapchanging"); }, "scrollbar dragging fires snapchanging."); - // Touch scroll test. + // Keyboard test. + promise_test(async (t) => { + await waitForCompositorCommit(); + const test_data = { + scroller: scroller, + scrolling_function: async () => { + scroller.focus(); + window.test_driver.send_keys(scroller, '\ue015'/*ArrowDown*/); + }, + expected_snap_targets: [snap_area_2.id], + expected_scroll_offsets: { + x: 0, + y: snap_area_2.offsetTop + } + }; + await test_snap_event(t, test_data, "snapchanging"); + }, "keyboard scroll triggers snapchanging."); + + // Touch scroll test: peek at snap_area_2 and then drag back to + // snap_area_1. promise_test(async (t) => { await waitForScrollReset(t, scroller); await waitForCompositorCommit();
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html new file mode 100644 index 0000000..b8ea73c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-align-scrollport-covering-child.html
@@ -0,0 +1,52 @@ +<!doctype html> +<title>CSSOM View - scrollIntoView aligns scrollport-covering child in both inline and block directions.</title> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1497677"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #scroller { + width: 200px; + height: 200px; + background-color: purple; + overflow: hidden; + position: relative; + } + #child { + width: 400px; + height: 400px; + background-color: green; + position: absolute; + left: 0px; + top: 0px; + } +</style> +<div id="scroller"> + <div id="space" style="height:400%; width: 400%"></div> + <div id="child"></div> +</div> +<script> + const scroller = document.getElementById("scroller"); + const child = document.getElementById("child"); + + function test_alignment(alignment, start_offset, expected_offset) { + scroller.scrollTop = start_offset.top; + scroller.scrollLeft = start_offset.left; + + child.scrollIntoView({block: alignment, inline: alignment}); + + assert_equals(scroller.scrollTop, expected_offset.top, + `${alignment} sets top`); + assert_equals(scroller.scrollLeft, expected_offset.left, + `${alignment} sets left`); + } + + test(function() { + // child, being positioned at (0, 0) and having size 400 x 400 covers the + // scrollport at scroll offsets (0,0) and (100, 100). + test_alignment("start", {top: 100, left: 100}, {top: 0, left: 0}); + test_alignment("center", {top: 0, left: 0}, {top: 100, left: 100}); + test_alignment("end", {top: 100, left: 100}, {top: 200, left: 200}); + }, "scrollIntoView scrolls scrollport-covering child in both axes"); +</script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments-expected.txt index e169c76..76a25385 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments-expected.txt
@@ -7,13 +7,13 @@ [expanded] #main { (<style>) /-- overloaded --/ /-- disabled --/ /* color: red; */ - color/* color: red */: /* color: red */ green/* color: red */; + color/* color: red */: /* color: red */ green /* color: red */; /-- overloaded --/ /-- disabled --/ /* color: red; */ [expanded] #main { (<style>) /-- overloaded --/ /-- disabled --/ /* color: red; */ - background /* color: red */: /* color: red */blue/* color: red */; + background /* color: red */: /* color: red */ blue /* color: red */; /-- overloaded --/ /-- disabled --/ /* color: red; */ [expanded]
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments.js index 4127775..33e6c80 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-comments.js
@@ -14,7 +14,7 @@ @media /* color: red */ not /* color: red */print /* color: red */ { /* color: red */ - /* color: red */#main/* color: red */{/* color: red */ background /* color: red */ :/* color: red */blue/* color: red */;/* color: red */ } + /* color: red */#main/* color: red */{/* color: red */ background /* color: red */ :/* color: red */ blue /* color: red */;/* color: red */ } /* color: red */ } @@ -31,7 +31,7 @@ /* color: red */ #main /* color: red */{ - /* color: red */color/* color: red */:/* color: red */ green/* color: red */;/* color: red */ + /* color: red */color/* color: red */:/* color: red */ green /* color: red */;/* color: red */ } /* color: red */ @page /* color: red */:right /* color: red */{/* color: red */
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote-expected.txt index fdb3dfb6..e1c41f2 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote-expected.txt
@@ -2,7 +2,7 @@ [expanded] element.style { () -/-- overloaded --/ color: red'foo; +/-- overloaded --/ color: red ' foo; [expanded] div { (user agent stylesheet)
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js index 05df17f..d5d6ea0 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/parse-declaration-with-quote.js
@@ -10,7 +10,7 @@ `Tests that CSSParser correctly parses declarations with unterminated strings. Blink bug 231127\n`); await TestRunner.showPanel('elements'); await TestRunner.loadHTML(` - <div id="inspected" style="color: red'foo"></div> + <div id="inspected" style="color: red ' foo"></div> `); ElementsTestRunner.selectNodeAndWaitForStyles('inspected', dumpStyles);
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative-expected.txt deleted file mode 100644 index 634b117..0000000 --- a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-root-scroll.tentative-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] snapchanged event fires after snap target changes on touch scroll - promise_test: Unhandled rejection with value: "error: Action action_sequence failed" -[FAIL] snapchanged event fires after snap target changes on scrollbar drag - promise_test: Unhandled rejection with value: "error: Action action_sequence failed" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative-expected.txt b/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative-expected.txt deleted file mode 100644 index 634b117..0000000 --- a/third_party/blink/web_tests/platform/linux-chrome/external/wpt/css/css-scroll-snap-2/snapchanged/snapchanged-on-user-scroll.tentative-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] snapchanged event fires after snap target changes on touch scroll - promise_test: Unhandled rejection with value: "error: Action action_sequence failed" -[FAIL] snapchanged event fires after snap target changes on scrollbar drag - promise_test: Unhandled rejection with value: "error: Action action_sequence failed" -Harness: the test ran to completion. -
diff --git a/third_party/cros-components/src b/third_party/cros-components/src index b7deff8..efb6769 160000 --- a/third_party/cros-components/src +++ b/third_party/cros-components/src
@@ -1 +1 @@ -Subproject commit b7deff896ee3186e7d33a52ddde07da2400de2ad +Subproject commit efb676910c7e96c78bb050ee100e47f4addf23d1
diff --git a/third_party/dawn b/third_party/dawn index 3c117aa..c704dd5 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit 3c117aa551537c3e7cc0f8cbb05d85fe76d466fc +Subproject commit c704dd55195ff489fda18c7ce9f73dfa3be2b48c
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal index 14464a6..b5e2025 160000 --- a/third_party/devtools-frontend-internal +++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@ -Subproject commit 14464a6787e9a358a6acdc532568e6fe3a347344 +Subproject commit b5e20256983e9c53f986d0da955d8e45a4a0be92
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index c7e8227..b1c9757 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit c7e8227f786e657d8f82d6e9f1de859ed60280df +Subproject commit b1c975718f05be94786dce33e6d4442dcfeae6ed
diff --git a/third_party/perfetto b/third_party/perfetto index 870ace2..a448867 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 870ace23995e3eef1682a224b2c60d7d58215a81 +Subproject commit a4488671e30a2c1617b86190860b0dfd1afeb488
diff --git a/third_party/protobuf/proto_library.gni b/third_party/protobuf/proto_library.gni index 50915417..e3fcab2 100644 --- a/third_party/protobuf/proto_library.gni +++ b/third_party/protobuf/proto_library.gni
@@ -77,6 +77,11 @@ # Additional dependencies required before running protoc. # e.g. proto file generating action. # +# proto_data_sources (optional) +# Additional proto sources that will only be used for references +# and will not be compiled. +# This should be used in conjunction with import_dirs. +# # use_protobuf_full (optional) # If adding protobuf library would be required, adds protobuf_full to deps # instead of protobuf_lite. @@ -436,6 +441,10 @@ rel_depfile, ] } + inputs = [] + if (defined(invoker.proto_data_sources)) { + inputs += invoker.proto_data_sources + } if (defined(invoker.import_dirs)) { foreach(path, invoker.import_dirs) { @@ -444,7 +453,7 @@ } # System protoc is not used so it's necessary to build a chromium one. - inputs = [ _protoc_path ] + inputs += [ _protoc_path ] deps = [ _protoc_label ] if (generate_with_plugin) {
diff --git a/third_party/skia b/third_party/skia index 9d220eb..f3401c6 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 9d220ebe40a0e8537f3e37d8ac1fbe4ac4dfa43a +Subproject commit f3401c6186c1371361f8c4042c9a927c1221c29a
diff --git a/third_party/webrtc b/third_party/webrtc index e6df126b..161d2c8 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit e6df126b798c0644010afeaddeb2e13053d8f192 +Subproject commit 161d2c84528ec9eb0c19bfb51024bca54353abc4
diff --git a/tools/binary_size/trybot_commit_size_checker.py b/tools/binary_size/trybot_commit_size_checker.py index e0bcb77..f9e631e5 100755 --- a/tools/binary_size/trybot_commit_size_checker.py +++ b/tools/binary_size/trybot_commit_size_checker.py
@@ -302,6 +302,17 @@ return '{:+,}'.format(number) +# TODO(https://crbug.com/1414410): If missing and file is x32y, return xy; else +# return original filename. Basically allows comparing x_32 targets with x +# targets built under 32bit target_cpu without failing the script due to +# different file names. Remove once migration is complete. +def _UseAlterantiveIfMissing(path): + if not os.path.isfile(path): + parent, name = os.path.split(path) + path = os.path.join(parent, name.replace('32', '', 1)) + return path + + def main(): parser = argparse.ArgumentParser() parser.add_argument('--author', required=True, help='CL author') @@ -356,10 +367,12 @@ size_filename = config['supersize_input_file'] + '.size' before_mapping_paths = [ - before_path_resolver(f) for f in config['mapping_files'] + _UseAlterantiveIfMissing(before_path_resolver(f)) + for f in config['mapping_files'] ] after_mapping_paths = [ - after_path_resolver(f) for f in config['mapping_files'] + _UseAlterantiveIfMissing(after_path_resolver(f)) + for f in config['mapping_files'] ] max_size_increase = _MaxSizeIncrease(args.author, args.review_subject) @@ -369,7 +382,8 @@ logging.info('Creating Supersize diff') supersize_diff_lines, delta_size_info = _CreateSupersizeDiff( - before_path_resolver(size_filename), after_path_resolver(size_filename), + _UseAlterantiveIfMissing(before_path_resolver(size_filename)), + _UseAlterantiveIfMissing(after_path_resolver(size_filename)), args.review_subject, args.review_url) changed_symbols = delta_size_info.raw_symbols.WhereDiffStatusIs(
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 902f91b0..c41da73 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -1826,67 +1826,6 @@ <int value="5" label="Server-Parsed"/> </enum> -<enum name="AuthPolicyErrorType"> - <int value="0" label="Success"/> - <int value="1" label="Unspecified error"/> - <int value="2" label="Unspecified D-Bus error"/> - <int value="3" label="Badly formatted user principal name"/> - <int value="4" label="Auth failed because of bad user name"/> - <int value="5" label="Auth failed because of bad password"/> - <int value="6" label="Auth failed because of expired password"/> - <int value="7" label="Auth failed because of bad realm or network"/> - <int value="8" label="kinit exited with unspecified error"/> - <int value="9" label="net exited with unspecified error"/> - <int value="10" label="smbclient exited with unspecified error"/> - <int value="11" label="authpolicy_parser exited with unknown error"/> - <int value="12" label="Parsing GPOs failed"/> - <int value="13" label="GPO data is bad"/> - <int value="14" label="Some local IO operation failed"/> - <int value="15" label="Machine is not joined to AD domain yet"/> - <int value="16" label="User is not logged in yet"/> - <int value="17" label="Failed to send policy to Session Manager"/> - <int value="18" - label="User doesn't have the right to join machines to the domain"/> - <int value="19" label="General network problem"/> - <int value="20" label="Machine name contains restricted characters"/> - <int value="21" label="Machine name too long"/> - <int value="22" label="User joined maximum number of machines to the domain"/> - <int value="23" - label="kinit or smbclient failed to contact Key Distribution Center"/> - <int value="24" label="Kerberos credentials cache not found"/> - <int value="25" label="Kerberos ticket expired while renewing credentials"/> - <int value="26" label="klist exited with unspecified error"/> - <int value="27" label="kinit failed because of bad machine name."/> - <int value="28" label="New password was rejected during password change."/> - <int value="29" - label="Could not store device policy since install attributes are not - locked yet; stored policy in cache instead."/> - <int value="30" - label="Domain join failed because the computer organizational unit does - not exist."/> - <int value="31" - label="Domain join failed because the computer organizational unit is - invalid."/> - <int value="32" - label="Setting the computer organizational unit failed with - insufficient permissions."/> - <int value="33" - label="Setting the computer organizational unit failed with unspecified - error."/> - <int value="34" - label="Fetching user policy failed because device policy was - unavailable."/> - <int value="35" - label="Domain join failed because the device is already joined."/> - <int value="36" - label="Domain join failed because KDC does not support encryption - types."/> - <int value="37" label="kpasswd exited with unspecified error."/> - <int value="38" - label="Setting computer organizational unit failed with constraint - violation"/> -</enum> - <enum name="AutoclickActionType"> <int value="0" label="Left click"/> <int value="1" label="Right click"/> @@ -22102,11 +22041,13 @@ <int value="4615" label="V8WasmMemory64"/> <int value="4616" label="V8WasmMultiMemory"/> <int value="4617" label="V8WasmGC"/> - <int value="4618" label="ORBBlockWithoutAnyEventHandler"/> - <int value="4619" label="ORBBlockWithOnErrorButWithoutOnLoadEventHandler"/> - <int value="4620" label="ORBBlockWithOnLoadButWithoutOnErrorEventHandler"/> - <int value="4621" label="ORBBlockWithOnLoadAndOnErrorEventHandler"/> - <int value="4622" label="ORBBlockWithAnyEventHandler"/> + <int value="4618" label="OBSOLETE_ORBBlockWithoutAnyEventHandler"/> + <int value="4619" + label="OBSOLETE_ORBBlockWithOnErrorButWithoutOnLoadEventHandler"/> + <int value="4620" + label="OBSOLETE_ORBBlockWithOnLoadButWithoutOnErrorEventHandler"/> + <int value="4621" label="OBSOLETE_ORBBlockWithOnLoadAndOnErrorEventHandler"/> + <int value="4622" label="OBSOLETE_ORBBlockWithAnyEventHandler"/> <int value="4623" label="V8RTCEncodedVideoFrame_SetMetadata_Method"/> <int value="4624" label="V8RTCEncodedVideoFrame_SetTimestamp_Method"/> <int value="4625" label="V8RTCEncodedAudioFrame_SetTimestamp_Method"/> @@ -28958,6 +28899,7 @@ label="SafeBrowsingPasswordProtectionForSignedInUsers:enabled"/> <int value="-1980328793" label="trace-upload-url"/> <int value="-1978625006" label="PcieBillboardNotification:disabled"/> + <int value="-1978116081" label="SeaPen:disabled"/> <int value="-1977496883" label="ViewPasswords:enabled"/> <int value="-1976050618" label="AppDeduplicationService:disabled"/> <int value="-1975970208" label="(Obsolete) TranslateSubFrames:disabled"/> @@ -30708,7 +30650,6 @@ <int value="-1165112418" label="PwaUpdateDialogForName:enabled"/> <int value="-1164940780" label="AutofillParseIBANFields:disabled"/> <int value="-1164858657" label="CrostiniUsbAllowUnsupported:disabled"/> - <int value="-1164578922" label="BookmarksRefresh:enabled"/> <int value="-1163777157" label="ContextualSearchSimplifiedServer:disabled"/> <int value="-1162944097" label="enable-color-correct-rendering"/> <int value="-1162636562" label="ReduceHorizontalFlingVelocity:disabled"/> @@ -31052,7 +30993,6 @@ label="AccessibilitySelectToSpeakPageMigration:disabled"/> <int value="-1000671573" label="TemporaryUnexpireFlagsM80:enabled"/> <int value="-1000279941" label="WebViewXRequestedWithHeaderControl:enabled"/> - <int value="-998970149" label="BookmarksRefresh:disabled"/> <int value="-998731974" label="WinUseBrowserSpellChecker:enabled"/> <int value="-998310305" label="OmniboxContextMenuShowFullUrls:disabled"/> <int value="-998255750" label="ExperimentalKeyboardLockUI:enabled"/> @@ -36046,6 +35986,7 @@ <int value="1373777956" label="disable-threaded-gpu-rasterization"/> <int value="1374350431" label="WebViewEmptyComponentLoaderPolicy:enabled"/> <int value="1375165388" label="LazyFrameLoading:enabled"/> + <int value="1376139800" label="SeaPen:enabled"/> <int value="1376279104" label="TrafficCountersEnabled:enabled"/> <int value="1376437124" label="show-cert-link"/> <int value="1377056573" label="browser-side-navigation:enabled"/> @@ -48666,20 +48607,6 @@ <int value="12" label="Extension Renderer"/> </enum> -<enum name="ShowQueryTilesSegmentationResult"> - <int value="0" label="Uninitialized"/> - <int value="1" label="Dont show Start surface"/> - <int value="2" label="Show Start surface"/> -</enum> - -<enum name="ShowQueryTilesSegmentationResultComparison"> - <int value="0" label="Uninitialized."/> - <int value="1" label="Segmentation enabled and logic enabled."/> - <int value="2" label="Segmentation enabled and logic disabled."/> - <int value="3" label="Segmentation disabled and logic enabled."/> - <int value="4" label="Segmentation disabled and logic disabled."/> -</enum> - <enum name="ShutdownReason"> <summary> The reason that the Chrome OS power manager shut down or rebooted the
diff --git a/tools/metrics/histograms/histograms_index.txt b/tools/metrics/histograms/histograms_index.txt index 7d00183f..397ccf3 100644 --- a/tools/metrics/histograms/histograms_index.txt +++ b/tools/metrics/histograms/histograms_index.txt
@@ -14,7 +14,6 @@ tools/metrics/histograms/metadata/ash_user_education/enums.xml tools/metrics/histograms/metadata/ash_user_education/histograms.xml tools/metrics/histograms/metadata/assistant/histograms.xml -tools/metrics/histograms/metadata/auth/histograms.xml tools/metrics/histograms/metadata/auto/histograms.xml tools/metrics/histograms/metadata/autofill/histograms.xml tools/metrics/histograms/metadata/background/histograms.xml
diff --git a/tools/metrics/histograms/metadata/auth/histograms.xml b/tools/metrics/histograms/metadata/auth/histograms.xml deleted file mode 100644 index 3cafdd0..0000000 --- a/tools/metrics/histograms/metadata/auth/histograms.xml +++ /dev/null
@@ -1,316 +0,0 @@ -<!-- -Copyright 2020 The Chromium Authors -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<!-- -This file is used to generate a comprehensive list of Auth histograms along -with a detailed description for each histogram. - -For best practices on writing histogram descriptions, see -https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md - -Please follow the instructions in the OWNERS file in this directory to find a -reviewer. If no OWNERS file exists, please consider signing up at -go/reviewing-metrics (Googlers only), as all subdirectories are expected to -have an OWNERS file. As a last resort you can send the CL to -chromium-metrics-reviews@google.com. ---> - -<histogram-configuration> - -<histograms> - -<histogram name="AuthPolicy.ErrorTypeOfAuthenticateUser" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result from an attempt to authenticate a user to an Active Directory domain. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfAutoMachinePasswordChange" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary>Result from automatic background machine password renewal.</summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfAutoTgtRenewal" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result from automatic background ticket-granting-ticket renewal. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfGetUserKerberosFiles" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result of an attempt to get an Active Directory user's Kerberos - ticket-granting-ticket and configuration data. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfGetUserStatus" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result of an attempt to get the status of an Active Directory user's - Kerberos ticket, password and account. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfJoinADDomain" enum="AuthPolicyErrorType" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result from an attempt to join a machine to an Active Directory domain. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfRefreshDevicePolicy" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result from an attempt to fetch device policy from an Active Directory - domain and store it on disk. - </summary> -</histogram> - -<histogram name="AuthPolicy.ErrorTypeOfRefreshUserPolicy" - enum="AuthPolicyErrorType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Result from an attempt to fetch user policy from an Active Directory domain - and store it on disk. - </summary> -</histogram> - -<histogram name="AuthPolicy.FailedTriesOfKinit" units="units" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Number of times 'kinit' failed until the next try succeeded or the method - gave up because a maximum number of tries was exceeded. 'kinit' is run for - Active Directory enrolled devices during user authentication and device - policy fetch. - </summary> -</histogram> - -<histogram name="AuthPolicy.FailedTriesOfSmbClient" units="units" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Number of times 'smbclient' failed until it the next try succeeded or the - method gave up because a maximum number of tries was exceeded. 'smbclient' - is run for Active Directory enrolled devices during policy fetch. - </summary> -</histogram> - -<histogram name="AuthPolicy.KerberosEncryptionTypes.AuthenticateUser" - enum="KerberosEncryptionTypes" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - The Kerberos encryption types used while succesfully authenticating an user. - This value comes from the DeviceKerberosEncryptionTypes policy. - </summary> -</histogram> - -<histogram name="AuthPolicy.KerberosEncryptionTypes.JoinADDomain" - enum="KerberosEncryptionTypes" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - The Kerberos encryption types used while succesfully joining an Active - Directory domain. This value comes from the advanced settings of the - domainjoin screen. - </summary> -</histogram> - -<histogram name="AuthPolicy.NumGposToDownload" units="units" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Number of group policy objects attached to a specific user or machine on an - Active Directory domain. This value is recorded when user or device policy - is fetched from an Active Directory server. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToAuthenticateUser" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to authenticate a user to an Active Directory domain. - The value is recorded no matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to get the Kerberos ticket-granting-ticket and - configuration data of an Active Directory user. The value is recorded no - matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToGetUserStatus" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to get status information of an Active Directory user. - The value is recorded no matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToJoinADDomain" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to join a machine to an Active Directory domain. Domain - join is part of the Active Directory enrollment process. The value is - recorded no matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRefreshDevicePolicy" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to fetch device policy from an Active Directory domain - and store it on disk. The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRefreshUserPolicy" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to fetch user policy from an Active Directory domain - and store it on disk. The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunKinit" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'kinit' (request Kerberos ticket-granting- - ticket). TGTs are requested regularly for accessing services on Active - Directory domains. The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunKlist" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'klist' (print Kerberos ticket-granting-ticket - information). The command reveals a TGT's lifetime, which is used to - determine TGT status in GetUserStatus() called periodically by Chrome. The - value is recorded no matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunKpasswd" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'kpasswd' (change Active Directory password). - The command is used to change the machine account password. By default, it - is run every 30 days by the AuthPolicy daemon. The value is recorded no - matter if the operation was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunNetAdsGpo" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'net ads gpo list' (list Active Directory group - policy objects). The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunNetAdsInfo" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'net ads info' (query Active Directory - information). The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunNetAdsJoin" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'net ads join' (join machine to an Active - Directory domain). The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunNetAdsSearch" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'net ads search' (query information about an - Active Directory account). The value is recorded no matter if the operation - was successful or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunNetAdsWorkgroup" units="ms" - expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'net ads workgroup' (query Active Directory - workgroup). The value is recorded no matter if the operation was successful - or not. - </summary> -</histogram> - -<histogram name="AuthPolicy.TimeToRunSmbclient" units="ms" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - Time in milliseconds to call 'smbclient' (download policy from an Active - Directory domain). The value is recorded no matter if the operation was - successful or not. - </summary> -</histogram> - -</histograms> - -</histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml index 4a0e805c..a268a63 100644 --- a/tools/metrics/histograms/metadata/enterprise/enums.xml +++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -26,17 +26,6 @@ <enums> -<enum name="ActiveDirectoryDomainJoinType"> - <summary> - This list corresponds to the ways device could be joined to the Active - Directory domain. - </summary> - <int value="0" label="Joined without streamline configuration"/> - <int value="1" - label="Had streamline configuration set but did not unlock it"/> - <int value="2" label="Joined using streamline configuration"/> -</enum> - <enum name="BooleanWarned"> <int value="0" label="Not Warned"/> <int value="1" label="Warned"/>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index c317a6b3..ad5da17 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -147,16 +147,6 @@ </summary> </histogram> -<histogram name="Enterprise.ActiveDirectoryJoin" - enum="ActiveDirectoryDomainJoinType" expires_after="M119"> - <owner>fsandrade@chromium.org</owner> - <owner>src/chrome/browser/ash/authpolicy/OWNERS</owner> - <summary> - The way device is joined to the Active Directory domain. This will be - recorded during successful enterprise enrollment and domain join. - </summary> -</histogram> - <histogram name="Enterprise.AttributesTPMConsistency" enum="EnterpriseAttributesTPMConsistencyType" expires_after="never"> <!-- expires-never: Needed for health check. -->
diff --git a/tools/metrics/histograms/metadata/ios/enums.xml b/tools/metrics/histograms/metadata/ios/enums.xml index a6599dd9..3f92a0ca 100644 --- a/tools/metrics/histograms/metadata/ios/enums.xml +++ b/tools/metrics/histograms/metadata/ios/enums.xml
@@ -508,6 +508,26 @@ <int value="2" label="Camera and Microphone permissions"/> </enum> +<enum name="IOSPhotosServiceUploadFailureType"> + <int value="0" label="None"/> + <int value="1" label="The service is already uploading."/> + <int value="10" label="Failure occurred while retrieving an existing album."/> + <int value="20" label="Failure occurred while creating a new album."/> + <int value="30" + label="Failure occurred during the first step of uploading a photo."/> + <int value="31" + label="Failure occurred during the first step of uploading a photo (no + data in response)."/> + <int value="32" + label="Failure occurred during the first step of uploading a photo + (response is not text)."/> + <int value="33" + label="Failure occurred during the first step of uploading a photo + (token could not be decoded)."/> + <int value="40" + label="Failure occurred during the second step of uploading a photo."/> +</enum> + <enum name="IOSPostRestoreDefaultBrowserActionOnPrompt"> <int value="0" label="No Thanks"/> <int value="1" label="Go To Settings"/>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index 9322572..52cb6fa 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -2921,6 +2921,16 @@ </summary> </histogram> +<histogram name="IOS.SaveToPhotos.UploadFailureType" + enum="IOSPhotosServiceUploadFailureType" expires_after="2024-06-02"> + <owner>qpubert@chromium.org</owner> + <owner>djean@chromium.org</owner> + <summary> + Logged when the Photos service completes an image upload with failure. It + records the type of failure which occurred. + </summary> +</histogram> + <histogram name="IOS.SaveToPhotos.UploadSuccessLatency" units="ms" expires_after="2024-06-02"> <owner>qpubert@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index 10cda7b1..85768a1 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -464,7 +464,7 @@ </histogram> <histogram name="OOBE.ConsumerUpdateScreen.UpdateTime.{ConsumerUpdateType}" - units="ms" expires_after="2023-12-31"> + units="ms" expires_after="2024-05-12"> <owner>osamafathy@google.com</owner> <owner>cros-oobe@google.com</owner> <summary> @@ -475,7 +475,7 @@ </histogram> <histogram name="OOBE.DrivePinning.Enabled" enum="BooleanEnabled" - expires_after="2023-12-31"> + expires_after="2024-05-12"> <owner>osamafathy@google.com</owner> <owner>cros-oobe@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 3902f03..e48ba683 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -202,7 +202,7 @@ </histogram> <histogram name="KeyboardAccessory.DisabledSavingAccessoryImpressions" - enum="BooleanShown" expires_after="2024-01-07"> + enum="BooleanShown" expires_after="2024-04-07"> <owner>ioanap@chromium.org</owner> <owner>fhorschig@chromium.org</owner> <summary> @@ -1321,7 +1321,7 @@ </histogram> <histogram name="PasswordManager.ErrorMessageDisplayReason" - enum="PasswordStoreBackendErrorType" expires_after="2023-12-24"> + enum="PasswordStoreBackendErrorType" expires_after="2024-04-28"> <owner>izuzic@google.com</owner> <owner>ioanap@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml index 46503c6..8880d220 100644 --- a/tools/metrics/histograms/metadata/search/histograms.xml +++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -870,33 +870,6 @@ </summary> </histogram> -<histogram name="Search.QueryTiles.ShowQueryTilesSegmentationResult" - enum="ShowQueryTilesSegmentationResult" expires_after="2023-08-31"> - <owner>haileywang@chromium.org</owner> - <owner>ssid@chromium.org</owner> - <summary> - Records the result from segmentation platform that determines whether or not - to show Query Tiles on NTP. When segmentation model is finch enabled, this - is recorded every time the user navigates to NTP and the current Query Tiles - decision is inexistant or expired. For cases where segmentation model is not - finch enabled see ShowQueryTilesSegmentationResultComparison. - </summary> -</histogram> - -<histogram name="Search.QueryTiles.ShowQueryTilesSegmentationResultComparison" - enum="ShowQueryTilesSegmentationResultComparison" - expires_after="2023-10-22"> - <owner>haileywang@chromium.org</owner> - <owner>ssid@chromium.org</owner> - <summary> - Records the comparison of result from segmentation model and code logic for - when to show Query Tiles on NTP. When segmentation model is not finch - enabled, this is recorded every time the user navigates to NTP and the - current Query Tiles decision is inexistant or expired. For cases where - segmentation model is finch enabled see ShowQueryTilesSegmentationResult. - </summary> -</histogram> - <histogram base="true" name="Search.QueryTiles.Tile.Clicked" units="index" expires_after="2023-08-31"> <!-- Name completed by histogram_suffixes name="TileUiSurface" -->
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml index 97915c6a..1899ec4 100644 --- a/tools/metrics/histograms/metadata/sync/enums.xml +++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -828,6 +828,8 @@ <int value="3" label="Don't migrate, Sync-the-feature status undefined"/> <int value="4" label="Don't migrate, Sync-the-feature status initializing"/> <int value="5" label="Don't migrate, migration feature flag disabled"/> + <int value="6" label="Undo the migration"/> + <int value="7" label="Don't undo: already completed or not necessary"/> </enum> <enum name="SyncToSigninMigrationReadingListStep">
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml index 33d4209..0563c1f 100644 --- a/tools/metrics/histograms/metadata/tab/histograms.xml +++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -1170,7 +1170,7 @@ </histogram> <histogram name="Tabs.PersistedTabData.Storage.Restore.File" - enum="BooleanSuccess" expires_after="2024-01-21"> + enum="BooleanSuccess" expires_after="2024-12-10"> <owner>yusufo@chromium.org</owner> <owner>nyquist@chromium.org</owner> <owner>dtrainor@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ukm/histograms.xml b/tools/metrics/histograms/metadata/ukm/histograms.xml index 9541c31e..074239e 100644 --- a/tools/metrics/histograms/metadata/ukm/histograms.xml +++ b/tools/metrics/histograms/metadata/ukm/histograms.xml
@@ -44,19 +44,6 @@ </summary> </histogram> -<histogram name="UKM.ConsentObserver.AllowedForAllProfiles" enum="Boolean" - expires_after="2020-08-30"> - <owner>rkaplow@chromium.org</owner> - <owner>chrome-metrics-team@google.com</owner> - <summary> - Logged in UpdateUkmAllowedForAllProfiles from the UkmConsentStateObserver - which is called when UkmConsentStateObserver starts observing a new profile - and every time a URL-keyed anonymized data collection state changes or a - sync service state changes. This records whether UKM is allowed for all - profiles. - </summary> -</histogram> - <histogram name="UKM.ConsentObserver.AppSyncConsentChanged" enum="Boolean" expires_after="2024-04-28"> <owner>andrewbregger@google.com</owner> @@ -367,16 +354,6 @@ </summary> </histogram> -<histogram name="UKM.UserDemographics.Status" enum="UserDemographicsStatus" - expires_after="2020-07-01"> - <owner>vincb@google.com</owner> - <owner>chrome-metrics-team@google.com</owner> - <summary> - The status of the retrieval of user demographics from sync that are reported - to UKM. Emitted each time UKM metrics are reported. - </summary> -</histogram> - </histograms> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml index fba33ed..e8d1b3e 100644 --- a/tools/metrics/histograms/metadata/variations/histograms.xml +++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -573,6 +573,24 @@ </summary> </histogram> +<histogram name="Variations.SeedFreshnessDiff" units="minutes" + expires_after="2024-03-03"> + <owner>dogancanemek@chromium.org</owner> + <owner>src/android_webview/OWNERS</owner> + <summary> + Logs the difference between the age of the seed (Seed Freshness) and the + app's copy of the seed (App Seed Freshness). Seed Freshness is recorded when + seed is loaded for both regular and safe seeds and AppSeed Freshness is + recorded every time the browser process initializes. SeedFreshnessDiff is + recorded at the latter of these two events. In the case when a user's clock + is set incorrectly, or when a user changes their clock backwards in between + Chrome runs, the difference between the seed freshness and the app seed + freshness will be calculated and cached as long as both of them are greater + than 0. Nothing is emitted to this histogram if either seed freshness or app + seed freshness is zero or negative. + </summary> +</histogram> + <histogram name="Variations.SeedLoadBlockingTime" units="ms" expires_after="2024-11-01"> <owner>ntfschr@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 8aaa827..e2779fd 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/linux-arm64/trace_processor_shell" }, "win": { - "hash": "46bfbace5a9158cf4350ee7318d338521316de61", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/870ace23995e3eef1682a224b2c60d7d58215a81/trace_processor_shell.exe" + "hash": "878658fa2c3822b26fe52327f592dd1e3435d332", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d476409e3020ebc12df21611ba941b512b3af426/trace_processor_shell.exe" }, "linux_arm": { "hash": "8aa911491cd365131216862ae495e18424ebe1b2", "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/linux-arm/trace_processor_shell" }, "mac": { - "hash": "2b20b3157c6b8bb90accf23384a41e4d54edc6d1", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/870ace23995e3eef1682a224b2c60d7d58215a81/trace_processor_shell" + "hash": "e07d1b732b3aa2576fd611e8a3c04ece9864424e", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/f79d967eab604a7a05447cd2ebc551819877eccf/trace_processor_shell" }, "mac_arm64": { "hash": "28d38c5eef93cf965ad3b3c656d4419f8e55f864", "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "70eeb2448f9b8a8778b07db2dfc86b3ebf649bc0", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/870ace23995e3eef1682a224b2c60d7d58215a81/trace_processor_shell" + "hash": "739ac95f3e6cc3990ef3eb9bc05c05aac7ea77cf", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/f79d967eab604a7a05447cd2ebc551819877eccf/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/whats_new/upload_whats_new_features.py b/tools/whats_new/upload_whats_new_features.py index 54e9245..d8cc421 100755 --- a/tools/whats_new/upload_whats_new_features.py +++ b/tools/whats_new/upload_whats_new_features.py
@@ -78,7 +78,8 @@ start = time.time() command_git = [ 'git', 'cl', 'upload', '--bypass-hooks', '--bypass-watchlists', - '--force', '--message', message, '--cq-dry-run', '--auto-submit' + '--force', '--message', message, '--cq-dry-run', '--auto-submit', + '-o', 'uploadvalidator~skip' ] subprocess.run(command_git, check=True) end = time.time() @@ -137,6 +138,7 @@ whats_new_util.CleanUpFeaturesPlist() features_name = [] for index, feature_row in pd.DataFrame(xlsx_content).iterrows(): + feature_row.fillna('', inplace=True) _AddFeature(index, feature_row, milestone_folder_absolute_path) features_name.append(feature_row['Feature name'])
diff --git a/tools/whats_new/whats_new_util.py b/tools/whats_new/whats_new_util.py index 1daf9d1..eaf613b 100644 --- a/tools/whats_new/whats_new_util.py +++ b/tools/whats_new/whats_new_util.py
@@ -164,6 +164,7 @@ DEST_DIR = os.path.join( BASE_DIR, '../ios/chrome/browser/ui/whats_new/data_source/resources', milestone) + os.makedirs(DEST_DIR, exist_ok=True) darkmode_src_file = os.path.join(path_to_milestone_folder, feature_name, animation_name_darkmode) new_darkmode_dst_file = os.path.join(DEST_DIR,
diff --git a/ui/base/models/dialog_model.cc b/ui/base/models/dialog_model.cc index 5e5c3eb..0ef7747 100644 --- a/ui/base/models/dialog_model.cc +++ b/ui/base/models/dialog_model.cc
@@ -122,9 +122,7 @@ DialogModel::DialogModel(base::PassKey<Builder>, std::unique_ptr<DialogModelDelegate> delegate) - : delegate_(std::move(delegate)), - contents_(base::BindRepeating(&DialogModel::OnFieldAdded, - base::Unretained(this))) { + : delegate_(std::move(delegate)) { if (delegate_) delegate_->set_dialog_model(this); } @@ -247,10 +245,4 @@ } } -void DialogModel::OnFieldAdded(DialogModelField* field) { - CHECK(field); - if (host_) - host_->OnFieldAdded(field); -} - } // namespace ui
diff --git a/ui/base/models/dialog_model.h b/ui/base/models/dialog_model.h index d7e41fe..b053674 100644 --- a/ui/base/models/dialog_model.h +++ b/ui/base/models/dialog_model.h
@@ -493,6 +493,8 @@ return close_on_deactivate_; } + DialogModelSection* contents() { return &contents_; } + // TODO(pbos): Replace this with a section() or something. const std::vector<std::unique_ptr<DialogModelField>>& fields( base::PassKey<DialogModelHost>) { @@ -500,8 +502,6 @@ } private: - void OnFieldAdded(DialogModelField* field); - // Runs the appropriate variant of the provided ButtonCallbackVariant and // returns whether the dialog should close as a result. static bool RunDialogModelButtonCallback(
diff --git a/ui/base/models/dialog_model_field.cc b/ui/base/models/dialog_model_field.cc index bdd1995..e7a3de3 100644 --- a/ui/base/models/dialog_model_field.cc +++ b/ui/base/models/dialog_model_field.cc
@@ -383,18 +383,19 @@ DialogModelCustomField::~DialogModelCustomField() = default; -DialogModelSection::DialogModelSection( - base::RepeatingCallback<void(DialogModelField*)> on_field_added) +DialogModelSection::DialogModelSection() : DialogModelField(kSection, ElementIdentifier(), {}, - DialogModelField::Params()), - on_field_added_(on_field_added) { - CHECK(on_field_added_); -} + DialogModelField::Params()) {} DialogModelSection::~DialogModelSection() = default; +base::CallbackListSubscription DialogModelSection::AddOnFieldAddedCallback( + base::RepeatingCallback<void(DialogModelField*)> on_field_added) { + return on_field_added_.Add(std::move(on_field_added)); +} + void DialogModelSection::AddParagraph(const DialogModelLabel& label, std::u16string header, ElementIdentifier id) { @@ -453,7 +454,7 @@ CHECK_NE(field->type(), DialogModelField::kSection); auto* const field_ptr = field.get(); fields_.push_back(std::move(field)); - on_field_added_.Run(field_ptr); + on_field_added_.Notify(field_ptr); } } // namespace ui
diff --git a/ui/base/models/dialog_model_field.h b/ui/base/models/dialog_model_field.h index 748de53..4ec19efa 100644 --- a/ui/base/models/dialog_model_field.h +++ b/ui/base/models/dialog_model_field.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/callback_list.h" #include "base/component_export.h" #include "base/containers/flat_set.h" #include "base/functional/callback.h" @@ -603,12 +604,14 @@ // TODO(pbos): Params may make sense here? An optional title should be here? // TODO(pbos): We may also want to add on_field_added as a callback to that // Params struct once it exists. - explicit DialogModelSection( - base::RepeatingCallback<void(DialogModelField*)> on_field_added); + DialogModelSection(); DialogModelSection(const DialogModelSection&) = delete; DialogModelSection& operator=(const DialogModelSection&) = delete; ~DialogModelSection() override; + [[nodiscard]] base::CallbackListSubscription AddOnFieldAddedCallback( + base::RepeatingCallback<void(DialogModelField*)> on_field_added); + const std::vector<std::unique_ptr<DialogModelField>>& fields() const { return fields_; } @@ -658,7 +661,7 @@ private: void AddField(std::unique_ptr<DialogModelField> field); - const base::RepeatingCallback<void(DialogModelField*)> on_field_added_; + base::RepeatingCallbackList<void(DialogModelField*)> on_field_added_; std::vector<std::unique_ptr<DialogModelField>> fields_; };
diff --git a/ui/base/models/dialog_model_host.h b/ui/base/models/dialog_model_host.h index a27fcaf1..15c4731f 100644 --- a/ui/base/models/dialog_model_host.h +++ b/ui/base/models/dialog_model_host.h
@@ -34,7 +34,6 @@ // Called when various parts of the model changes. // TODO(pbos): Break this down to API that says what was added/removed/changed // to not have to reset everything. - virtual void OnFieldAdded(DialogModelField* field) = 0; // Called when some aspect of |field| changes. virtual void OnFieldChanged(DialogModelField* field) = 0;
diff --git a/ui/base/models/dialog_model_menu_model_adapter.cc b/ui/base/models/dialog_model_menu_model_adapter.cc index 642edce9..ed47847 100644 --- a/ui/base/models/dialog_model_menu_model_adapter.cc +++ b/ui/base/models/dialog_model_menu_model_adapter.cc
@@ -20,10 +20,6 @@ NOTREACHED_NORETURN(); } -void DialogModelMenuModelAdapter::OnFieldAdded(DialogModelField* field) { - NOTREACHED_NORETURN(); -} - void DialogModelMenuModelAdapter::OnFieldChanged(DialogModelField* field) { NOTREACHED_NORETURN(); }
diff --git a/ui/base/models/dialog_model_menu_model_adapter.h b/ui/base/models/dialog_model_menu_model_adapter.h index 83dd70d..123dfe9f 100644 --- a/ui/base/models/dialog_model_menu_model_adapter.h +++ b/ui/base/models/dialog_model_menu_model_adapter.h
@@ -23,7 +23,6 @@ // DialogModelHost: void Close() override; - void OnFieldAdded(DialogModelField* field) override; void OnFieldChanged(DialogModelField* field) override; // MenuModel:
diff --git a/ui/base/test/test_dialog_model_host.cc b/ui/base/test/test_dialog_model_host.cc index 62df869f..5e6594a 100644 --- a/ui/base/test/test_dialog_model_host.cc +++ b/ui/base/test/test_dialog_model_host.cc
@@ -98,11 +98,6 @@ NOTREACHED_NORETURN(); } -void TestDialogModelHost::OnFieldAdded(DialogModelField* field) { - // TODO(pbos): Figure out what to do here. :) - NOTREACHED_NORETURN(); -} - void TestDialogModelHost::OnFieldChanged(DialogModelField* field) { NOTREACHED_NORETURN(); }
diff --git a/ui/base/test/test_dialog_model_host.h b/ui/base/test/test_dialog_model_host.h index 03f65a84..d3fb17a1 100644 --- a/ui/base/test/test_dialog_model_host.h +++ b/ui/base/test/test_dialog_model_host.h
@@ -54,7 +54,6 @@ private: // DialogModelHost: void Close() override; - void OnFieldAdded(DialogModelField* field) override; void OnFieldChanged(DialogModelField* field) override; std::unique_ptr<DialogModel> dialog_model_; @@ -62,4 +61,4 @@ } // namespace ui -#endif // UI_BASE_TEST_TEST_DIALOG_MODEL_HOST_H_ \ No newline at end of file +#endif // UI_BASE_TEST_TEST_DIALOG_MODEL_HOST_H_
diff --git a/ui/color/color_provider_utils.cc b/ui/color/color_provider_utils.cc index 1a962fe..05088426 100644 --- a/ui/color/color_provider_utils.cc +++ b/ui/color/color_provider_utils.cc
@@ -405,7 +405,7 @@ return color_provider; } -ColorProvider CreateEmulatedForcedColorsColorProviderForWebTests() { +ColorProvider CreateEmulatedForcedColorsColorProviderForTest() { ColorProvider color_provider; ui::ColorMixer& mixer = color_provider.AddMixer(); @@ -458,6 +458,161 @@ return color_provider; } +ColorProvider COMPONENT_EXPORT(COLOR) + CreateColorProviderForBlinkTests(bool dark_mode) { + ColorProvider color_provider; + ui::ColorMixer& mixer = color_provider.AddMixer(); + + if (dark_mode) { + mixer[kColorWebNativeControlAccent] = {SkColorSetRGB(0x99, 0xC8, 0xFF)}; + mixer[kColorWebNativeControlAccentDisabled] = { + SkColorSetRGB(0x75, 0x75, 0x75)}; + mixer[kColorWebNativeControlAccentHovered] = { + SkColorSetRGB(0xD1, 0xE6, 0xFF)}; + mixer[kColorWebNativeControlAccentPressed] = { + SkColorSetRGB(0x61, 0xA9, 0xFF)}; + mixer[kColorWebNativeControlAutoCompleteBackground] = { + SkColorSetARGB(0x66, 0x46, 0x5a, 0x7E)}; + mixer[kColorWebNativeControlBackground] = {SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlBackgroundDisabled] = { + SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlBorder] = {SkColorSetRGB(0x85, 0x85, 0x85)}; + mixer[kColorWebNativeControlBorderDisabled] = { + SkColorSetRGB(0x62, 0x62, 0x62)}; + mixer[kColorWebNativeControlBorderHovered] = { + SkColorSetRGB(0xAC, 0xAC, 0xAC)}; + mixer[kColorWebNativeControlBorderPressed] = { + SkColorSetRGB(0x6E, 0x6E, 0x6E)}; + mixer[kColorWebNativeControlButtonBorder] = { + SkColorSetRGB(0x6B, 0x6B, 0x6B)}; + mixer[kColorWebNativeControlButtonBorderDisabled] = { + SkColorSetRGB(0x36, 0x36, 0x36)}; + mixer[kColorWebNativeControlButtonBorderHovered] = { + SkColorSetRGB(0x7B, 0x7B, 0x7B)}; + mixer[kColorWebNativeControlButtonBorderPressed] = { + SkColorSetRGB(0x61, 0x61, 0x61)}; + mixer[kColorWebNativeControlButtonFill] = {SkColorSetRGB(0x6B, 0x6B, 0x6B)}; + mixer[kColorWebNativeControlButtonFillDisabled] = { + SkColorSetRGB(0x36, 0x36, 0x36)}; + mixer[kColorWebNativeControlButtonFillHovered] = { + SkColorSetRGB(0x7B, 0x7B, 0x7B)}; + mixer[kColorWebNativeControlButtonFillPressed] = { + SkColorSetRGB(0x61, 0x61, 0x61)}; + mixer[kColorWebNativeControlFill] = {SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlFillDisabled] = { + SkColorSetRGB(0x36, 0x36, 0x36)}; + mixer[kColorWebNativeControlFillHovered] = { + SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlFillPressed] = { + SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlLightenLayer] = { + SkColorSetRGB(0x3B, 0x3B, 0x3B)}; + mixer[kColorWebNativeControlProgressValue] = { + SkColorSetRGB(0x63, 0xAD, 0xE5)}; + mixer[kColorWebNativeControlScrollbarArrowBackgroundHovered] = { + SkColorSetRGB(0x4F, 0x4F, 0x4F)}; + mixer[kColorWebNativeControlScrollbarArrowBackgroundPressed] = { + SkColorSetRGB(0xB1, 0xB1, 0xB1)}; + mixer[kColorWebNativeControlScrollbarArrowForeground] = {SK_ColorWHITE}; + mixer[kColorWebNativeControlScrollbarArrowForegroundPressed] = { + SK_ColorBLACK}; + mixer[kColorWebNativeControlScrollbarCorner] = { + SkColorSetRGB(0x12, 0x12, 0x12)}; + mixer[kColorWebNativeControlScrollbarThumb] = { + SkColorSetA(SK_ColorWHITE, 0x33)}; + mixer[kColorWebNativeControlScrollbarThumbHovered] = { + SkColorSetA(SK_ColorWHITE, 0x4D)}; + mixer[kColorWebNativeControlScrollbarThumbInactive] = {SK_ColorWHITE}; + mixer[kColorWebNativeControlScrollbarThumbPressed] = { + SkColorSetA(SK_ColorWHITE, 0x80)}; + mixer[kColorWebNativeControlScrollbarTrack] = { + SkColorSetRGB(0x42, 0x42, 0x42)}; + mixer[kColorWebNativeControlSlider] = {SkColorSetRGB(0x99, 0xC8, 0xFF)}; + mixer[kColorWebNativeControlSliderDisabled] = { + SkColorSetRGB(0x75, 0x75, 0x75)}; + mixer[kColorWebNativeControlSliderHovered] = { + SkColorSetRGB(0xD1, 0xE6, 0xFF)}; + mixer[kColorWebNativeControlSliderPressed] = { + SkColorSetRGB(0x61, 0xA9, 0xFF)}; + } else { + mixer[kColorWebNativeControlAccent] = {SkColorSetRGB(0x00, 0x75, 0xFF)}; + mixer[kColorWebNativeControlAccentDisabled] = { + SkColorSetARGB(0x4D, 0x76, 0x76, 0x76)}; + mixer[kColorWebNativeControlAccentHovered] = { + SkColorSetRGB(0x00, 0x5C, 0xC8)}; + mixer[kColorWebNativeControlAccentPressed] = { + SkColorSetRGB(0x37, 0x93, 0xFF)}; + mixer[kColorWebNativeControlAutoCompleteBackground] = { + SkColorSetRGB(0xE8, 0xF0, 0xFE)}; + mixer[kColorWebNativeControlBackground] = {SK_ColorWHITE}; + mixer[kColorWebNativeControlBackgroundDisabled] = { + SkColorSetA(SK_ColorWHITE, 0x99)}; + mixer[kColorWebNativeControlBorder] = {SkColorSetRGB(0x76, 0x76, 0x76)}; + mixer[kColorWebNativeControlBorderDisabled] = { + SkColorSetARGB(0x4D, 0x76, 0x76, 0x76)}; + mixer[kColorWebNativeControlBorderHovered] = { + SkColorSetRGB(0x4F, 0x4F, 0x4F)}; + mixer[kColorWebNativeControlBorderPressed] = { + SkColorSetRGB(0x8D, 0x8D, 0x8D)}; + mixer[kColorWebNativeControlButtonBorder] = { + SkColorSetRGB(0x76, 0x76, 0x76)}; + mixer[kColorWebNativeControlButtonBorderDisabled] = { + SkColorSetARGB(0x4D, 0x76, 0x76, 0x76)}; + mixer[kColorWebNativeControlButtonBorderHovered] = { + SkColorSetRGB(0x4F, 0x4F, 0x4F)}; + mixer[kColorWebNativeControlButtonBorderPressed] = { + SkColorSetRGB(0x8D, 0x8D, 0x8D)}; + mixer[kColorWebNativeControlButtonFill] = {SkColorSetRGB(0xEF, 0xEF, 0xEF)}; + mixer[kColorWebNativeControlButtonFillDisabled] = { + SkColorSetARGB(0x4D, 0xEF, 0xEF, 0xEF)}; + mixer[kColorWebNativeControlButtonFillHovered] = { + SkColorSetRGB(0xE5, 0xE5, 0xE5)}; + mixer[kColorWebNativeControlButtonFillPressed] = { + SkColorSetRGB(0xF5, 0xF5, 0xF5)}; + mixer[kColorWebNativeControlFill] = {SkColorSetRGB(0xEF, 0xEF, 0xEF)}; + mixer[kColorWebNativeControlFillDisabled] = { + SkColorSetARGB(0x4D, 0xEF, 0xEF, 0xEF)}; + mixer[kColorWebNativeControlFillHovered] = { + SkColorSetRGB(0xE5, 0xE5, 0xE5)}; + mixer[kColorWebNativeControlFillPressed] = { + SkColorSetRGB(0xF5, 0xF5, 0xF5)}; + mixer[kColorWebNativeControlLightenLayer] = { + SkColorSetARGB(0x33, 0xA9, 0xA9, 0xA9)}; + mixer[kColorWebNativeControlProgressValue] = { + SkColorSetRGB(0x00, 0x75, 0xFF)}; + mixer[kColorWebNativeControlScrollbarArrowBackgroundHovered] = { + SkColorSetRGB(0xD2, 0xD2, 0xD2)}; + mixer[kColorWebNativeControlScrollbarArrowBackgroundPressed] = { + SkColorSetRGB(0x78, 0x78, 0x78)}; + mixer[kColorWebNativeControlScrollbarArrowForeground] = { + SkColorSetRGB(0x50, 0x50, 0x50)}; + mixer[kColorWebNativeControlScrollbarArrowForegroundPressed] = { + SK_ColorWHITE}; + mixer[kColorWebNativeControlScrollbarCorner] = { + SkColorSetRGB(0xDC, 0xDC, 0xDC)}; + mixer[kColorWebNativeControlScrollbarThumb] = { + SkColorSetA(SK_ColorBLACK, 0x33)}; + mixer[kColorWebNativeControlScrollbarThumbHovered] = { + SkColorSetA(SK_ColorBLACK, 0x4D)}; + mixer[kColorWebNativeControlScrollbarThumbInactive] = { + SkColorSetRGB(0xEA, 0xEA, 0xEA)}; + mixer[kColorWebNativeControlScrollbarThumbPressed] = { + SkColorSetA(SK_ColorBLACK, 0x80)}; + mixer[kColorWebNativeControlScrollbarTrack] = { + SkColorSetRGB(0xF1, 0xF1, 0xF1)}; + mixer[kColorWebNativeControlSlider] = {SkColorSetRGB(0x00, 0x75, 0xFF)}; + mixer[kColorWebNativeControlSliderDisabled] = { + SkColorSetRGB(0xCB, 0xCB, 0xCB)}; + mixer[kColorWebNativeControlSliderHovered] = { + SkColorSetRGB(0x00, 0x5C, 0xC8)}; + mixer[kColorWebNativeControlSliderPressed] = { + SkColorSetRGB(0x37, 0x93, 0xFF)}; + } + + color_provider.GenerateColorMap(); + return color_provider; +} + void CompleteScrollbarColorsDefinition(ui::ColorMixer& mixer) { mixer[kColorWebNativeControlScrollbarArrowBackgroundHovered] = { kColorWebNativeControlScrollbarCorner};
diff --git a/ui/color/color_provider_utils.h b/ui/color/color_provider_utils.h index 09c9335..271a356 100644 --- a/ui/color/color_provider_utils.h +++ b/ui/color/color_provider_utils.h
@@ -86,7 +86,13 @@ // function should be updated once the web driver support spec for forced colors // mode is updated. ColorProvider COMPONENT_EXPORT(COLOR) - CreateEmulatedForcedColorsColorProviderForWebTests(); + CreateEmulatedForcedColorsColorProviderForTest(); + +// Creates a color provider for use in blink tests. Some Blink tests do not use +// a renderer process and thus don't use the normal machinery to establish a +// color provider in the renderer. +ColorProvider COMPONENT_EXPORT(COLOR) + CreateColorProviderForBlinkTests(bool dark_mode); // Scrollbars have three main colors. This function completes the // definition of colors for all scrollbar parts in relation to the three main
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc index b9b9cb97..0d1a17a 100644 --- a/ui/views/bubble/bubble_dialog_model_host.cc +++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -355,6 +355,12 @@ : BubbleDialogDelegate(anchor_view, arrow), model_(std::move(model)), contents_view_(SetAndGetContentsView(this, modal_type)), + contents_observation_( + // TODO(pbos): Move this into the ContentsView to make it responsible + // for all of contents. + model_->contents()->AddOnFieldAddedCallback( + base::BindRepeating(&BubbleDialogModelHost::OnFieldAdded, + base::Unretained(this)))), theme_observer_(this, contents_view_) { model_->set_host(GetPassKey(), this);
diff --git a/ui/views/bubble/bubble_dialog_model_host.h b/ui/views/bubble/bubble_dialog_model_host.h index b2f8fef..bc98486 100644 --- a/ui/views/bubble/bubble_dialog_model_host.h +++ b/ui/views/bubble/bubble_dialog_model_host.h
@@ -84,7 +84,6 @@ // ui::DialogModelHost: void Close() override; - void OnFieldAdded(ui::DialogModelField* field) override; void OnFieldChanged(ui::DialogModelField* field) override; private: @@ -144,6 +143,8 @@ raw_ptr<View, DanglingUntriaged> focusable_view = nullptr; }; + void OnFieldAdded(ui::DialogModelField* field); + void OnWindowClosing(); void AddInitialFields(); @@ -191,6 +192,7 @@ std::unique_ptr<ui::DialogModel> model_; const raw_ptr<ContentsView> contents_view_; + const base::CallbackListSubscription contents_observation_; ThemeChangedObserver theme_observer_; std::vector<DialogModelHostField> fields_;
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc index f6d57c5..bee3e8a 100644 --- a/ui/views/controls/label.cc +++ b/ui/views/controls/label.cc
@@ -546,7 +546,7 @@ return full_text_->GetNumLines(); } -std::u16string Label::GetDisplayTextForTesting() { +const std::u16string Label::GetDisplayTextForTesting() const { MaybeBuildDisplayText(); return display_text_ ? display_text_->GetDisplayText() : std::u16string(); }
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 40287418..c51219f 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -274,7 +274,7 @@ void SetCollapseWhenHidden(bool value); // Get the text as displayed to the user, respecting the obscured flag. - std::u16string GetDisplayTextForTesting(); + const std::u16string GetDisplayTextForTesting() const; // Get the text direction, as displayed to the user. base::i18n::TextDirection GetTextDirectionForTesting();
diff --git a/v8 b/v8 index 13b0f9f..f906e925 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 13b0f9f24b88983f07952beb652e1bce97a4deb6 +Subproject commit f906e925e1400ce4f4561ca712db612d13b08ecf